aboutsummaryrefslogtreecommitdiffstats
path: root/src/atsamd/adc.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2019-02-22 07:31:10 -0500
committerKevin O'Connor <kevin@koconnor.net>2019-02-22 08:51:46 -0500
commit37797c812844b499b72d4a7dfffde5c82cdf9145 (patch)
tree2731bd7adbcc11a0d1c0da65dddbd619b20a248d /src/atsamd/adc.c
parent5bc47d9416f7c8b7565a6e27ffd97ad9ad97cade (diff)
downloadkutter-37797c812844b499b72d4a7dfffde5c82cdf9145.tar.gz
kutter-37797c812844b499b72d4a7dfffde5c82cdf9145.tar.xz
kutter-37797c812844b499b72d4a7dfffde5c82cdf9145.zip
atsamd: Add a GET_FUSE() helper macro
Add a helper macro for accessing the non-volatile factory-calibrated "fuse" values. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/atsamd/adc.c')
-rw-r--r--src/atsamd/adc.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/src/atsamd/adc.c b/src/atsamd/adc.c
index 59b12163..1322a46c 100644
--- a/src/atsamd/adc.c
+++ b/src/atsamd/adc.c
@@ -70,12 +70,9 @@ adc_init(void)
// Enable adc clock
enable_pclock(ADC_GCLK_ID, ID_ADC);
// Load calibraiton info
- uint32_t v = *((uint32_t*)ADC_FUSES_BIASCAL_ADDR);
- uint32_t bias = (v & ADC_FUSES_BIASCAL_Msk) >> ADC_FUSES_BIASCAL_Pos;
- v = *((uint32_t*)ADC_FUSES_LINEARITY_0_ADDR);
- uint32_t li0 = (v & ADC_FUSES_LINEARITY_0_Msk) >> ADC_FUSES_LINEARITY_0_Pos;
- v = *((uint32_t*)ADC_FUSES_LINEARITY_1_ADDR);
- uint32_t li5 = (v & ADC_FUSES_LINEARITY_1_Msk) >> ADC_FUSES_LINEARITY_1_Pos;
+ uint32_t bias = GET_FUSE(ADC_FUSES_BIASCAL);
+ uint32_t li0 = GET_FUSE(ADC_FUSES_LINEARITY_0);
+ uint32_t li5 = GET_FUSE(ADC_FUSES_LINEARITY_1);
uint32_t lin = li0 | (li5 << 5);
ADC->CALIB.reg = ADC_CALIB_BIAS_CAL(bias) | ADC_CALIB_LINEARITY_CAL(lin);
@@ -92,22 +89,18 @@ adc_init(void)
// Load calibration info
// ADC0
- uint32_t v = *((uint32_t*)ADC0_FUSES_BIASREFBUF_ADDR);
- uint32_t refbuf = (v & ADC0_FUSES_BIASREFBUF_Msk) >> ADC0_FUSES_BIASREFBUF_Pos;
- v = *((uint32_t*)ADC0_FUSES_BIASR2R_ADDR);
- uint32_t r2r = (v & ADC0_FUSES_BIASR2R_Msk) >> ADC0_FUSES_BIASR2R_Pos;
- v = *((uint32_t*)ADC0_FUSES_BIASCOMP_ADDR);
- uint32_t comp = (v & ADC0_FUSES_BIASCOMP_Msk) >> ADC0_FUSES_BIASCOMP_Pos;
- ADC0->CALIB.reg = ADC0_FUSES_BIASREFBUF(refbuf) | ADC0_FUSES_BIASR2R(r2r) | ADC0_FUSES_BIASCOMP(comp);
+ uint32_t refbuf = GET_FUSE(ADC0_FUSES_BIASREFBUF);
+ uint32_t r2r = GET_FUSE(ADC0_FUSES_BIASR2R);
+ uint32_t comp = GET_FUSE(ADC0_FUSES_BIASCOMP);
+ ADC0->CALIB.reg = (ADC0_FUSES_BIASREFBUF(refbuf)
+ | ADC0_FUSES_BIASR2R(r2r) | ADC0_FUSES_BIASCOMP(comp));
// ADC1
- v = *((uint32_t*)ADC1_FUSES_BIASREFBUF_ADDR);
- refbuf = (v & ADC1_FUSES_BIASREFBUF_Msk) >> ADC1_FUSES_BIASREFBUF_Pos;
- v = *((uint32_t*)ADC1_FUSES_BIASR2R_ADDR);
- r2r = (v & ADC1_FUSES_BIASR2R_Msk) >> ADC1_FUSES_BIASR2R_Pos;
- v = *((uint32_t*)ADC1_FUSES_BIASCOMP_ADDR);
- comp = (v & ADC1_FUSES_BIASCOMP_Msk) >> ADC1_FUSES_BIASCOMP_Pos;
- ADC1->CALIB.reg = ADC1_FUSES_BIASREFBUF(refbuf) | ADC1_FUSES_BIASR2R(r2r) | ADC1_FUSES_BIASCOMP(comp);
+ refbuf = GET_FUSE(ADC1_FUSES_BIASREFBUF);
+ r2r = GET_FUSE(ADC1_FUSES_BIASR2R);
+ comp = GET_FUSE(ADC1_FUSES_BIASCOMP);
+ ADC1->CALIB.reg = (ADC0_FUSES_BIASREFBUF(refbuf)
+ | ADC0_FUSES_BIASR2R(r2r) | ADC0_FUSES_BIASCOMP(comp));
// Setup and enable
// ADC0