Lancaster University's (short term!) clone of mbed-src for micro:bit. This is a copy of the github branch https://github.com/lancaster-university/mbed-classic

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Jul 17 09:15:10 2015 +0100
Revision:
592:a274ee790e56
Parent:
579:53297373a894
Synchronized with git revision e7144f83a8d75df80c4877936b6ffe552b0be9e6

Full URL: https://github.com/mbedmicro/mbed/commit/e7144f83a8d75df80c4877936b6ffe552b0be9e6/

More API implementation for SAMR21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 579:53297373a894 1 #include "adc.h"
mbed_official 579:53297373a894 2
mbed_official 579:53297373a894 3 #if SAMD20
mbed_official 579:53297373a894 4 /* The Die revision D number */
mbed_official 579:53297373a894 5 #define REVISON_D_NUM 3
mbed_official 579:53297373a894 6 #endif
mbed_official 579:53297373a894 7
mbed_official 579:53297373a894 8 /**
mbed_official 579:53297373a894 9 * \brief Initializes an ADC configuration structure to defaults
mbed_official 579:53297373a894 10 *
mbed_official 579:53297373a894 11 * Initializes a given ADC configuration struct to a set of known default
mbed_official 579:53297373a894 12 * values. This function should be called on any new instance of the
mbed_official 579:53297373a894 13 * configuration struct before being modified by the user application.
mbed_official 579:53297373a894 14 *
mbed_official 579:53297373a894 15 * The default configuration is as follows:
mbed_official 579:53297373a894 16 * \li GCLK generator 0 (GCLK main) clock source
mbed_official 579:53297373a894 17 * \li 1V from internal bandgap reference
mbed_official 579:53297373a894 18 * \li Div 4 clock prescaler
mbed_official 579:53297373a894 19 * \li 12 bit resolution
mbed_official 579:53297373a894 20 * \li Window monitor disabled
mbed_official 579:53297373a894 21 * \li No gain
mbed_official 579:53297373a894 22 * \li Positive input on ADC PIN 0
mbed_official 579:53297373a894 23 * \li Negative input on ADC PIN 1
mbed_official 579:53297373a894 24 * \li Averaging disabled
mbed_official 579:53297373a894 25 * \li Oversampling disabled
mbed_official 579:53297373a894 26 * \li Right adjust data
mbed_official 579:53297373a894 27 * \li Single-ended mode
mbed_official 579:53297373a894 28 * \li Free running disabled
mbed_official 579:53297373a894 29 * \li All events (input and generation) disabled
mbed_official 579:53297373a894 30 * \li Sleep operation disabled
mbed_official 579:53297373a894 31 * \li No reference compensation
mbed_official 579:53297373a894 32 * \li No gain/offset correction
mbed_official 579:53297373a894 33 * \li No added sampling time
mbed_official 579:53297373a894 34 * \li Pin scan mode disabled
mbed_official 579:53297373a894 35 *
mbed_official 579:53297373a894 36 * \param[out] config Pointer to configuration struct to initialize to
mbed_official 579:53297373a894 37 * default values
mbed_official 579:53297373a894 38 */
mbed_official 579:53297373a894 39 void adc_get_config_defaults(struct adc_config *const config)
mbed_official 579:53297373a894 40 {
mbed_official 579:53297373a894 41 Assert(config);
mbed_official 579:53297373a894 42 config->clock_source = GCLK_GENERATOR_0;
mbed_official 579:53297373a894 43 config->reference = ADC_REFERENCE_INT1V;
mbed_official 579:53297373a894 44 config->clock_prescaler = ADC_CLOCK_PRESCALER_DIV4;
mbed_official 579:53297373a894 45 config->resolution = ADC_RESOLUTION_12BIT;
mbed_official 579:53297373a894 46 config->window.window_mode = ADC_WINDOW_MODE_DISABLE;
mbed_official 579:53297373a894 47 config->window.window_upper_value = 0;
mbed_official 579:53297373a894 48 config->window.window_lower_value = 0;
mbed_official 579:53297373a894 49 config->gain_factor = ADC_GAIN_FACTOR_1X;
mbed_official 579:53297373a894 50 #if SAMR21
mbed_official 579:53297373a894 51 config->positive_input = ADC_POSITIVE_INPUT_PIN6 ;
mbed_official 579:53297373a894 52 #else
mbed_official 579:53297373a894 53 config->positive_input = ADC_POSITIVE_INPUT_PIN0 ;
mbed_official 579:53297373a894 54 #endif
mbed_official 579:53297373a894 55 config->negative_input = ADC_NEGATIVE_INPUT_GND ;
mbed_official 579:53297373a894 56 config->accumulate_samples = ADC_ACCUMULATE_DISABLE;
mbed_official 579:53297373a894 57 config->divide_result = ADC_DIVIDE_RESULT_DISABLE;
mbed_official 579:53297373a894 58 config->left_adjust = false;
mbed_official 579:53297373a894 59 config->differential_mode = false;
mbed_official 579:53297373a894 60 config->freerunning = false;
mbed_official 579:53297373a894 61 config->event_action = ADC_EVENT_ACTION_DISABLED;
mbed_official 579:53297373a894 62 config->run_in_standby = false;
mbed_official 579:53297373a894 63 config->reference_compensation_enable = false;
mbed_official 579:53297373a894 64 config->correction.correction_enable = false;
mbed_official 579:53297373a894 65 config->correction.gain_correction = ADC_GAINCORR_RESETVALUE;
mbed_official 579:53297373a894 66 config->correction.offset_correction = ADC_OFFSETCORR_RESETVALUE;
mbed_official 579:53297373a894 67 config->sample_length = 0;
mbed_official 579:53297373a894 68 config->pin_scan.offset_start_scan = 0;
mbed_official 579:53297373a894 69 config->pin_scan.inputs_to_scan = 0;
mbed_official 579:53297373a894 70 }
mbed_official 579:53297373a894 71
mbed_official 579:53297373a894 72 /**
mbed_official 579:53297373a894 73 * \brief Sets the ADC window mode
mbed_official 579:53297373a894 74 *
mbed_official 579:53297373a894 75 * Sets the ADC window mode to a given mode and value range.
mbed_official 579:53297373a894 76 *
mbed_official 579:53297373a894 77 * \param[in] module_inst Pointer to the ADC software instance struct
mbed_official 579:53297373a894 78 * \param[in] window_mode Window monitor mode to set
mbed_official 579:53297373a894 79 * \param[in] window_lower_value Lower window monitor threshold value
mbed_official 579:53297373a894 80 * \param[in] window_upper_value Upper window monitor threshold value
mbed_official 579:53297373a894 81 */
mbed_official 579:53297373a894 82 void adc_set_window_mode(
mbed_official 579:53297373a894 83 struct adc_module *const module_inst,
mbed_official 579:53297373a894 84 const enum adc_window_mode window_mode,
mbed_official 579:53297373a894 85 const int16_t window_lower_value,
mbed_official 579:53297373a894 86 const int16_t window_upper_value)
mbed_official 579:53297373a894 87 {
mbed_official 579:53297373a894 88 /* Sanity check arguments */
mbed_official 579:53297373a894 89 Assert(module_inst);
mbed_official 579:53297373a894 90 Assert(module_inst->hw);
mbed_official 579:53297373a894 91
mbed_official 579:53297373a894 92 Adc *const adc_module = module_inst->hw;
mbed_official 579:53297373a894 93
mbed_official 579:53297373a894 94 while (adc_is_syncing(module_inst)) {
mbed_official 579:53297373a894 95 /* Wait for synchronization */
mbed_official 579:53297373a894 96 }
mbed_official 579:53297373a894 97
mbed_official 579:53297373a894 98 /* Set window mode */
mbed_official 579:53297373a894 99 adc_module->WINCTRL.reg = window_mode << ADC_WINCTRL_WINMODE_Pos;
mbed_official 579:53297373a894 100
mbed_official 579:53297373a894 101 while (adc_is_syncing(module_inst)) {
mbed_official 579:53297373a894 102 /* Wait for synchronization */
mbed_official 579:53297373a894 103 }
mbed_official 579:53297373a894 104
mbed_official 579:53297373a894 105 /* Set lower window monitor threshold value */
mbed_official 579:53297373a894 106 adc_module->WINLT.reg = window_lower_value << ADC_WINLT_WINLT_Pos;
mbed_official 579:53297373a894 107
mbed_official 579:53297373a894 108 while (adc_is_syncing(module_inst)) {
mbed_official 579:53297373a894 109 /* Wait for synchronization */
mbed_official 579:53297373a894 110 }
mbed_official 579:53297373a894 111
mbed_official 579:53297373a894 112 /* Set upper window monitor threshold value */
mbed_official 579:53297373a894 113 adc_module->WINUT.reg = window_upper_value << ADC_WINUT_WINUT_Pos;
mbed_official 579:53297373a894 114 }
mbed_official 579:53297373a894 115
mbed_official 579:53297373a894 116 /**
mbed_official 579:53297373a894 117 * \internal Configure MUX settings for the analog pins
mbed_official 579:53297373a894 118 *
mbed_official 579:53297373a894 119 * This function will set the given ADC input pins
mbed_official 579:53297373a894 120 * to the analog function in the pinmux, giving
mbed_official 579:53297373a894 121 * the ADC access to the analog signal
mbed_official 579:53297373a894 122 *
mbed_official 579:53297373a894 123 * \param [in] pin AINxx pin to configure
mbed_official 579:53297373a894 124 */
mbed_official 579:53297373a894 125 static inline void _adc_configure_ain_pin(uint32_t pin)
mbed_official 579:53297373a894 126 {
mbed_official 579:53297373a894 127 #define PIN_INVALID_ADC_AIN 0xFFFFUL
mbed_official 579:53297373a894 128
mbed_official 579:53297373a894 129 /* Pinmapping table for AINxx -> GPIO pin number */
mbed_official 579:53297373a894 130 const uint32_t pinmapping[] = {
mbed_official 579:53297373a894 131 #if (SAMD20E | SAMD21E)
mbed_official 579:53297373a894 132 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 579:53297373a894 133 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 134 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 579:53297373a894 135 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 579:53297373a894 136 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 137 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 138 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 139 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 140 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 579:53297373a894 141 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 579:53297373a894 142 #elif (SAMD20G | SAMD21G)
mbed_official 579:53297373a894 143 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 579:53297373a894 144 PIN_PB08B_ADC_AIN2, PIN_PB09B_ADC_AIN3,
mbed_official 579:53297373a894 145 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 579:53297373a894 146 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 579:53297373a894 147 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 148 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 579:53297373a894 149 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 150 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 151 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 579:53297373a894 152 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 579:53297373a894 153 #elif (SAMD20J | SAMD21J)
mbed_official 579:53297373a894 154 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 579:53297373a894 155 PIN_PB08B_ADC_AIN2, PIN_PB09B_ADC_AIN3,
mbed_official 579:53297373a894 156 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 579:53297373a894 157 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 579:53297373a894 158 PIN_PB00B_ADC_AIN8, PIN_PB01B_ADC_AIN9,
mbed_official 579:53297373a894 159 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 579:53297373a894 160 PIN_PB04B_ADC_AIN12, PIN_PB05B_ADC_AIN13,
mbed_official 579:53297373a894 161 PIN_PB06B_ADC_AIN14, PIN_PB07B_ADC_AIN15,
mbed_official 579:53297373a894 162 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 579:53297373a894 163 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 579:53297373a894 164 #elif SAMR21E
mbed_official 579:53297373a894 165 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 166 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 167 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 168 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 579:53297373a894 169 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 170 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 171 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 172 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 173 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 579:53297373a894 174 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 175 #elif SAMR21G
mbed_official 579:53297373a894 176 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 177 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 178 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 579:53297373a894 179 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 579:53297373a894 180 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 181 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 579:53297373a894 182 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 183 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 184 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 579:53297373a894 185 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 186 #elif (SAMD10C | SAMD11C)
mbed_official 579:53297373a894 187 PIN_PA02B_ADC_AIN0, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 188 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 579:53297373a894 189 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 190 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 579:53297373a894 191 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 192 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 193 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 194 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 195 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 196 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 197 #elif (SAMD10DS | SAMD11DS)
mbed_official 579:53297373a894 198 PIN_PA02B_ADC_AIN0, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 199 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 579:53297373a894 200 PIN_PA06B_ADC_AIN4, PIN_PA07B_ADC_AIN5,
mbed_official 579:53297373a894 201 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 579:53297373a894 202 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 203 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 204 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 205 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 206 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 207 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 208 #elif (SAMD10DM | SAMD11DM)
mbed_official 579:53297373a894 209 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 579:53297373a894 210 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 579:53297373a894 211 PIN_PA06B_ADC_AIN4, PIN_PA07B_ADC_AIN5,
mbed_official 579:53297373a894 212 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 579:53297373a894 213 PIN_PA10B_ADC_AIN8, PIN_PA11B_ADC_AIN9,
mbed_official 579:53297373a894 214 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 215 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 216 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 217 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 218 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 579:53297373a894 219 #else
mbed_official 579:53297373a894 220 # error ADC pin mappings are not defined for this device.
mbed_official 579:53297373a894 221 #endif
mbed_official 579:53297373a894 222 };
mbed_official 579:53297373a894 223
mbed_official 579:53297373a894 224 uint32_t pin_map_result = PIN_INVALID_ADC_AIN;
mbed_official 579:53297373a894 225
mbed_official 579:53297373a894 226 if (pin <= ADC_EXTCHANNEL_MSB) {
mbed_official 579:53297373a894 227 pin_map_result = pinmapping[pin >> ADC_INPUTCTRL_MUXPOS_Pos];
mbed_official 579:53297373a894 228
mbed_official 579:53297373a894 229 Assert(pin_map_result != PIN_INVALID_ADC_AIN);
mbed_official 579:53297373a894 230
mbed_official 579:53297373a894 231 struct system_pinmux_config config;
mbed_official 579:53297373a894 232 system_pinmux_get_config_defaults(&config);
mbed_official 579:53297373a894 233
mbed_official 579:53297373a894 234 /* Analog functions are all on MUX setting B */
mbed_official 579:53297373a894 235 config.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
mbed_official 579:53297373a894 236 config.mux_position = 1;
mbed_official 579:53297373a894 237
mbed_official 579:53297373a894 238 system_pinmux_pin_set_config(pin_map_result, &config);
mbed_official 579:53297373a894 239 }
mbed_official 579:53297373a894 240 }
mbed_official 579:53297373a894 241
mbed_official 579:53297373a894 242 /**
mbed_official 579:53297373a894 243 * \internal Writes an ADC configuration to the hardware module
mbed_official 579:53297373a894 244 *
mbed_official 579:53297373a894 245 * Writes out a given ADC module configuration to the hardware module.
mbed_official 579:53297373a894 246 *
mbed_official 579:53297373a894 247 * \param[out] module_inst Pointer to the ADC software instance struct
mbed_official 579:53297373a894 248 * \param[in] config Pointer to configuration struct
mbed_official 579:53297373a894 249 *
mbed_official 579:53297373a894 250 * \return Status of the configuration procedure
mbed_official 579:53297373a894 251 * \retval STATUS_OK The configuration was successful
mbed_official 579:53297373a894 252 * \retval STATUS_ERR_INVALID_ARG Invalid argument(s) were provided
mbed_official 579:53297373a894 253 */
mbed_official 579:53297373a894 254 static enum status_code _adc_set_config(
mbed_official 579:53297373a894 255 struct adc_module *const module_inst,
mbed_official 579:53297373a894 256 struct adc_config *const config)
mbed_official 579:53297373a894 257 {
mbed_official 579:53297373a894 258 uint8_t adjres = 0;
mbed_official 579:53297373a894 259 uint32_t resolution = ADC_RESOLUTION_16BIT;
mbed_official 579:53297373a894 260 enum adc_accumulate_samples accumulate = ADC_ACCUMULATE_DISABLE;
mbed_official 579:53297373a894 261 #if SAMD20
mbed_official 579:53297373a894 262 uint8_t revision_num = ((REG_DSU_DID & DSU_DID_DIE_Msk) >> DSU_DID_DIE_Pos);
mbed_official 579:53297373a894 263 #endif
mbed_official 579:53297373a894 264
mbed_official 579:53297373a894 265 /* Get the hardware module pointer */
mbed_official 579:53297373a894 266 Adc *const adc_module = module_inst->hw;
mbed_official 579:53297373a894 267
mbed_official 579:53297373a894 268 /* Configure GCLK channel and enable clock */
mbed_official 579:53297373a894 269 struct system_gclk_chan_config gclk_chan_conf;
mbed_official 579:53297373a894 270 system_gclk_chan_get_config_defaults(&gclk_chan_conf);
mbed_official 579:53297373a894 271 gclk_chan_conf.source_generator = config->clock_source;
mbed_official 579:53297373a894 272 system_gclk_chan_set_config(ADC_GCLK_ID, &gclk_chan_conf);
mbed_official 579:53297373a894 273 system_gclk_chan_enable(ADC_GCLK_ID);
mbed_official 579:53297373a894 274
mbed_official 579:53297373a894 275 /* Setup pinmuxing for analog inputs */
mbed_official 579:53297373a894 276 if (config->pin_scan.inputs_to_scan != 0) {
mbed_official 579:53297373a894 277 uint8_t offset = config->pin_scan.offset_start_scan;
mbed_official 579:53297373a894 278 uint8_t start_pin =
mbed_official 579:53297373a894 279 offset +(uint8_t)config->positive_input;
mbed_official 579:53297373a894 280 uint8_t end_pin =
mbed_official 579:53297373a894 281 start_pin + config->pin_scan.inputs_to_scan;
mbed_official 579:53297373a894 282
mbed_official 579:53297373a894 283 while (start_pin < end_pin) {
mbed_official 579:53297373a894 284 _adc_configure_ain_pin((offset % 16)+(uint8_t)config->positive_input);
mbed_official 579:53297373a894 285 start_pin++;
mbed_official 579:53297373a894 286 offset++;
mbed_official 579:53297373a894 287 }
mbed_official 579:53297373a894 288 _adc_configure_ain_pin(config->negative_input);
mbed_official 579:53297373a894 289 } else {
mbed_official 579:53297373a894 290 _adc_configure_ain_pin(config->positive_input);
mbed_official 579:53297373a894 291 _adc_configure_ain_pin(config->negative_input);
mbed_official 579:53297373a894 292 }
mbed_official 579:53297373a894 293
mbed_official 579:53297373a894 294 /* Configure run in standby */
mbed_official 579:53297373a894 295 adc_module->CTRLA.reg = (config->run_in_standby << ADC_CTRLA_RUNSTDBY_Pos);
mbed_official 579:53297373a894 296
mbed_official 579:53297373a894 297 /* Configure reference */
mbed_official 579:53297373a894 298 adc_module->REFCTRL.reg =
mbed_official 579:53297373a894 299 (config->reference_compensation_enable << ADC_REFCTRL_REFCOMP_Pos) |
mbed_official 579:53297373a894 300 (config->reference);
mbed_official 579:53297373a894 301
mbed_official 579:53297373a894 302 /* Set adjusting result and number of samples */
mbed_official 579:53297373a894 303 switch (config->resolution) {
mbed_official 579:53297373a894 304
mbed_official 579:53297373a894 305 case ADC_RESOLUTION_CUSTOM:
mbed_official 579:53297373a894 306 adjres = config->divide_result;
mbed_official 579:53297373a894 307 accumulate = config->accumulate_samples;
mbed_official 579:53297373a894 308 /* 16-bit result register */
mbed_official 579:53297373a894 309 resolution = ADC_RESOLUTION_16BIT;
mbed_official 579:53297373a894 310 break;
mbed_official 579:53297373a894 311
mbed_official 579:53297373a894 312 case ADC_RESOLUTION_13BIT:
mbed_official 579:53297373a894 313 /* Increase resolution by 1 bit */
mbed_official 579:53297373a894 314 adjres = ADC_DIVIDE_RESULT_2;
mbed_official 579:53297373a894 315 accumulate = ADC_ACCUMULATE_SAMPLES_4;
mbed_official 579:53297373a894 316 /* 16-bit result register */
mbed_official 579:53297373a894 317 resolution = ADC_RESOLUTION_16BIT;
mbed_official 579:53297373a894 318 break;
mbed_official 579:53297373a894 319
mbed_official 579:53297373a894 320 case ADC_RESOLUTION_14BIT:
mbed_official 579:53297373a894 321 /* Increase resolution by 2 bit */
mbed_official 579:53297373a894 322 adjres = ADC_DIVIDE_RESULT_4;
mbed_official 579:53297373a894 323 accumulate = ADC_ACCUMULATE_SAMPLES_16;
mbed_official 579:53297373a894 324 /* 16-bit result register */
mbed_official 579:53297373a894 325 resolution = ADC_RESOLUTION_16BIT;
mbed_official 579:53297373a894 326 break;
mbed_official 579:53297373a894 327 #if SAMD20
mbed_official 579:53297373a894 328 /* See $35.1.8 for ADC errata of SAM D20.
mbed_official 579:53297373a894 329 The revisions before D have this issue.*/
mbed_official 579:53297373a894 330 case ADC_RESOLUTION_15BIT:
mbed_official 579:53297373a894 331 /* Increase resolution by 3 bit */
mbed_official 579:53297373a894 332 if(revision_num < REVISON_D_NUM) {
mbed_official 579:53297373a894 333 adjres = ADC_DIVIDE_RESULT_8;
mbed_official 579:53297373a894 334 } else {
mbed_official 579:53297373a894 335 adjres = ADC_DIVIDE_RESULT_2;
mbed_official 579:53297373a894 336 }
mbed_official 579:53297373a894 337 accumulate = ADC_ACCUMULATE_SAMPLES_64;
mbed_official 579:53297373a894 338 /* 16-bit result register */
mbed_official 579:53297373a894 339 resolution = ADC_RESOLUTION_16BIT;
mbed_official 579:53297373a894 340 break;
mbed_official 579:53297373a894 341
mbed_official 579:53297373a894 342 case ADC_RESOLUTION_16BIT:
mbed_official 579:53297373a894 343 if(revision_num < REVISON_D_NUM) {
mbed_official 579:53297373a894 344 /* Increase resolution by 4 bit */
mbed_official 579:53297373a894 345 adjres = ADC_DIVIDE_RESULT_16;
mbed_official 579:53297373a894 346 } else {
mbed_official 579:53297373a894 347 adjres = ADC_DIVIDE_RESULT_DISABLE;
mbed_official 579:53297373a894 348 }
mbed_official 579:53297373a894 349 accumulate = ADC_ACCUMULATE_SAMPLES_256;
mbed_official 579:53297373a894 350 /* 16-bit result register */
mbed_official 579:53297373a894 351 resolution = ADC_RESOLUTION_16BIT;
mbed_official 579:53297373a894 352 break;
mbed_official 579:53297373a894 353 #else
mbed_official 579:53297373a894 354 case ADC_RESOLUTION_15BIT:
mbed_official 579:53297373a894 355 /* Increase resolution by 3 bit */
mbed_official 579:53297373a894 356 adjres = ADC_DIVIDE_RESULT_2;
mbed_official 579:53297373a894 357 accumulate = ADC_ACCUMULATE_SAMPLES_64;
mbed_official 579:53297373a894 358 /* 16-bit result register */
mbed_official 579:53297373a894 359 resolution = ADC_RESOLUTION_16BIT;
mbed_official 579:53297373a894 360 break;
mbed_official 579:53297373a894 361
mbed_official 579:53297373a894 362 case ADC_RESOLUTION_16BIT:
mbed_official 579:53297373a894 363 /* Increase resolution by 4 bit */
mbed_official 579:53297373a894 364 adjres = ADC_DIVIDE_RESULT_DISABLE;
mbed_official 579:53297373a894 365 accumulate = ADC_ACCUMULATE_SAMPLES_256;
mbed_official 579:53297373a894 366 /* 16-bit result register */
mbed_official 579:53297373a894 367 resolution = ADC_RESOLUTION_16BIT;
mbed_official 579:53297373a894 368 break;
mbed_official 579:53297373a894 369 #endif
mbed_official 579:53297373a894 370 case ADC_RESOLUTION_8BIT:
mbed_official 579:53297373a894 371 /* 8-bit result register */
mbed_official 579:53297373a894 372 resolution = ADC_RESOLUTION_8BIT;
mbed_official 579:53297373a894 373 break;
mbed_official 579:53297373a894 374 case ADC_RESOLUTION_10BIT:
mbed_official 579:53297373a894 375 /* 10-bit result register */
mbed_official 579:53297373a894 376 resolution = ADC_RESOLUTION_10BIT;
mbed_official 579:53297373a894 377 break;
mbed_official 579:53297373a894 378 case ADC_RESOLUTION_12BIT:
mbed_official 579:53297373a894 379 /* 12-bit result register */
mbed_official 579:53297373a894 380 resolution = ADC_RESOLUTION_12BIT;
mbed_official 579:53297373a894 381 break;
mbed_official 579:53297373a894 382
mbed_official 579:53297373a894 383 default:
mbed_official 579:53297373a894 384 /* Unknown. Abort. */
mbed_official 579:53297373a894 385 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 386 }
mbed_official 579:53297373a894 387
mbed_official 579:53297373a894 388 adc_module->AVGCTRL.reg = ADC_AVGCTRL_ADJRES(adjres) | accumulate;
mbed_official 579:53297373a894 389
mbed_official 579:53297373a894 390 /* Check validity of sample length value */
mbed_official 579:53297373a894 391 if (config->sample_length > 63) {
mbed_official 579:53297373a894 392 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 393 } else {
mbed_official 579:53297373a894 394 /* Configure sample length */
mbed_official 579:53297373a894 395 adc_module->SAMPCTRL.reg =
mbed_official 579:53297373a894 396 (config->sample_length << ADC_SAMPCTRL_SAMPLEN_Pos);
mbed_official 579:53297373a894 397 }
mbed_official 579:53297373a894 398
mbed_official 579:53297373a894 399 while (adc_is_syncing(module_inst)) {
mbed_official 579:53297373a894 400 /* Wait for synchronization */
mbed_official 579:53297373a894 401 }
mbed_official 579:53297373a894 402
mbed_official 579:53297373a894 403 /* Configure CTRLB */
mbed_official 579:53297373a894 404 adc_module->CTRLB.reg =
mbed_official 579:53297373a894 405 config->clock_prescaler |
mbed_official 579:53297373a894 406 resolution |
mbed_official 579:53297373a894 407 (config->correction.correction_enable << ADC_CTRLB_CORREN_Pos) |
mbed_official 579:53297373a894 408 (config->freerunning << ADC_CTRLB_FREERUN_Pos) |
mbed_official 579:53297373a894 409 (config->left_adjust << ADC_CTRLB_LEFTADJ_Pos) |
mbed_official 579:53297373a894 410 (config->differential_mode << ADC_CTRLB_DIFFMODE_Pos);
mbed_official 579:53297373a894 411
mbed_official 579:53297373a894 412 /* Check validity of window thresholds */
mbed_official 579:53297373a894 413 if (config->window.window_mode != ADC_WINDOW_MODE_DISABLE) {
mbed_official 579:53297373a894 414 switch (resolution) {
mbed_official 579:53297373a894 415 case ADC_RESOLUTION_8BIT:
mbed_official 579:53297373a894 416 if (config->differential_mode &&
mbed_official 579:53297373a894 417 (config->window.window_lower_value > 127 ||
mbed_official 579:53297373a894 418 config->window.window_lower_value < -128 ||
mbed_official 579:53297373a894 419 config->window.window_upper_value > 127 ||
mbed_official 579:53297373a894 420 config->window.window_upper_value < -128)) {
mbed_official 579:53297373a894 421 /* Invalid value */
mbed_official 579:53297373a894 422 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 423 } else if (config->window.window_lower_value > 255 ||
mbed_official 579:53297373a894 424 config->window.window_upper_value > 255) {
mbed_official 579:53297373a894 425 /* Invalid value */
mbed_official 579:53297373a894 426 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 427 }
mbed_official 579:53297373a894 428 break;
mbed_official 579:53297373a894 429 case ADC_RESOLUTION_10BIT:
mbed_official 579:53297373a894 430 if (config->differential_mode &&
mbed_official 579:53297373a894 431 (config->window.window_lower_value > 511 ||
mbed_official 579:53297373a894 432 config->window.window_lower_value < -512 ||
mbed_official 579:53297373a894 433 config->window.window_upper_value > 511 ||
mbed_official 579:53297373a894 434 config->window.window_upper_value > -512)) {
mbed_official 579:53297373a894 435 /* Invalid value */
mbed_official 579:53297373a894 436 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 437 } else if (config->window.window_lower_value > 1023 ||
mbed_official 579:53297373a894 438 config->window.window_upper_value > 1023) {
mbed_official 579:53297373a894 439 /* Invalid value */
mbed_official 579:53297373a894 440 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 441 }
mbed_official 579:53297373a894 442 break;
mbed_official 579:53297373a894 443 case ADC_RESOLUTION_12BIT:
mbed_official 579:53297373a894 444 if (config->differential_mode &&
mbed_official 579:53297373a894 445 (config->window.window_lower_value > 2047 ||
mbed_official 579:53297373a894 446 config->window.window_lower_value < -2048 ||
mbed_official 579:53297373a894 447 config->window.window_upper_value > 2047 ||
mbed_official 579:53297373a894 448 config->window.window_upper_value < -2048)) {
mbed_official 579:53297373a894 449 /* Invalid value */
mbed_official 579:53297373a894 450 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 451 } else if (config->window.window_lower_value > 4095 ||
mbed_official 579:53297373a894 452 config->window.window_upper_value > 4095) {
mbed_official 579:53297373a894 453 /* Invalid value */
mbed_official 579:53297373a894 454 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 455 }
mbed_official 579:53297373a894 456 break;
mbed_official 579:53297373a894 457 case ADC_RESOLUTION_16BIT:
mbed_official 579:53297373a894 458 if (config->differential_mode &&
mbed_official 579:53297373a894 459 (config->window.window_lower_value > 32767 ||
mbed_official 579:53297373a894 460 config->window.window_lower_value < -32768 ||
mbed_official 579:53297373a894 461 config->window.window_upper_value > 32767 ||
mbed_official 579:53297373a894 462 config->window.window_upper_value < -32768)) {
mbed_official 579:53297373a894 463 /* Invalid value */
mbed_official 579:53297373a894 464 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 465 } else if (config->window.window_lower_value > 65535 ||
mbed_official 579:53297373a894 466 config->window.window_upper_value > 65535) {
mbed_official 579:53297373a894 467 /* Invalid value */
mbed_official 579:53297373a894 468 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 469 }
mbed_official 579:53297373a894 470 break;
mbed_official 579:53297373a894 471 }
mbed_official 579:53297373a894 472 }
mbed_official 579:53297373a894 473
mbed_official 579:53297373a894 474 while (adc_is_syncing(module_inst)) {
mbed_official 579:53297373a894 475 /* Wait for synchronization */
mbed_official 579:53297373a894 476 }
mbed_official 579:53297373a894 477
mbed_official 579:53297373a894 478 /* Configure window mode */
mbed_official 579:53297373a894 479 adc_module->WINCTRL.reg = config->window.window_mode;
mbed_official 579:53297373a894 480
mbed_official 579:53297373a894 481 while (adc_is_syncing(module_inst)) {
mbed_official 579:53297373a894 482 /* Wait for synchronization */
mbed_official 579:53297373a894 483 }
mbed_official 579:53297373a894 484
mbed_official 579:53297373a894 485 /* Configure lower threshold */
mbed_official 579:53297373a894 486 adc_module->WINLT.reg =
mbed_official 579:53297373a894 487 config->window.window_lower_value << ADC_WINLT_WINLT_Pos;
mbed_official 579:53297373a894 488
mbed_official 579:53297373a894 489 while (adc_is_syncing(module_inst)) {
mbed_official 579:53297373a894 490 /* Wait for synchronization */
mbed_official 579:53297373a894 491 }
mbed_official 579:53297373a894 492
mbed_official 579:53297373a894 493 /* Configure lower threshold */
mbed_official 579:53297373a894 494 adc_module->WINUT.reg = config->window.window_upper_value <<
mbed_official 579:53297373a894 495 ADC_WINUT_WINUT_Pos;
mbed_official 579:53297373a894 496
mbed_official 579:53297373a894 497 uint8_t inputs_to_scan = config->pin_scan.inputs_to_scan;
mbed_official 579:53297373a894 498 if (inputs_to_scan > 0) {
mbed_official 579:53297373a894 499 /*
mbed_official 579:53297373a894 500 * Number of input sources included is the value written to INPUTSCAN
mbed_official 579:53297373a894 501 * plus 1.
mbed_official 579:53297373a894 502 */
mbed_official 579:53297373a894 503 inputs_to_scan--;
mbed_official 579:53297373a894 504 }
mbed_official 579:53297373a894 505
mbed_official 579:53297373a894 506 if (inputs_to_scan > (ADC_INPUTCTRL_INPUTSCAN_Msk >> ADC_INPUTCTRL_INPUTSCAN_Pos) ||
mbed_official 579:53297373a894 507 config->pin_scan.offset_start_scan > (ADC_INPUTCTRL_INPUTOFFSET_Msk >> ADC_INPUTCTRL_INPUTOFFSET_Pos)) {
mbed_official 579:53297373a894 508 /* Invalid number of input pins or input offset */
mbed_official 579:53297373a894 509 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 510 }
mbed_official 579:53297373a894 511
mbed_official 579:53297373a894 512 while (adc_is_syncing(module_inst)) {
mbed_official 579:53297373a894 513 /* Wait for synchronization */
mbed_official 579:53297373a894 514 }
mbed_official 579:53297373a894 515
mbed_official 579:53297373a894 516 /* Configure pin scan mode and positive and negative input pins */
mbed_official 579:53297373a894 517 adc_module->INPUTCTRL.reg =
mbed_official 579:53297373a894 518 config->gain_factor |
mbed_official 579:53297373a894 519 (config->pin_scan.offset_start_scan <<
mbed_official 579:53297373a894 520 ADC_INPUTCTRL_INPUTOFFSET_Pos) |
mbed_official 579:53297373a894 521 (inputs_to_scan << ADC_INPUTCTRL_INPUTSCAN_Pos) |
mbed_official 579:53297373a894 522 config->negative_input |
mbed_official 579:53297373a894 523 config->positive_input;
mbed_official 579:53297373a894 524
mbed_official 579:53297373a894 525 /* Configure events */
mbed_official 579:53297373a894 526 adc_module->EVCTRL.reg = config->event_action;
mbed_official 579:53297373a894 527
mbed_official 579:53297373a894 528 /* Disable all interrupts */
mbed_official 579:53297373a894 529 adc_module->INTENCLR.reg =
mbed_official 579:53297373a894 530 (1 << ADC_INTENCLR_SYNCRDY_Pos) | (1 << ADC_INTENCLR_WINMON_Pos) |
mbed_official 579:53297373a894 531 (1 << ADC_INTENCLR_OVERRUN_Pos) | (1 << ADC_INTENCLR_RESRDY_Pos);
mbed_official 579:53297373a894 532
mbed_official 579:53297373a894 533 if (config->correction.correction_enable) {
mbed_official 579:53297373a894 534 /* Make sure gain_correction value is valid */
mbed_official 579:53297373a894 535 if (config->correction.gain_correction > ADC_GAINCORR_GAINCORR_Msk) {
mbed_official 579:53297373a894 536 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 537 } else {
mbed_official 579:53297373a894 538 /* Set gain correction value */
mbed_official 579:53297373a894 539 adc_module->GAINCORR.reg = config->correction.gain_correction <<
mbed_official 579:53297373a894 540 ADC_GAINCORR_GAINCORR_Pos;
mbed_official 579:53297373a894 541 }
mbed_official 579:53297373a894 542
mbed_official 579:53297373a894 543 /* Make sure offset correction value is valid */
mbed_official 579:53297373a894 544 if (config->correction.offset_correction > 2047 ||
mbed_official 579:53297373a894 545 config->correction.offset_correction < -2048) {
mbed_official 579:53297373a894 546 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 547 } else {
mbed_official 579:53297373a894 548 /* Set offset correction value */
mbed_official 579:53297373a894 549 adc_module->OFFSETCORR.reg = config->correction.offset_correction <<
mbed_official 579:53297373a894 550 ADC_OFFSETCORR_OFFSETCORR_Pos;
mbed_official 579:53297373a894 551 }
mbed_official 579:53297373a894 552 }
mbed_official 579:53297373a894 553
mbed_official 579:53297373a894 554 /* Load in the fixed device ADC calibration constants */
mbed_official 579:53297373a894 555 adc_module->CALIB.reg =
mbed_official 579:53297373a894 556 ADC_CALIB_BIAS_CAL(
mbed_official 579:53297373a894 557 (*(uint32_t *)ADC_FUSES_BIASCAL_ADDR >> ADC_FUSES_BIASCAL_Pos)
mbed_official 579:53297373a894 558 ) |
mbed_official 579:53297373a894 559 ADC_CALIB_LINEARITY_CAL(
mbed_official 579:53297373a894 560 (*(uint64_t *)ADC_FUSES_LINEARITY_0_ADDR >> ADC_FUSES_LINEARITY_0_Pos)
mbed_official 579:53297373a894 561 );
mbed_official 579:53297373a894 562
mbed_official 579:53297373a894 563 return STATUS_OK;
mbed_official 579:53297373a894 564 }
mbed_official 579:53297373a894 565
mbed_official 579:53297373a894 566 /**
mbed_official 579:53297373a894 567 * \brief Initializes the ADC
mbed_official 579:53297373a894 568 *
mbed_official 579:53297373a894 569 * Initializes the ADC device struct and the hardware module based on the
mbed_official 579:53297373a894 570 * given configuration struct values.
mbed_official 579:53297373a894 571 *
mbed_official 579:53297373a894 572 * \param[out] module_inst Pointer to the ADC software instance struct
mbed_official 579:53297373a894 573 * \param[in] hw Pointer to the ADC module instance
mbed_official 579:53297373a894 574 * \param[in] config Pointer to the configuration struct
mbed_official 579:53297373a894 575 *
mbed_official 579:53297373a894 576 * \return Status of the initialization procedure.
mbed_official 579:53297373a894 577 * \retval STATUS_OK The initialization was successful
mbed_official 579:53297373a894 578 * \retval STATUS_ERR_INVALID_ARG Invalid argument(s) were provided
mbed_official 579:53297373a894 579 * \retval STATUS_BUSY The module is busy with a reset operation
mbed_official 579:53297373a894 580 * \retval STATUS_ERR_DENIED The module is enabled
mbed_official 579:53297373a894 581 */
mbed_official 579:53297373a894 582 enum status_code adc_init(
mbed_official 579:53297373a894 583 struct adc_module *const module_inst,
mbed_official 579:53297373a894 584 Adc *hw,
mbed_official 579:53297373a894 585 struct adc_config *config)
mbed_official 579:53297373a894 586 {
mbed_official 579:53297373a894 587 /* Sanity check arguments */
mbed_official 579:53297373a894 588 Assert(module_inst);
mbed_official 579:53297373a894 589 Assert(hw);
mbed_official 579:53297373a894 590 Assert(config);
mbed_official 579:53297373a894 591
mbed_official 579:53297373a894 592 /* Associate the software module instance with the hardware module */
mbed_official 579:53297373a894 593 module_inst->hw = hw;
mbed_official 579:53297373a894 594
mbed_official 579:53297373a894 595 /* Turn on the digital interface clock */
mbed_official 579:53297373a894 596 system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, PM_APBCMASK_ADC);
mbed_official 579:53297373a894 597
mbed_official 579:53297373a894 598 if (hw->CTRLA.reg & ADC_CTRLA_SWRST) {
mbed_official 579:53297373a894 599 /* We are in the middle of a reset. Abort. */
mbed_official 579:53297373a894 600 return STATUS_BUSY;
mbed_official 579:53297373a894 601 }
mbed_official 579:53297373a894 602
mbed_official 579:53297373a894 603 if (hw->CTRLA.reg & ADC_CTRLA_ENABLE) {
mbed_official 579:53297373a894 604 /* Module must be disabled before initialization. Abort. */
mbed_official 579:53297373a894 605 return STATUS_ERR_DENIED;
mbed_official 579:53297373a894 606 }
mbed_official 579:53297373a894 607
mbed_official 579:53297373a894 608 /* Store the selected reference for later use */
mbed_official 579:53297373a894 609 module_inst->reference = config->reference;
mbed_official 579:53297373a894 610
mbed_official 579:53297373a894 611 /* Make sure bandgap is enabled if requested by the config */
mbed_official 579:53297373a894 612 if (module_inst->reference == ADC_REFERENCE_INT1V) {
mbed_official 579:53297373a894 613 system_voltage_reference_enable(SYSTEM_VOLTAGE_REFERENCE_BANDGAP);
mbed_official 579:53297373a894 614 }
mbed_official 579:53297373a894 615
mbed_official 579:53297373a894 616 #if ADC_CALLBACK_MODE == true
mbed_official 579:53297373a894 617 for (uint8_t i = 0; i < ADC_CALLBACK_N; i++) {
mbed_official 579:53297373a894 618 module_inst->callback[i] = NULL;
mbed_official 579:53297373a894 619 };
mbed_official 579:53297373a894 620
mbed_official 579:53297373a894 621 module_inst->registered_callback_mask = 0;
mbed_official 579:53297373a894 622 module_inst->enabled_callback_mask = 0;
mbed_official 579:53297373a894 623 module_inst->remaining_conversions = 0;
mbed_official 579:53297373a894 624 module_inst->job_status = STATUS_OK;
mbed_official 579:53297373a894 625
mbed_official 579:53297373a894 626 _adc_instances[0] = module_inst;
mbed_official 579:53297373a894 627
mbed_official 579:53297373a894 628 if (config->event_action == ADC_EVENT_ACTION_DISABLED &&
mbed_official 579:53297373a894 629 !config->freerunning) {
mbed_official 579:53297373a894 630 module_inst->software_trigger = true;
mbed_official 579:53297373a894 631 } else {
mbed_official 579:53297373a894 632 module_inst->software_trigger = false;
mbed_official 579:53297373a894 633 }
mbed_official 579:53297373a894 634 #endif
mbed_official 579:53297373a894 635
mbed_official 579:53297373a894 636 /* Write configuration to module */
mbed_official 579:53297373a894 637 return _adc_set_config(module_inst, config);
mbed_official 579:53297373a894 638 }