mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* mbed Microcontroller Library
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2006-2013 ARM Limited
kenjiArai 0:5b88d5760320 3 * SPDX-License-Identifier: Apache-2.0
kenjiArai 0:5b88d5760320 4 *
kenjiArai 0:5b88d5760320 5 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 6 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 7 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 8 *
kenjiArai 0:5b88d5760320 9 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 10 *
kenjiArai 0:5b88d5760320 11 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 12 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 14 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 15 * limitations under the License.
kenjiArai 0:5b88d5760320 16 */
kenjiArai 0:5b88d5760320 17 #include "hal/pinmap.h"
kenjiArai 0:5b88d5760320 18 #include "platform/mbed_error.h"
kenjiArai 0:5b88d5760320 19
kenjiArai 0:5b88d5760320 20 void pinmap_pinout(PinName pin, const PinMap *map)
kenjiArai 0:5b88d5760320 21 {
kenjiArai 0:5b88d5760320 22 if (pin == NC) {
kenjiArai 0:5b88d5760320 23 return;
kenjiArai 0:5b88d5760320 24 }
kenjiArai 0:5b88d5760320 25
kenjiArai 0:5b88d5760320 26 while (map->pin != NC) {
kenjiArai 0:5b88d5760320 27 if (map->pin == pin) {
kenjiArai 0:5b88d5760320 28 pin_function(pin, map->function);
kenjiArai 0:5b88d5760320 29
kenjiArai 0:5b88d5760320 30 pin_mode(pin, PullNone);
kenjiArai 0:5b88d5760320 31 return;
kenjiArai 0:5b88d5760320 32 }
kenjiArai 0:5b88d5760320 33 map++;
kenjiArai 0:5b88d5760320 34 }
kenjiArai 0:5b88d5760320 35 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_PINMAP_INVALID), "could not pinout", pin);
kenjiArai 0:5b88d5760320 36 }
kenjiArai 0:5b88d5760320 37
kenjiArai 0:5b88d5760320 38 uint32_t pinmap_merge(uint32_t a, uint32_t b)
kenjiArai 0:5b88d5760320 39 {
kenjiArai 0:5b88d5760320 40 // both are the same (inc both NC)
kenjiArai 0:5b88d5760320 41 if (a == b) {
kenjiArai 0:5b88d5760320 42 return a;
kenjiArai 0:5b88d5760320 43 }
kenjiArai 0:5b88d5760320 44
kenjiArai 0:5b88d5760320 45 // one (or both) is not connected
kenjiArai 0:5b88d5760320 46 if (a == (uint32_t)NC) {
kenjiArai 0:5b88d5760320 47 return b;
kenjiArai 0:5b88d5760320 48 }
kenjiArai 0:5b88d5760320 49 if (b == (uint32_t)NC) {
kenjiArai 0:5b88d5760320 50 return a;
kenjiArai 0:5b88d5760320 51 }
kenjiArai 0:5b88d5760320 52
kenjiArai 0:5b88d5760320 53 // mis-match error case
kenjiArai 0:5b88d5760320 54 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_PINMAP_INVALID), "pinmap mis-match", a);
kenjiArai 0:5b88d5760320 55 }
kenjiArai 0:5b88d5760320 56
kenjiArai 0:5b88d5760320 57 uint32_t pinmap_find_peripheral(PinName pin, const PinMap *map)
kenjiArai 0:5b88d5760320 58 {
kenjiArai 0:5b88d5760320 59 while (map->pin != NC) {
kenjiArai 0:5b88d5760320 60 if (map->pin == pin) {
kenjiArai 0:5b88d5760320 61 return map->peripheral;
kenjiArai 0:5b88d5760320 62 }
kenjiArai 0:5b88d5760320 63 map++;
kenjiArai 0:5b88d5760320 64 }
kenjiArai 0:5b88d5760320 65 return (uint32_t)NC;
kenjiArai 0:5b88d5760320 66 }
kenjiArai 0:5b88d5760320 67
kenjiArai 0:5b88d5760320 68 uint32_t pinmap_peripheral(PinName pin, const PinMap *map)
kenjiArai 0:5b88d5760320 69 {
kenjiArai 0:5b88d5760320 70 uint32_t peripheral = (uint32_t)NC;
kenjiArai 0:5b88d5760320 71
kenjiArai 0:5b88d5760320 72 if (pin == (PinName)NC) {
kenjiArai 0:5b88d5760320 73 return (uint32_t)NC;
kenjiArai 0:5b88d5760320 74 }
kenjiArai 0:5b88d5760320 75 peripheral = pinmap_find_peripheral(pin, map);
kenjiArai 0:5b88d5760320 76 if ((uint32_t)NC == peripheral) { // no mapping available
kenjiArai 1:9db0e321a9f4 77 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_PINMAP_INVALID), "pinmap not found for peripheral", pin);
kenjiArai 0:5b88d5760320 78 }
kenjiArai 0:5b88d5760320 79 return peripheral;
kenjiArai 0:5b88d5760320 80 }
kenjiArai 0:5b88d5760320 81
kenjiArai 0:5b88d5760320 82 uint32_t pinmap_find_function(PinName pin, const PinMap *map)
kenjiArai 0:5b88d5760320 83 {
kenjiArai 0:5b88d5760320 84 while (map->pin != NC) {
kenjiArai 0:5b88d5760320 85 if (map->pin == pin) {
kenjiArai 0:5b88d5760320 86 return map->function;
kenjiArai 0:5b88d5760320 87 }
kenjiArai 0:5b88d5760320 88 map++;
kenjiArai 0:5b88d5760320 89 }
kenjiArai 0:5b88d5760320 90 return (uint32_t)NC;
kenjiArai 0:5b88d5760320 91 }
kenjiArai 0:5b88d5760320 92
kenjiArai 0:5b88d5760320 93 uint32_t pinmap_function(PinName pin, const PinMap *map)
kenjiArai 0:5b88d5760320 94 {
kenjiArai 0:5b88d5760320 95 uint32_t function = (uint32_t)NC;
kenjiArai 0:5b88d5760320 96
kenjiArai 0:5b88d5760320 97 if (pin == (PinName)NC) {
kenjiArai 0:5b88d5760320 98 return (uint32_t)NC;
kenjiArai 0:5b88d5760320 99 }
kenjiArai 0:5b88d5760320 100 function = pinmap_find_function(pin, map);
kenjiArai 0:5b88d5760320 101 if ((uint32_t)NC == function) { // no mapping available
kenjiArai 1:9db0e321a9f4 102 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_PINMAP_INVALID), "pinmap not found for function", pin);
kenjiArai 0:5b88d5760320 103 }
kenjiArai 0:5b88d5760320 104 return function;
kenjiArai 0:5b88d5760320 105 }
kenjiArai 0:5b88d5760320 106
kenjiArai 0:5b88d5760320 107 bool pinmap_find_peripheral_pins(const PinList *whitelist, const PinList *blacklist, int per, const PinMap *const *maps, PinName **pins, uint32_t count)
kenjiArai 0:5b88d5760320 108 {
kenjiArai 0:5b88d5760320 109 /*
kenjiArai 0:5b88d5760320 110 * This function uses recursion to find a suitable set of pins which meet the requirements.
kenjiArai 0:5b88d5760320 111 * Recursion is at max the number of pinmaps passed in - the 'count' parameter. Because of this
kenjiArai 0:5b88d5760320 112 * there is no risk of a stack overflow due to unbounded recursion.
kenjiArai 0:5b88d5760320 113 *
kenjiArai 0:5b88d5760320 114 * Below is a psuedo code example of this function's operation when finding a set of 4 pins.
kenjiArai 0:5b88d5760320 115 * The recursion depth is indicated by the number in front.
kenjiArai 0:5b88d5760320 116 *
kenjiArai 0:5b88d5760320 117 * 1. Given 4 maps and a peripheral find 4 suitable pins
kenjiArai 0:5b88d5760320 118 * 2. Given 4 maps, a peripheral and 1 pin find 3 suitable pins
kenjiArai 0:5b88d5760320 119 * 3. Given 4 maps, a peripheral and 2 pins find 2 suitable pins
kenjiArai 0:5b88d5760320 120 * 4. Given 4 maps, a peripheral and 3 pins find 1 suitable pin
kenjiArai 0:5b88d5760320 121 * 4. Return success if all pins are found, return failure if there are no suitable pins, otherwise choose the next pin and retry
kenjiArai 0:5b88d5760320 122 * 3. Return success if all pins are found, return failure if there are no suitable pins, otherwise choose the next pin and retry
kenjiArai 0:5b88d5760320 123 * 2. Return success if all pins are found, return failure if there are no suitable pins, otherwise choose the next pin and retry
kenjiArai 0:5b88d5760320 124 * 1. Return success if all pins are found, return failure if there are no suitable pins, otherwise choose the next pin and retry
kenjiArai 0:5b88d5760320 125 *
kenjiArai 0:5b88d5760320 126 */
kenjiArai 0:5b88d5760320 127
kenjiArai 0:5b88d5760320 128 for (uint32_t i = 0; i < count; i++) {
kenjiArai 0:5b88d5760320 129 const PinMap *map = maps[i];
kenjiArai 0:5b88d5760320 130 PinName *pin = pins[i];
kenjiArai 0:5b88d5760320 131 if (*pin == NC) {
kenjiArai 0:5b88d5760320 132 for (; map->pin != NC; map++) {
kenjiArai 0:5b88d5760320 133 if (map->peripheral != per) {
kenjiArai 0:5b88d5760320 134 continue;
kenjiArai 0:5b88d5760320 135 }
kenjiArai 0:5b88d5760320 136 if (!pinmap_list_has_pin(whitelist, map->pin)) {
kenjiArai 0:5b88d5760320 137 // Not part of this form factor
kenjiArai 0:5b88d5760320 138 continue;
kenjiArai 0:5b88d5760320 139 }
kenjiArai 0:5b88d5760320 140 if (pinmap_list_has_pin(blacklist, map->pin)) {
kenjiArai 0:5b88d5760320 141 // Restricted pin
kenjiArai 0:5b88d5760320 142 continue;
kenjiArai 0:5b88d5760320 143 }
kenjiArai 0:5b88d5760320 144 bool already_in_use = false;
kenjiArai 0:5b88d5760320 145 for (uint32_t j = 0; j < count; j++) {
kenjiArai 0:5b88d5760320 146 if (j == i) {
kenjiArai 0:5b88d5760320 147 // Don't compare with self
kenjiArai 0:5b88d5760320 148 continue;
kenjiArai 0:5b88d5760320 149 }
kenjiArai 0:5b88d5760320 150 if (map->pin == *pins[j]) {
kenjiArai 0:5b88d5760320 151 already_in_use = true;
kenjiArai 0:5b88d5760320 152 break;
kenjiArai 0:5b88d5760320 153 }
kenjiArai 0:5b88d5760320 154 }
kenjiArai 0:5b88d5760320 155 if (already_in_use) {
kenjiArai 0:5b88d5760320 156 continue;
kenjiArai 0:5b88d5760320 157 }
kenjiArai 0:5b88d5760320 158 *pin = map->pin;
kenjiArai 0:5b88d5760320 159 if (pinmap_find_peripheral_pins(whitelist, blacklist, per, maps, pins, count)) {
kenjiArai 0:5b88d5760320 160 return true;
kenjiArai 0:5b88d5760320 161 }
kenjiArai 0:5b88d5760320 162 }
kenjiArai 0:5b88d5760320 163 *pin = NC;
kenjiArai 0:5b88d5760320 164 return false;
kenjiArai 0:5b88d5760320 165 }
kenjiArai 0:5b88d5760320 166 }
kenjiArai 0:5b88d5760320 167 return true;
kenjiArai 0:5b88d5760320 168 }
kenjiArai 0:5b88d5760320 169
kenjiArai 0:5b88d5760320 170 bool pinmap_list_has_pin(const PinList *list, PinName pin)
kenjiArai 0:5b88d5760320 171 {
kenjiArai 0:5b88d5760320 172 for (uint32_t i = 0; i < list->count; i++) {
kenjiArai 0:5b88d5760320 173 if (list->pins[i] == pin) {
kenjiArai 0:5b88d5760320 174 return true;
kenjiArai 0:5b88d5760320 175 }
kenjiArai 0:5b88d5760320 176 }
kenjiArai 0:5b88d5760320 177 return false;
kenjiArai 0:5b88d5760320 178 }
kenjiArai 0:5b88d5760320 179
kenjiArai 1:9db0e321a9f4 180 bool pinmap_list_has_peripheral(const PeripheralList *list, int peripheral)
kenjiArai 1:9db0e321a9f4 181 {
kenjiArai 1:9db0e321a9f4 182 for (uint32_t i = 0; i < list->count; i++) {
kenjiArai 1:9db0e321a9f4 183 if (list->peripheral[i] == peripheral) {
kenjiArai 1:9db0e321a9f4 184 return true;
kenjiArai 1:9db0e321a9f4 185 }
kenjiArai 1:9db0e321a9f4 186 }
kenjiArai 1:9db0e321a9f4 187 return false;
kenjiArai 1:9db0e321a9f4 188 }