mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_Cypress/TARGET_PSOC6/port_api.c@189:f392fc9709a3, 2019-02-20 (annotated)
- Committer:
- AnnaBridge
- Date:
- Wed Feb 20 22:31:08 2019 +0000
- Revision:
- 189:f392fc9709a3
- Parent:
- 188:bcfe06ba3d64
mbed library release version 165
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 188:bcfe06ba3d64 | 1 | /* |
AnnaBridge | 188:bcfe06ba3d64 | 2 | * mbed Microcontroller Library |
AnnaBridge | 188:bcfe06ba3d64 | 3 | * Copyright (c) 2017-2018 Future Electronics |
AnnaBridge | 189:f392fc9709a3 | 4 | * Copyright (c) 2018-2019 Cypress Semiconductor Corporation |
AnnaBridge | 189:f392fc9709a3 | 5 | * SPDX-License-Identifier: Apache-2.0 |
AnnaBridge | 188:bcfe06ba3d64 | 6 | * |
AnnaBridge | 188:bcfe06ba3d64 | 7 | * Licensed under the Apache License, Version 2.0 (the "License"); |
AnnaBridge | 188:bcfe06ba3d64 | 8 | * you may not use this file except in compliance with the License. |
AnnaBridge | 188:bcfe06ba3d64 | 9 | * You may obtain a copy of the License at |
AnnaBridge | 188:bcfe06ba3d64 | 10 | * |
AnnaBridge | 188:bcfe06ba3d64 | 11 | * http://www.apache.org/licenses/LICENSE-2.0 |
AnnaBridge | 188:bcfe06ba3d64 | 12 | * |
AnnaBridge | 188:bcfe06ba3d64 | 13 | * Unless required by applicable law or agreed to in writing, software |
AnnaBridge | 188:bcfe06ba3d64 | 14 | * distributed under the License is distributed on an "AS IS" BASIS, |
AnnaBridge | 188:bcfe06ba3d64 | 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
AnnaBridge | 188:bcfe06ba3d64 | 16 | * See the License for the specific language governing permissions and |
AnnaBridge | 188:bcfe06ba3d64 | 17 | * limitations under the License. |
AnnaBridge | 188:bcfe06ba3d64 | 18 | */ |
AnnaBridge | 188:bcfe06ba3d64 | 19 | |
AnnaBridge | 188:bcfe06ba3d64 | 20 | #include "cmsis.h" |
AnnaBridge | 188:bcfe06ba3d64 | 21 | #include "device.h" |
AnnaBridge | 188:bcfe06ba3d64 | 22 | #include "mbed_assert.h" |
AnnaBridge | 188:bcfe06ba3d64 | 23 | #include "gpio_object.h" |
AnnaBridge | 188:bcfe06ba3d64 | 24 | #include "port_api.h" |
AnnaBridge | 188:bcfe06ba3d64 | 25 | #include "psoc6_utils.h" |
AnnaBridge | 188:bcfe06ba3d64 | 26 | #include "mbed_error.h" |
AnnaBridge | 188:bcfe06ba3d64 | 27 | |
AnnaBridge | 188:bcfe06ba3d64 | 28 | static void port_init_pins(port_t *obj) |
AnnaBridge | 188:bcfe06ba3d64 | 29 | { |
AnnaBridge | 188:bcfe06ba3d64 | 30 | uint32_t pin; |
AnnaBridge | 188:bcfe06ba3d64 | 31 | uint32_t cy_mode; |
AnnaBridge | 188:bcfe06ba3d64 | 32 | |
AnnaBridge | 188:bcfe06ba3d64 | 33 | MBED_ASSERT(obj); |
AnnaBridge | 188:bcfe06ba3d64 | 34 | MBED_ASSERT(obj->port); |
AnnaBridge | 188:bcfe06ba3d64 | 35 | |
AnnaBridge | 188:bcfe06ba3d64 | 36 | cy_mode = gpio_get_cy_drive_mode(obj->direction, obj->mode); |
AnnaBridge | 188:bcfe06ba3d64 | 37 | for (pin = 0; pin < 8; ++pin) { |
AnnaBridge | 188:bcfe06ba3d64 | 38 | if (obj->mask & (1 << pin)) { |
AnnaBridge | 188:bcfe06ba3d64 | 39 | Cy_GPIO_Pin_FastInit(obj->port, pin, cy_mode, 0, HSIOM_SEL_GPIO); |
AnnaBridge | 188:bcfe06ba3d64 | 40 | } |
AnnaBridge | 188:bcfe06ba3d64 | 41 | } |
AnnaBridge | 188:bcfe06ba3d64 | 42 | |
AnnaBridge | 188:bcfe06ba3d64 | 43 | // Force output to enable pulls. |
AnnaBridge | 188:bcfe06ba3d64 | 44 | if (obj->direction == PIN_INPUT) { |
AnnaBridge | 188:bcfe06ba3d64 | 45 | switch (cy_mode) { |
AnnaBridge | 188:bcfe06ba3d64 | 46 | case CY_GPIO_DM_PULLUP: |
AnnaBridge | 188:bcfe06ba3d64 | 47 | port_write(obj, 0xff); |
AnnaBridge | 188:bcfe06ba3d64 | 48 | break; // Force output to enable pulls. |
AnnaBridge | 188:bcfe06ba3d64 | 49 | |
AnnaBridge | 188:bcfe06ba3d64 | 50 | case CY_GPIO_DM_PULLDOWN: |
AnnaBridge | 188:bcfe06ba3d64 | 51 | port_write(obj, 0); |
AnnaBridge | 188:bcfe06ba3d64 | 52 | break; |
AnnaBridge | 188:bcfe06ba3d64 | 53 | } |
AnnaBridge | 188:bcfe06ba3d64 | 54 | } |
AnnaBridge | 188:bcfe06ba3d64 | 55 | } |
AnnaBridge | 188:bcfe06ba3d64 | 56 | |
AnnaBridge | 188:bcfe06ba3d64 | 57 | void port_init(port_t *obj, PortName port, int mask, PinDirection dir) |
AnnaBridge | 188:bcfe06ba3d64 | 58 | { |
AnnaBridge | 188:bcfe06ba3d64 | 59 | uint32_t pin; |
AnnaBridge | 188:bcfe06ba3d64 | 60 | |
AnnaBridge | 188:bcfe06ba3d64 | 61 | MBED_ASSERT(obj); |
AnnaBridge | 188:bcfe06ba3d64 | 62 | |
AnnaBridge | 188:bcfe06ba3d64 | 63 | for (pin = 0; pin < 8; ++pin) { |
AnnaBridge | 188:bcfe06ba3d64 | 64 | if (mask & (1 << pin)) { |
AnnaBridge | 189:f392fc9709a3 | 65 | /* Ignore pin reservation result because there is not possibility to release |
AnnaBridge | 189:f392fc9709a3 | 66 | * reserved HW resource. The MBED does not provide proper destructors for |
AnnaBridge | 189:f392fc9709a3 | 67 | * doing that. |
AnnaBridge | 189:f392fc9709a3 | 68 | */ |
AnnaBridge | 189:f392fc9709a3 | 69 | (void) cy_reserve_io_pin((PinName)((port << 8) + pin)); |
AnnaBridge | 188:bcfe06ba3d64 | 70 | } |
AnnaBridge | 188:bcfe06ba3d64 | 71 | } |
AnnaBridge | 188:bcfe06ba3d64 | 72 | obj->port_id = port; |
AnnaBridge | 188:bcfe06ba3d64 | 73 | obj->port = Cy_GPIO_PortToAddr(port); |
AnnaBridge | 188:bcfe06ba3d64 | 74 | obj->mask = mask & 0xff; // Only 8 bits exist on a port in PSoC. |
AnnaBridge | 188:bcfe06ba3d64 | 75 | obj->direction = dir; |
AnnaBridge | 188:bcfe06ba3d64 | 76 | obj->mode = PullDefault; |
AnnaBridge | 188:bcfe06ba3d64 | 77 | port_init_pins(obj); |
AnnaBridge | 188:bcfe06ba3d64 | 78 | } |
AnnaBridge | 188:bcfe06ba3d64 | 79 | |
AnnaBridge | 188:bcfe06ba3d64 | 80 | void port_mode(port_t *obj, PinMode mode) |
AnnaBridge | 188:bcfe06ba3d64 | 81 | { |
AnnaBridge | 188:bcfe06ba3d64 | 82 | MBED_ASSERT(obj); |
AnnaBridge | 188:bcfe06ba3d64 | 83 | MBED_ASSERT(obj->port); |
AnnaBridge | 188:bcfe06ba3d64 | 84 | |
AnnaBridge | 188:bcfe06ba3d64 | 85 | obj->mode = mode; |
AnnaBridge | 188:bcfe06ba3d64 | 86 | port_init_pins(obj); |
AnnaBridge | 188:bcfe06ba3d64 | 87 | } |
AnnaBridge | 188:bcfe06ba3d64 | 88 | |
AnnaBridge | 188:bcfe06ba3d64 | 89 | void port_dir(port_t *obj, PinDirection dir) |
AnnaBridge | 188:bcfe06ba3d64 | 90 | { |
AnnaBridge | 188:bcfe06ba3d64 | 91 | MBED_ASSERT(obj); |
AnnaBridge | 188:bcfe06ba3d64 | 92 | MBED_ASSERT(obj->port); |
AnnaBridge | 188:bcfe06ba3d64 | 93 | |
AnnaBridge | 188:bcfe06ba3d64 | 94 | obj->direction = dir; |
AnnaBridge | 188:bcfe06ba3d64 | 95 | port_init_pins(obj); |
AnnaBridge | 188:bcfe06ba3d64 | 96 | } |
AnnaBridge | 188:bcfe06ba3d64 | 97 | |
AnnaBridge | 188:bcfe06ba3d64 | 98 | void port_write(port_t *obj, int value) |
AnnaBridge | 188:bcfe06ba3d64 | 99 | { |
AnnaBridge | 188:bcfe06ba3d64 | 100 | MBED_ASSERT(obj); |
AnnaBridge | 188:bcfe06ba3d64 | 101 | MBED_ASSERT(obj->port); |
AnnaBridge | 188:bcfe06ba3d64 | 102 | |
AnnaBridge | 188:bcfe06ba3d64 | 103 | if (obj->mask == 0xff) { |
AnnaBridge | 188:bcfe06ba3d64 | 104 | obj->port->OUT = value; |
AnnaBridge | 188:bcfe06ba3d64 | 105 | } else { |
AnnaBridge | 188:bcfe06ba3d64 | 106 | // In case some bits are used for different functionality we need to write |
AnnaBridge | 188:bcfe06ba3d64 | 107 | // each bit separately to not break things out, eg. pull up state on other bits. |
AnnaBridge | 188:bcfe06ba3d64 | 108 | uint32_t pin; |
AnnaBridge | 188:bcfe06ba3d64 | 109 | for (pin = 0; pin < 8; ++pin) { |
AnnaBridge | 188:bcfe06ba3d64 | 110 | if (obj->mask & (1 << pin)) { |
AnnaBridge | 188:bcfe06ba3d64 | 111 | Cy_GPIO_Write(obj->port, pin, value & 0x1); |
AnnaBridge | 188:bcfe06ba3d64 | 112 | value >>= 1; |
AnnaBridge | 188:bcfe06ba3d64 | 113 | } |
AnnaBridge | 188:bcfe06ba3d64 | 114 | } |
AnnaBridge | 188:bcfe06ba3d64 | 115 | } |
AnnaBridge | 188:bcfe06ba3d64 | 116 | } |
AnnaBridge | 188:bcfe06ba3d64 | 117 | |
AnnaBridge | 188:bcfe06ba3d64 | 118 | int port_read(port_t *obj) |
AnnaBridge | 188:bcfe06ba3d64 | 119 | { |
AnnaBridge | 188:bcfe06ba3d64 | 120 | return obj->port->IN & obj->mask; |
AnnaBridge | 188:bcfe06ba3d64 | 121 | } |