mbed library sources

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 <stddef.h>
mbed_official 592:a274ee790e56 17 #include "us_ticker_api.h"
mbed_official 592:a274ee790e56 18 #include "cmsis.h"
mbed_official 592:a274ee790e56 19 #include "mbed_assert.h"
mbed_official 592:a274ee790e56 20 #include "ins_gclk.h"
mbed_official 592:a274ee790e56 21 #include "compiler.h"
mbed_official 592:a274ee790e56 22 #include "system.h"
mbed_official 592:a274ee790e56 23
mbed_official 592:a274ee790e56 24 #include "pinmap_function.h"
mbed_official 592:a274ee790e56 25
mbed_official 592:a274ee790e56 26 static uint32_t pinmap_merge_pins(uint32_t a, uint32_t b)
mbed_official 592:a274ee790e56 27 {
mbed_official 592:a274ee790e56 28 // both are the same (inc both NC)
mbed_official 592:a274ee790e56 29 if (a == b)
mbed_official 592:a274ee790e56 30 return a;
mbed_official 592:a274ee790e56 31
mbed_official 592:a274ee790e56 32 // one (or both) is not connected
mbed_official 592:a274ee790e56 33 if (a == (uint32_t)NC)
mbed_official 592:a274ee790e56 34 return b;
mbed_official 592:a274ee790e56 35 if (b == (uint32_t)NC)
mbed_official 592:a274ee790e56 36 return a;
mbed_official 592:a274ee790e56 37
mbed_official 592:a274ee790e56 38 return (uint32_t)NC;
mbed_official 592:a274ee790e56 39 }
mbed_official 592:a274ee790e56 40
mbed_official 592:a274ee790e56 41 /** Find the common SERCOM shared by two pins
mbed_official 592:a274ee790e56 42 *
mbed_official 592:a274ee790e56 43 * Finds the common SERCOM index of two input pins.
mbed_official 592:a274ee790e56 44 * If swapping the input argument gives different result, it means, two SERCOMs share both pins
mbed_official 592:a274ee790e56 45 * @param[in] pin1 First pin
mbed_official 592:a274ee790e56 46 * @param[in] pin2 Second pin
mbed_official 592:a274ee790e56 47 * @return SERCOM index if found, else, NC
mbed_official 592:a274ee790e56 48 */
mbed_official 592:a274ee790e56 49 uint32_t pinmap_merge_sercom(PinName pin1, PinName pin2)
mbed_official 592:a274ee790e56 50 {
mbed_official 592:a274ee790e56 51 int i, j;
mbed_official 592:a274ee790e56 52 uint32_t pin1_sercom[2];
mbed_official 592:a274ee790e56 53 uint32_t pin2_sercom[2];
mbed_official 592:a274ee790e56 54 uint32_t sercom_index[4];
mbed_official 592:a274ee790e56 55
mbed_official 592:a274ee790e56 56 uint32_t pin_com = NC;
mbed_official 592:a274ee790e56 57 uint32_t pin_alt = NC;
mbed_official 592:a274ee790e56 58 uint32_t count_com = 0;
mbed_official 592:a274ee790e56 59 uint32_t count_alt = 0;
mbed_official 592:a274ee790e56 60
mbed_official 592:a274ee790e56 61 /* Adding a condition check just in case we need a different result when swapping arguments */
mbed_official 592:a274ee790e56 62 if (pin1 >= pin2) {
mbed_official 592:a274ee790e56 63 pin1_sercom[0] = pinmap_find_peripheral(pin1, PinMap_SERCOM_PAD);
mbed_official 592:a274ee790e56 64 pin1_sercom[1] = pinmap_find_peripheral(pin1, PinMap_SERCOM_PADEx);
mbed_official 592:a274ee790e56 65 } else {
mbed_official 592:a274ee790e56 66 pin1_sercom[0] = pinmap_find_peripheral(pin1, PinMap_SERCOM_PADEx);
mbed_official 592:a274ee790e56 67 pin1_sercom[1] = pinmap_find_peripheral(pin1, PinMap_SERCOM_PAD);
mbed_official 592:a274ee790e56 68 }
mbed_official 592:a274ee790e56 69
mbed_official 592:a274ee790e56 70 pin2_sercom[0] = pinmap_find_peripheral(pin2, PinMap_SERCOM_PAD);
mbed_official 592:a274ee790e56 71 pin2_sercom[1] = pinmap_find_peripheral(pin2, PinMap_SERCOM_PADEx);
mbed_official 592:a274ee790e56 72
mbed_official 592:a274ee790e56 73 for (i=0; i<2; i++) {
mbed_official 592:a274ee790e56 74 if (pin1_sercom[i] != NC) {
mbed_official 592:a274ee790e56 75 pin1_sercom[i] &= 0x0F;
mbed_official 592:a274ee790e56 76 }
mbed_official 592:a274ee790e56 77 for (j=0; j<2; j++) {
mbed_official 592:a274ee790e56 78 if (pin2_sercom[i] != NC) {
mbed_official 592:a274ee790e56 79 pin2_sercom[i] &= 0x0F;
mbed_official 592:a274ee790e56 80 }
mbed_official 592:a274ee790e56 81 sercom_index[(i*2) + j] = pinmap_merge_pins(pin1_sercom[i], pin2_sercom[j]);
mbed_official 592:a274ee790e56 82 }
mbed_official 592:a274ee790e56 83 }
mbed_official 592:a274ee790e56 84
mbed_official 592:a274ee790e56 85 for (i=0; i<4; i++) {
mbed_official 592:a274ee790e56 86 if (sercom_index[i] != NC) {
mbed_official 592:a274ee790e56 87 if (pin_com == NC) {
mbed_official 592:a274ee790e56 88 pin_com = sercom_index[i];
mbed_official 592:a274ee790e56 89 count_com++;
mbed_official 592:a274ee790e56 90 } else if (pin_com == sercom_index[i]) {
mbed_official 592:a274ee790e56 91 count_com++;
mbed_official 592:a274ee790e56 92 } else if (pin_alt == NC) {
mbed_official 592:a274ee790e56 93 pin_alt = sercom_index[i];
mbed_official 592:a274ee790e56 94 count_alt++;
mbed_official 592:a274ee790e56 95 } else if (pin_alt == sercom_index[i]) {
mbed_official 592:a274ee790e56 96 count_alt++;
mbed_official 592:a274ee790e56 97 } else {}
mbed_official 592:a274ee790e56 98 }
mbed_official 592:a274ee790e56 99 }
mbed_official 592:a274ee790e56 100 return ((count_com >= count_alt) ? pin_com : pin_alt);
mbed_official 592:a274ee790e56 101 }
mbed_official 592:a274ee790e56 102
mbed_official 592:a274ee790e56 103 /** Find the common SERCOM shared by four pins
mbed_official 592:a274ee790e56 104 *
mbed_official 592:a274ee790e56 105 * Finds the common SERCOM index shared by four input pins.
mbed_official 592:a274ee790e56 106 * If reversing the input argument order gives different result, it means, two SERCOMs share the pins
mbed_official 592:a274ee790e56 107 * @param[in] pin1 First pin
mbed_official 592:a274ee790e56 108 * @param[in] pin2 Second pin
mbed_official 592:a274ee790e56 109 * @param[in] pin3 Third pin
mbed_official 592:a274ee790e56 110 * @param[in] pin4 Fourth pin
mbed_official 592:a274ee790e56 111 * @return SERCOM index if found, else, NC
mbed_official 592:a274ee790e56 112 */
mbed_official 592:a274ee790e56 113 uint32_t pinmap_find_sercom(PinName pin1, PinName pin2, PinName pin3, PinName pin4)
mbed_official 592:a274ee790e56 114 {
mbed_official 592:a274ee790e56 115 int i;
mbed_official 592:a274ee790e56 116 uint32_t sercom_index[4];
mbed_official 592:a274ee790e56 117 uint32_t pin_com = NC;
mbed_official 592:a274ee790e56 118 uint32_t pin_alt = NC;
mbed_official 592:a274ee790e56 119 uint32_t count_com = 0;
mbed_official 592:a274ee790e56 120 uint32_t count_alt = 0;
mbed_official 592:a274ee790e56 121
mbed_official 592:a274ee790e56 122 sercom_index[0] = pinmap_merge_sercom(pin1, pin2);
mbed_official 592:a274ee790e56 123 sercom_index[1] = pinmap_merge_sercom(pin3, pin3);
mbed_official 592:a274ee790e56 124 sercom_index[2] = pinmap_merge_sercom(pin1, pin3);
mbed_official 592:a274ee790e56 125 sercom_index[3] = pinmap_merge_sercom(pin2, pin4);
mbed_official 592:a274ee790e56 126
mbed_official 592:a274ee790e56 127
mbed_official 592:a274ee790e56 128 for (i=0; i<4; i++) {
mbed_official 592:a274ee790e56 129 if (sercom_index[i] != NC) {
mbed_official 592:a274ee790e56 130 if (pin_com == NC) {
mbed_official 592:a274ee790e56 131 pin_com = sercom_index[i];
mbed_official 592:a274ee790e56 132 count_com++;
mbed_official 592:a274ee790e56 133 } else if (pin_com == sercom_index[i]) {
mbed_official 592:a274ee790e56 134 count_com++;
mbed_official 592:a274ee790e56 135 } else if (pin_alt == NC) {
mbed_official 592:a274ee790e56 136 pin_alt = sercom_index[i];
mbed_official 592:a274ee790e56 137 count_alt++;
mbed_official 592:a274ee790e56 138 } else if (pin_alt == sercom_index[i]) {
mbed_official 592:a274ee790e56 139 count_alt++;
mbed_official 592:a274ee790e56 140 } else {}
mbed_official 592:a274ee790e56 141 }
mbed_official 592:a274ee790e56 142 }
mbed_official 592:a274ee790e56 143 return ((count_com >= count_alt) ? pin_com : pin_alt);
mbed_official 592:a274ee790e56 144 }
mbed_official 592:a274ee790e56 145
mbed_official 592:a274ee790e56 146 /** Find the MUX function of input pin specific to given SERCOM index
mbed_official 592:a274ee790e56 147 *
mbed_official 592:a274ee790e56 148 * @param[in] pin Pin whose function is to be found out
mbed_official 592:a274ee790e56 149 * @param[in] sercom_index SERCOM index
mbed_official 592:a274ee790e56 150 * @return MUX function if found, else, NC
mbed_official 592:a274ee790e56 151 */
mbed_official 592:a274ee790e56 152 uint32_t pinmap_function_sercom(PinName pin, uint32_t sercom_index)
mbed_official 592:a274ee790e56 153 {
mbed_official 592:a274ee790e56 154 uint32_t func = NC;
mbed_official 592:a274ee790e56 155 uint32_t index;
mbed_official 592:a274ee790e56 156 sercom_index &= 0x0F;
mbed_official 592:a274ee790e56 157
mbed_official 592:a274ee790e56 158 if ((pin == NC) || (sercom_index >= SERCOM_INST_NUM)) {
mbed_official 592:a274ee790e56 159 return NC;
mbed_official 592:a274ee790e56 160 }
mbed_official 592:a274ee790e56 161 index = pinmap_peripheral(pin, PinMap_SERCOM_PAD);
mbed_official 592:a274ee790e56 162 if ((index & 0x0F) == sercom_index) {
mbed_official 592:a274ee790e56 163 func = pinmap_function(pin, PinMap_SERCOM_PAD);
mbed_official 592:a274ee790e56 164 return func;
mbed_official 592:a274ee790e56 165 }
mbed_official 592:a274ee790e56 166 index = pinmap_peripheral(pin, PinMap_SERCOM_PADEx);
mbed_official 592:a274ee790e56 167 if ((index & 0x0F) == sercom_index) {
mbed_official 592:a274ee790e56 168 func = pinmap_function(pin, PinMap_SERCOM_PADEx);
mbed_official 592:a274ee790e56 169 return func;
mbed_official 592:a274ee790e56 170 }
mbed_official 592:a274ee790e56 171 return NC;
mbed_official 592:a274ee790e56 172 }
mbed_official 592:a274ee790e56 173
mbed_official 592:a274ee790e56 174 /** Find the MUX pad of input pin specific to given SERCOM index
mbed_official 592:a274ee790e56 175 *
mbed_official 592:a274ee790e56 176 * @param[in] pin Pin whose function is to be found out
mbed_official 592:a274ee790e56 177 * @param[in] sercom_index SERCOM index
mbed_official 592:a274ee790e56 178 * @return MUX pad if found, else, NC
mbed_official 592:a274ee790e56 179 */
mbed_official 592:a274ee790e56 180 uint32_t pinmap_pad_sercom(PinName pin, uint32_t sercom_index)
mbed_official 592:a274ee790e56 181 {
mbed_official 592:a274ee790e56 182 uint32_t index;
mbed_official 592:a274ee790e56 183 sercom_index &= 0x0F;
mbed_official 592:a274ee790e56 184
mbed_official 592:a274ee790e56 185 if ((pin == NC) || (sercom_index >= SERCOM_INST_NUM)) {
mbed_official 592:a274ee790e56 186 return NC;
mbed_official 592:a274ee790e56 187 }
mbed_official 592:a274ee790e56 188 index = pinmap_peripheral(pin, PinMap_SERCOM_PAD);
mbed_official 592:a274ee790e56 189 if ((index & 0x0F) == sercom_index) {
mbed_official 592:a274ee790e56 190 return ((index >> 4) & 0x0F);
mbed_official 592:a274ee790e56 191 }
mbed_official 592:a274ee790e56 192 index = pinmap_peripheral(pin, PinMap_SERCOM_PADEx);
mbed_official 592:a274ee790e56 193 if ((index & 0x0F) == sercom_index) {
mbed_official 592:a274ee790e56 194 return ((index >> 4) & 0x0F);
mbed_official 592:a274ee790e56 195 }
mbed_official 592:a274ee790e56 196 return NC;
mbed_official 592:a274ee790e56 197 }
mbed_official 592:a274ee790e56 198
mbed_official 592:a274ee790e56 199 /** Find the MUX function of input pin specific to given SERCOM index
mbed_official 592:a274ee790e56 200 *
mbed_official 592:a274ee790e56 201 * @param[in] pin unused
mbed_official 592:a274ee790e56 202 * @param[in] sercom_index SERCOM index
mbed_official 592:a274ee790e56 203 * @return base address to SERCOM if found, else NC
mbed_official 592:a274ee790e56 204 */
mbed_official 592:a274ee790e56 205 uint32_t pinmap_peripheral_sercom(PinName pin, uint32_t sercom_index)
mbed_official 592:a274ee790e56 206 {
mbed_official 592:a274ee790e56 207 uint32_t sercom_address[6] = {
mbed_official 592:a274ee790e56 208 0x42000800UL, // Base address of SERCOM0
mbed_official 592:a274ee790e56 209 0x42000C00UL, // Base address of SERCOM1
mbed_official 592:a274ee790e56 210 0x42001000UL, // Base address of SERCOM2
mbed_official 592:a274ee790e56 211 0x42001400UL, // Base address of SERCOM3
mbed_official 592:a274ee790e56 212 0x42001800UL, // Base address of SERCOM4
mbed_official 592:a274ee790e56 213 0x42001C00UL // Base address of SERCOM5
mbed_official 592:a274ee790e56 214 };
mbed_official 592:a274ee790e56 215 uint32_t index = sercom_index & 0x0F;
mbed_official 592:a274ee790e56 216
mbed_official 592:a274ee790e56 217 if (index >= SERCOM_INST_NUM) {
mbed_official 592:a274ee790e56 218 return NC;
mbed_official 592:a274ee790e56 219 }
mbed_official 592:a274ee790e56 220 return sercom_address[(sercom_index&0x0F)];
mbed_official 592:a274ee790e56 221 }