mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

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 }