diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2019-02-22 07:31:10 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2019-02-22 08:51:46 -0500 |
commit | 37797c812844b499b72d4a7dfffde5c82cdf9145 (patch) | |
tree | 2731bd7adbcc11a0d1c0da65dddbd619b20a248d /src/atsamd/adc.c | |
parent | 5bc47d9416f7c8b7565a6e27ffd97ad9ad97cade (diff) | |
download | kutter-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.c | 33 |
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 |