mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
150:02e0a0aed4ec
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 150:02e0a0aed4ec 1 /* mbed Microcontroller Library
<> 150:02e0a0aed4ec 2 * Copyright (c) 2016 u-blox
<> 150:02e0a0aed4ec 3 *
<> 150:02e0a0aed4ec 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 150:02e0a0aed4ec 5 * you may not use this file except in compliance with the License.
<> 150:02e0a0aed4ec 6 * You may obtain a copy of the License at
<> 150:02e0a0aed4ec 7 *
<> 150:02e0a0aed4ec 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 150:02e0a0aed4ec 9 *
<> 150:02e0a0aed4ec 10 * Unless required by applicable law or agreed to in writing, software
<> 150:02e0a0aed4ec 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 150:02e0a0aed4ec 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 150:02e0a0aed4ec 13 * See the License for the specific language governing permissions and
<> 150:02e0a0aed4ec 14 * limitations under the License.
<> 150:02e0a0aed4ec 15 */
<> 150:02e0a0aed4ec 16
<> 150:02e0a0aed4ec 17 /* TODO: this needs testing */
<> 150:02e0a0aed4ec 18
<> 150:02e0a0aed4ec 19 #include "port_api.h"
<> 150:02e0a0aed4ec 20 #include "pinmap.h"
<> 150:02e0a0aed4ec 21 #include "gpio_api.h"
<> 150:02e0a0aed4ec 22
<> 150:02e0a0aed4ec 23 PinName port_pin(PortName port, int pin_n)
<> 150:02e0a0aed4ec 24 {
<> 150:02e0a0aed4ec 25 MBED_ASSERT (port < PortMaxNumber);
<> 150:02e0a0aed4ec 26
<> 150:02e0a0aed4ec 27 (void) port;
<> 150:02e0a0aed4ec 28 return (PinName)(pin_n);
<> 150:02e0a0aed4ec 29 }
<> 150:02e0a0aed4ec 30
<> 150:02e0a0aed4ec 31 void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
<> 150:02e0a0aed4ec 32 {
<> 150:02e0a0aed4ec 33 MBED_ASSERT (port < PortMaxNumber);
<> 150:02e0a0aed4ec 34
<> 150:02e0a0aed4ec 35 obj->port = port;
<> 150:02e0a0aed4ec 36 obj->mask = mask;
<> 150:02e0a0aed4ec 37
<> 150:02e0a0aed4ec 38 obj->reg_dir = &GPIO_DIR;
<> 150:02e0a0aed4ec 39 obj->reg_out = &GPIO_OUT;
<> 150:02e0a0aed4ec 40 obj->reg_val = &GPIO_VALUE;
<> 150:02e0a0aed4ec 41 obj->reg_drv = &GPIO_DRIVE;
<> 150:02e0a0aed4ec 42
<> 150:02e0a0aed4ec 43 /* Claim the pins */
<> 150:02e0a0aed4ec 44 for (uint8_t x = 0; x < NUM_PINS; x++) {
<> 150:02e0a0aed4ec 45 if (mask & (1ul << x)) {
<> 150:02e0a0aed4ec 46 pin_function((PinName) x, PIN_FUNCTION_GPIO);
<> 150:02e0a0aed4ec 47 }
<> 150:02e0a0aed4ec 48 }
<> 150:02e0a0aed4ec 49
<> 150:02e0a0aed4ec 50 /* Set up the pins */
<> 150:02e0a0aed4ec 51 port_dir(obj, dir);
<> 150:02e0a0aed4ec 52 }
<> 150:02e0a0aed4ec 53
<> 150:02e0a0aed4ec 54 void port_mode(port_t *obj, PinMode mode)
<> 150:02e0a0aed4ec 55 {
<> 150:02e0a0aed4ec 56 switch (mode) {
<> 150:02e0a0aed4ec 57 case PullUp:
<> 150:02e0a0aed4ec 58 {
<> 150:02e0a0aed4ec 59 MBED_ASSERT(false); /* Not currently supported on HI2110 */
<> 150:02e0a0aed4ec 60 }
<> 150:02e0a0aed4ec 61 break;
<> 150:02e0a0aed4ec 62 case PullDown:
<> 150:02e0a0aed4ec 63 {
<> 150:02e0a0aed4ec 64 GPIO_PULLEN_BITSET |= obj->mask;
<> 150:02e0a0aed4ec 65 }
<> 150:02e0a0aed4ec 66 break;
<> 150:02e0a0aed4ec 67 case PullNone:
<> 150:02e0a0aed4ec 68 {
<> 150:02e0a0aed4ec 69 GPIO_PULLEN_BITCLR &= ~(obj->mask);
<> 150:02e0a0aed4ec 70 }
<> 150:02e0a0aed4ec 71 break;
<> 150:02e0a0aed4ec 72 default:
<> 150:02e0a0aed4ec 73 break;
<> 150:02e0a0aed4ec 74 }
<> 150:02e0a0aed4ec 75 }
<> 150:02e0a0aed4ec 76
<> 150:02e0a0aed4ec 77 void port_dir(port_t *obj, PinDirection dir)
<> 150:02e0a0aed4ec 78 {
<> 150:02e0a0aed4ec 79 switch (dir) {
<> 150:02e0a0aed4ec 80 case PIN_INPUT:
<> 150:02e0a0aed4ec 81 {
<> 150:02e0a0aed4ec 82 *(obj->reg_dir) &= ~(obj->mask);
<> 150:02e0a0aed4ec 83 }
<> 150:02e0a0aed4ec 84 break;
<> 150:02e0a0aed4ec 85 case PIN_OUTPUT:
<> 150:02e0a0aed4ec 86 {
<> 150:02e0a0aed4ec 87 *(obj->reg_dir) |= obj->mask;
<> 150:02e0a0aed4ec 88 /* TODO: do we need to set the drive strength? If so, how do we decide which way? */
<> 150:02e0a0aed4ec 89 /* obj->reg_drv |= obj->mask; */
<> 150:02e0a0aed4ec 90 }
<> 150:02e0a0aed4ec 91 break;
<> 150:02e0a0aed4ec 92 }
<> 150:02e0a0aed4ec 93 }
<> 150:02e0a0aed4ec 94
<> 150:02e0a0aed4ec 95 void port_write(port_t *obj, int value)
<> 150:02e0a0aed4ec 96 {
<> 150:02e0a0aed4ec 97 *(obj->reg_out) = value;
<> 150:02e0a0aed4ec 98 }
<> 150:02e0a0aed4ec 99
<> 150:02e0a0aed4ec 100 int port_read(port_t *obj)
<> 150:02e0a0aed4ec 101 {
<> 150:02e0a0aed4ec 102 return *(obj->reg_val);
<> 150:02e0a0aed4ec 103 }