GameOpener / mbed-src

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Jul 17 09:15:10 2015 +0100
Revision:
592:a274ee790e56
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 592:a274ee790e56 1 /* mbed Microcontroller Library
mbed_official 592:a274ee790e56 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 592:a274ee790e56 3 *
mbed_official 592:a274ee790e56 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 592:a274ee790e56 5 * you may not use this file except in compliance with the License.
mbed_official 592:a274ee790e56 6 * You may obtain a copy of the License at
mbed_official 592:a274ee790e56 7 *
mbed_official 592:a274ee790e56 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 592:a274ee790e56 9 *
mbed_official 592:a274ee790e56 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 592:a274ee790e56 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 592:a274ee790e56 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 592:a274ee790e56 13 * See the License for the specific language governing permissions and
mbed_official 592:a274ee790e56 14 * limitations under the License.
mbed_official 592:a274ee790e56 15 */
mbed_official 592:a274ee790e56 16 #include "mbed_assert.h"
mbed_official 592:a274ee790e56 17 #include "analogin_api.h"
mbed_official 592:a274ee790e56 18
mbed_official 592:a274ee790e56 19 #include "cmsis.h"
mbed_official 592:a274ee790e56 20 #include "pinmap.h"
mbed_official 592:a274ee790e56 21 #include "PeripheralPins.h"
mbed_official 592:a274ee790e56 22 #include "adc.h"
mbed_official 592:a274ee790e56 23 #include "status_codes.h"
mbed_official 592:a274ee790e56 24
mbed_official 592:a274ee790e56 25 struct adc_module adc_instance;
mbed_official 592:a274ee790e56 26
mbed_official 592:a274ee790e56 27 void adc_configure_ain_pin(uint32_t pin)
mbed_official 592:a274ee790e56 28 {
mbed_official 592:a274ee790e56 29 #define PIN_INVALID_ADC_AIN 0xFFFFUL
mbed_official 592:a274ee790e56 30
mbed_official 592:a274ee790e56 31 /* Pinmapping table for AINxx -> GPIO pin number */
mbed_official 592:a274ee790e56 32 const uint32_t pinmapping[] = {
mbed_official 592:a274ee790e56 33 #if (SAMD20E | SAMD21E)
mbed_official 592:a274ee790e56 34 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 592:a274ee790e56 35 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 36 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 592:a274ee790e56 37 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 592:a274ee790e56 38 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 39 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 40 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 41 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 42 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 592:a274ee790e56 43 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 592:a274ee790e56 44 #elif (SAMD20G | SAMD21G)
mbed_official 592:a274ee790e56 45 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 592:a274ee790e56 46 PIN_PB08B_ADC_AIN2, PIN_PB09B_ADC_AIN3,
mbed_official 592:a274ee790e56 47 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 592:a274ee790e56 48 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 592:a274ee790e56 49 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 50 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 592:a274ee790e56 51 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 52 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 53 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 592:a274ee790e56 54 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 592:a274ee790e56 55 #elif (SAMD20J | SAMD21J)
mbed_official 592:a274ee790e56 56 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 592:a274ee790e56 57 PIN_PB08B_ADC_AIN2, PIN_PB09B_ADC_AIN3,
mbed_official 592:a274ee790e56 58 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 592:a274ee790e56 59 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 592:a274ee790e56 60 PIN_PB00B_ADC_AIN8, PIN_PB01B_ADC_AIN9,
mbed_official 592:a274ee790e56 61 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 592:a274ee790e56 62 PIN_PB04B_ADC_AIN12, PIN_PB05B_ADC_AIN13,
mbed_official 592:a274ee790e56 63 PIN_PB06B_ADC_AIN14, PIN_PB07B_ADC_AIN15,
mbed_official 592:a274ee790e56 64 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 592:a274ee790e56 65 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 592:a274ee790e56 66 #elif SAMR21E
mbed_official 592:a274ee790e56 67 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 68 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 69 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 70 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 592:a274ee790e56 71 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 72 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 73 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 74 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 75 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 592:a274ee790e56 76 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 77 #elif SAMR21G
mbed_official 592:a274ee790e56 78 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 79 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 80 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 592:a274ee790e56 81 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 592:a274ee790e56 82 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 83 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 592:a274ee790e56 84 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 85 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 86 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 592:a274ee790e56 87 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 88 #elif (SAMD10C | SAMD11C)
mbed_official 592:a274ee790e56 89 PIN_PA02B_ADC_AIN0, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 90 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 592:a274ee790e56 91 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 92 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 592:a274ee790e56 93 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 94 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 95 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 96 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 97 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 98 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 99 #elif (SAMD10DS | SAMD11DS)
mbed_official 592:a274ee790e56 100 PIN_PA02B_ADC_AIN0, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 101 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 592:a274ee790e56 102 PIN_PA06B_ADC_AIN4, PIN_PA07B_ADC_AIN5,
mbed_official 592:a274ee790e56 103 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 592:a274ee790e56 104 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 105 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 106 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 107 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 108 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 109 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 110 #elif (SAMD10DM | SAMD11DM)
mbed_official 592:a274ee790e56 111 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 592:a274ee790e56 112 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 592:a274ee790e56 113 PIN_PA06B_ADC_AIN4, PIN_PA07B_ADC_AIN5,
mbed_official 592:a274ee790e56 114 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 592:a274ee790e56 115 PIN_PA10B_ADC_AIN8, PIN_PA11B_ADC_AIN9,
mbed_official 592:a274ee790e56 116 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 117 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 118 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 119 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 120 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 592:a274ee790e56 121 #else
mbed_official 592:a274ee790e56 122 # error ADC pin mappings are not defined for this device.
mbed_official 592:a274ee790e56 123 #endif
mbed_official 592:a274ee790e56 124 };
mbed_official 592:a274ee790e56 125
mbed_official 592:a274ee790e56 126 uint32_t pin_map_result = PIN_INVALID_ADC_AIN;
mbed_official 592:a274ee790e56 127
mbed_official 592:a274ee790e56 128 if (pin <= ADC_EXTCHANNEL_MSB) {
mbed_official 592:a274ee790e56 129 pin_map_result = pinmapping[pin >> ADC_INPUTCTRL_MUXPOS_Pos];
mbed_official 592:a274ee790e56 130
mbed_official 592:a274ee790e56 131 Assert(pin_map_result != PIN_INVALID_ADC_AIN);
mbed_official 592:a274ee790e56 132
mbed_official 592:a274ee790e56 133 struct system_pinmux_config config;
mbed_official 592:a274ee790e56 134 system_pinmux_get_config_defaults(&config);
mbed_official 592:a274ee790e56 135
mbed_official 592:a274ee790e56 136 /* Analog functions are all on MUX setting B */
mbed_official 592:a274ee790e56 137 config.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
mbed_official 592:a274ee790e56 138 config.mux_position = 1;
mbed_official 592:a274ee790e56 139
mbed_official 592:a274ee790e56 140 system_pinmux_pin_set_config(pin_map_result, &config);
mbed_official 592:a274ee790e56 141 }
mbed_official 592:a274ee790e56 142 }
mbed_official 592:a274ee790e56 143
mbed_official 592:a274ee790e56 144 void analogin_init(analogin_t *obj, PinName pin)
mbed_official 592:a274ee790e56 145 {
mbed_official 592:a274ee790e56 146 uint32_t pos_input;
mbed_official 592:a274ee790e56 147 static uint8_t init_flag = 0;
mbed_official 592:a274ee790e56 148
mbed_official 592:a274ee790e56 149 pos_input = pinmap_find_peripheral(pin, PinMap_ADC);
mbed_official 592:a274ee790e56 150 MBED_ASSERT(pos_input != NC);
mbed_official 592:a274ee790e56 151
mbed_official 592:a274ee790e56 152 adc_get_config_defaults(&(obj->config_adc));
mbed_official 592:a274ee790e56 153 obj->config_adc.positive_input = pos_input;
mbed_official 592:a274ee790e56 154 if (init_flag == 0) { // ADC init and enable to be done only once.
mbed_official 592:a274ee790e56 155 adc_init(&adc_instance, ADC, &(obj->config_adc));
mbed_official 592:a274ee790e56 156 adc_enable(&adc_instance);
mbed_official 592:a274ee790e56 157 init_flag = 1;
mbed_official 592:a274ee790e56 158 } else { // pin muxing
mbed_official 592:a274ee790e56 159 adc_configure_ain_pin(obj->config_adc.positive_input);
mbed_official 592:a274ee790e56 160 adc_configure_ain_pin(obj->config_adc.negative_input);
mbed_official 592:a274ee790e56 161 }
mbed_official 592:a274ee790e56 162 }
mbed_official 592:a274ee790e56 163
mbed_official 592:a274ee790e56 164 uint16_t analogin_read_u16(analogin_t *obj)
mbed_official 592:a274ee790e56 165 {
mbed_official 592:a274ee790e56 166 uint16_t result;
mbed_official 592:a274ee790e56 167 adc_set_positive_input(&adc_instance, obj->config_adc.positive_input);
mbed_official 592:a274ee790e56 168 adc_set_negative_input(&adc_instance, obj->config_adc.negative_input);
mbed_official 592:a274ee790e56 169 adc_start_conversion(&adc_instance);
mbed_official 592:a274ee790e56 170 do {
mbed_official 592:a274ee790e56 171 } while(adc_read(&(adc_instance), &result) == STATUS_BUSY); // 12 bit value
mbed_official 592:a274ee790e56 172
mbed_official 592:a274ee790e56 173 return (uint16_t)((result * 65535) / 4095); // for normalizing to 16 bit value
mbed_official 592:a274ee790e56 174 }
mbed_official 592:a274ee790e56 175
mbed_official 592:a274ee790e56 176 float analogin_read(analogin_t *obj)
mbed_official 592:a274ee790e56 177 {
mbed_official 592:a274ee790e56 178 uint16_t value = analogin_read_u16(obj);
mbed_official 592:a274ee790e56 179 return (float)value * (1.0f / (float)0xFFFF);
mbed_official 592:a274ee790e56 180 }
mbed_official 592:a274ee790e56 181