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:
Tue Dec 16 08:15:08 2014 +0000
Revision:
440:8a0b45cd594f
Parent:
318:bad45627264e
Synchronized with git revision 67fbbf0b635d0c0d93fbe433306c537c2ad206aa

Full URL: https://github.com/mbedmicro/mbed/commit/67fbbf0b635d0c0d93fbe433306c537c2ad206aa/

Targets: nrf51 - updating app_timer.c from Norid'c SDKv7.1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 20:4263a77256ae 1 /* mbed Microcontroller Library
bogdanm 20:4263a77256ae 2 * Copyright (c) 2006-2013 ARM Limited
bogdanm 20:4263a77256ae 3 *
bogdanm 20:4263a77256ae 4 * Licensed under the Apache License, Version 2.0 (the "License");
bogdanm 20:4263a77256ae 5 * you may not use this file except in compliance with the License.
bogdanm 20:4263a77256ae 6 * You may obtain a copy of the License at
bogdanm 20:4263a77256ae 7 *
bogdanm 20:4263a77256ae 8 * http://www.apache.org/licenses/LICENSE-2.0
bogdanm 20:4263a77256ae 9 *
bogdanm 20:4263a77256ae 10 * Unless required by applicable law or agreed to in writing, software
bogdanm 20:4263a77256ae 11 * distributed under the License is distributed on an "AS IS" BASIS,
bogdanm 20:4263a77256ae 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bogdanm 20:4263a77256ae 13 * See the License for the specific language governing permissions and
bogdanm 20:4263a77256ae 14 * limitations under the License.
bogdanm 20:4263a77256ae 15 *
bogdanm 20:4263a77256ae 16 * Ported to NXP LPC43XX by Micromint USA <support@micromint.com>
bogdanm 20:4263a77256ae 17 */
mbed_official 294:78f9587bb26d 18 #include "mbed_assert.h"
bogdanm 20:4263a77256ae 19 #include "port_api.h"
bogdanm 20:4263a77256ae 20 #include "pinmap.h"
bogdanm 20:4263a77256ae 21 #include "gpio_api.h"
bogdanm 20:4263a77256ae 22
mbed_official 294:78f9587bb26d 23 // Lookup table to determine SCU offset for GPIO [port][pin]
mbed_official 294:78f9587bb26d 24 // Supports eight 16-bit ports to limit table size
mbed_official 294:78f9587bb26d 25 #define _SO(MBED_PIN) (MBED_PIN >> 18)
mbed_official 294:78f9587bb26d 26
mbed_official 294:78f9587bb26d 27 static const uint8_t _scu_off[][16] =
mbed_official 294:78f9587bb26d 28 { // GPIO0 to GPIO3
mbed_official 294:78f9587bb26d 29 { _SO(GPIO0_0), _SO(GPIO0_1), _SO(GPIO0_2), _SO(GPIO0_3),
mbed_official 294:78f9587bb26d 30 _SO(GPIO0_4), _SO(GPIO0_5), _SO(GPIO0_6), _SO(GPIO0_7),
mbed_official 294:78f9587bb26d 31 _SO(GPIO0_8), _SO(GPIO0_9), _SO(GPIO0_10), _SO(GPIO0_11),
mbed_official 294:78f9587bb26d 32 _SO(GPIO0_12), _SO(GPIO0_13), _SO(GPIO0_14), _SO(GPIO0_15)
mbed_official 294:78f9587bb26d 33 },
mbed_official 294:78f9587bb26d 34 { _SO(GPIO1_0), _SO(GPIO1_1), _SO(GPIO1_2), _SO(GPIO1_3),
mbed_official 294:78f9587bb26d 35 _SO(GPIO1_4), _SO(GPIO1_5), _SO(GPIO1_6), _SO(GPIO1_7),
mbed_official 294:78f9587bb26d 36 _SO(GPIO1_8), _SO(GPIO1_9), _SO(GPIO1_10), _SO(GPIO1_11),
mbed_official 294:78f9587bb26d 37 _SO(GPIO1_12), _SO(GPIO1_13), _SO(GPIO1_14), _SO(GPIO1_15)
mbed_official 294:78f9587bb26d 38 },
mbed_official 294:78f9587bb26d 39 { _SO(GPIO2_0), _SO(GPIO2_1), _SO(GPIO2_2), _SO(GPIO2_3),
mbed_official 294:78f9587bb26d 40 _SO(GPIO2_4), _SO(GPIO2_5), _SO(GPIO2_6), _SO(GPIO2_7),
mbed_official 294:78f9587bb26d 41 _SO(GPIO2_8), _SO(GPIO2_9), _SO(GPIO2_10), _SO(GPIO2_11),
mbed_official 294:78f9587bb26d 42 _SO(GPIO2_12), _SO(GPIO2_13), _SO(GPIO2_14), _SO(GPIO2_15)
mbed_official 294:78f9587bb26d 43 },
mbed_official 294:78f9587bb26d 44 { _SO(GPIO3_0), _SO(GPIO3_1), _SO(GPIO3_2), _SO(GPIO3_3),
mbed_official 294:78f9587bb26d 45 _SO(GPIO3_4), _SO(GPIO3_5), _SO(GPIO3_6), _SO(GPIO3_7),
mbed_official 294:78f9587bb26d 46 _SO(GPIO3_8), _SO(GPIO3_9), _SO(GPIO3_10), _SO(GPIO3_11),
mbed_official 294:78f9587bb26d 47 _SO(GPIO3_12), _SO(GPIO3_13), _SO(GPIO3_14), _SO(GPIO3_15)
mbed_official 294:78f9587bb26d 48 },
mbed_official 294:78f9587bb26d 49 };
mbed_official 294:78f9587bb26d 50
mbed_official 294:78f9587bb26d 51 // Use alternate encoding for ports 4 to 7 so lookup stays within uint8
mbed_official 294:78f9587bb26d 52 #define _S2(MBED_PIN) (((MBED_PIN >> 19) & 0xf0) | ((MBED_PIN >> 18) & 0x0f))
mbed_official 294:78f9587bb26d 53
mbed_official 294:78f9587bb26d 54 static const uint8_t _scu_off2[][16] =
mbed_official 294:78f9587bb26d 55 { // GPIO4 to GPIO7
mbed_official 294:78f9587bb26d 56 { _S2(GPIO4_0), _S2(GPIO4_1), _S2(GPIO4_2), _S2(GPIO4_3),
mbed_official 294:78f9587bb26d 57 _S2(GPIO4_4), _S2(GPIO4_5), _S2(GPIO4_6), _S2(GPIO4_7),
mbed_official 294:78f9587bb26d 58 _S2(GPIO4_8), _S2(GPIO4_9), _S2(GPIO4_10), _S2(GPIO4_11),
mbed_official 294:78f9587bb26d 59 _S2(GPIO4_12), _S2(GPIO4_13), _S2(GPIO4_14), _S2(GPIO4_15)
mbed_official 294:78f9587bb26d 60 },
mbed_official 294:78f9587bb26d 61 { _S2(GPIO5_0), _S2(GPIO5_1), _S2(GPIO5_2), _S2(GPIO5_3),
mbed_official 294:78f9587bb26d 62 _S2(GPIO5_4), _S2(GPIO5_5), _S2(GPIO5_6), _S2(GPIO5_7),
mbed_official 294:78f9587bb26d 63 _S2(GPIO5_8), _S2(GPIO5_9), _S2(GPIO5_10), _S2(GPIO5_11),
mbed_official 294:78f9587bb26d 64 _S2(GPIO5_12), _S2(GPIO5_13), _S2(GPIO5_14), _S2(GPIO5_15)
mbed_official 294:78f9587bb26d 65 },
mbed_official 294:78f9587bb26d 66 { _S2(GPIO6_0), _S2(GPIO6_1), _S2(GPIO6_2), _S2(GPIO6_3),
mbed_official 294:78f9587bb26d 67 _S2(GPIO6_4), _S2(GPIO6_5), _S2(GPIO6_6), _S2(GPIO6_7),
mbed_official 294:78f9587bb26d 68 _S2(GPIO6_8), _S2(GPIO6_9), _S2(GPIO6_10), _S2(GPIO6_11),
mbed_official 294:78f9587bb26d 69 _S2(GPIO6_12), _S2(GPIO6_13), _S2(GPIO6_14), _S2(GPIO6_15)
mbed_official 294:78f9587bb26d 70 },
mbed_official 294:78f9587bb26d 71 { _S2(GPIO7_0), _S2(GPIO7_1), _S2(GPIO7_2), _S2(GPIO7_3),
mbed_official 294:78f9587bb26d 72 _S2(GPIO7_4), _S2(GPIO7_5), _S2(GPIO7_6), _S2(GPIO7_7),
mbed_official 294:78f9587bb26d 73 _S2(GPIO7_8), _S2(GPIO7_9), _S2(GPIO7_10), _S2(GPIO7_11),
mbed_official 294:78f9587bb26d 74 _S2(GPIO7_12), _S2(GPIO7_13), _S2(GPIO7_14), _S2(GPIO7_15)
mbed_official 294:78f9587bb26d 75 },
mbed_official 294:78f9587bb26d 76 };
mbed_official 294:78f9587bb26d 77
bogdanm 20:4263a77256ae 78 PinName port_pin(PortName port, int pin_n) {
mbed_official 294:78f9587bb26d 79 MBED_ASSERT((port <= Port7) && (pin_n < 32));
mbed_official 294:78f9587bb26d 80 int offset = 0;
mbed_official 294:78f9587bb26d 81
mbed_official 294:78f9587bb26d 82 // Lookup table only maps pins 0 to 15
mbed_official 294:78f9587bb26d 83 if (pin_n > 15) {
mbed_official 294:78f9587bb26d 84 return NC;
mbed_official 294:78f9587bb26d 85 }
mbed_official 294:78f9587bb26d 86
mbed_official 294:78f9587bb26d 87 // Lookup SCU offset
mbed_official 294:78f9587bb26d 88 if (port < Port4) {
mbed_official 294:78f9587bb26d 89 offset = _scu_off[port][pin_n];
mbed_official 294:78f9587bb26d 90 } else {
mbed_official 294:78f9587bb26d 91 offset = _scu_off2[port - Port4][pin_n];
mbed_official 294:78f9587bb26d 92 offset = ((offset & 0xf0) << 1) | (offset & 0x0f);
mbed_official 294:78f9587bb26d 93 }
mbed_official 294:78f9587bb26d 94
mbed_official 294:78f9587bb26d 95 // Return pin name
mbed_official 294:78f9587bb26d 96 return (PinName)((offset << 18) | GPIO_OFF(port, pin_n));
bogdanm 20:4263a77256ae 97 }
bogdanm 20:4263a77256ae 98
bogdanm 20:4263a77256ae 99 void port_init(port_t *obj, PortName port, int mask, PinDirection dir) {
bogdanm 20:4263a77256ae 100 obj->port = port;
bogdanm 20:4263a77256ae 101 obj->mask = mask;
bogdanm 20:4263a77256ae 102
mbed_official 294:78f9587bb26d 103 LPC_GPIO_T *port_reg = (LPC_GPIO_T *)(LPC_GPIO_PORT_BASE);
bogdanm 20:4263a77256ae 104
mbed_official 294:78f9587bb26d 105 // Do not use masking, because it prevents the use of the unmasked pins
mbed_official 318:bad45627264e 106 // port_reg->MASK[port] = ~mask;
bogdanm 20:4263a77256ae 107
bogdanm 20:4263a77256ae 108 obj->reg_out = &port_reg->PIN[port];
bogdanm 20:4263a77256ae 109 obj->reg_in = &port_reg->PIN[port];
bogdanm 20:4263a77256ae 110 obj->reg_dir = &port_reg->DIR[port];
bogdanm 20:4263a77256ae 111
bogdanm 20:4263a77256ae 112 uint32_t i;
bogdanm 20:4263a77256ae 113 // The function is set per pin: reuse gpio logic
bogdanm 20:4263a77256ae 114 for (i=0; i<32; i++) {
bogdanm 20:4263a77256ae 115 if (obj->mask & (1<<i)) {
bogdanm 20:4263a77256ae 116 gpio_set(port_pin(obj->port, i));
bogdanm 20:4263a77256ae 117 }
bogdanm 20:4263a77256ae 118 }
mbed_official 294:78f9587bb26d 119
bogdanm 20:4263a77256ae 120 port_dir(obj, dir);
bogdanm 20:4263a77256ae 121 }
bogdanm 20:4263a77256ae 122
bogdanm 20:4263a77256ae 123 void port_mode(port_t *obj, PinMode mode) {
bogdanm 20:4263a77256ae 124 uint32_t i;
bogdanm 20:4263a77256ae 125 // The mode is set per pin: reuse pinmap logic
bogdanm 20:4263a77256ae 126 for (i=0; i<32; i++) {
bogdanm 20:4263a77256ae 127 if (obj->mask & (1<<i)) {
bogdanm 20:4263a77256ae 128 pin_mode(port_pin(obj->port, i), mode);
bogdanm 20:4263a77256ae 129 }
bogdanm 20:4263a77256ae 130 }
bogdanm 20:4263a77256ae 131 }
bogdanm 20:4263a77256ae 132
bogdanm 20:4263a77256ae 133 void port_dir(port_t *obj, PinDirection dir) {
bogdanm 20:4263a77256ae 134 switch (dir) {
bogdanm 20:4263a77256ae 135 case PIN_INPUT : *obj->reg_dir &= ~obj->mask; break;
bogdanm 20:4263a77256ae 136 case PIN_OUTPUT: *obj->reg_dir |= obj->mask; break;
bogdanm 20:4263a77256ae 137 }
bogdanm 20:4263a77256ae 138 }
bogdanm 20:4263a77256ae 139
bogdanm 20:4263a77256ae 140 void port_write(port_t *obj, int value) {
bogdanm 20:4263a77256ae 141 *obj->reg_out = (*obj->reg_in & ~obj->mask) | (value & obj->mask);
bogdanm 20:4263a77256ae 142 }
bogdanm 20:4263a77256ae 143
bogdanm 20:4263a77256ae 144 int port_read(port_t *obj) {
bogdanm 20:4263a77256ae 145 return (*obj->reg_in & obj->mask);
bogdanm 20:4263a77256ae 146 }