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:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 187:0387e8f68319 1 /* mbed Microcontroller Library
AnnaBridge 187:0387e8f68319 2 * Copyright (c) 2017-2018 Nuvoton
AnnaBridge 187:0387e8f68319 3 *
AnnaBridge 187:0387e8f68319 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 187:0387e8f68319 5 * you may not use this file except in compliance with the License.
AnnaBridge 187:0387e8f68319 6 * You may obtain a copy of the License at
AnnaBridge 187:0387e8f68319 7 *
AnnaBridge 187:0387e8f68319 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 187:0387e8f68319 9 *
AnnaBridge 187:0387e8f68319 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 187:0387e8f68319 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 187:0387e8f68319 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 187:0387e8f68319 13 * See the License for the specific language governing permissions and
AnnaBridge 187:0387e8f68319 14 * limitations under the License.
AnnaBridge 187:0387e8f68319 15 */
AnnaBridge 187:0387e8f68319 16
AnnaBridge 187:0387e8f68319 17 #include <arm_cmse.h>
AnnaBridge 187:0387e8f68319 18 #include "mbed_assert.h"
AnnaBridge 187:0387e8f68319 19 #include "pinmap.h"
AnnaBridge 187:0387e8f68319 20 #include "PortNames.h"
AnnaBridge 187:0387e8f68319 21 #include "mbed_error.h"
AnnaBridge 187:0387e8f68319 22 #include "partition_M2351.h"
AnnaBridge 187:0387e8f68319 23 #include "hal_secure.h"
AnnaBridge 187:0387e8f68319 24
AnnaBridge 187:0387e8f68319 25 /**
AnnaBridge 187:0387e8f68319 26 * Configure pin multi-function
AnnaBridge 187:0387e8f68319 27 */
AnnaBridge 187:0387e8f68319 28 void pin_function(PinName pin, int data)
AnnaBridge 187:0387e8f68319 29 {
AnnaBridge 187:0387e8f68319 30 pin_function_s(pin, data);
AnnaBridge 187:0387e8f68319 31 }
AnnaBridge 187:0387e8f68319 32
AnnaBridge 187:0387e8f68319 33 /**
AnnaBridge 187:0387e8f68319 34 * Configure pin pull-up/pull-down
AnnaBridge 187:0387e8f68319 35 */
AnnaBridge 187:0387e8f68319 36 void pin_mode(PinName pin, PinMode mode)
AnnaBridge 187:0387e8f68319 37 {
AnnaBridge 187:0387e8f68319 38 MBED_ASSERT(pin != (PinName)NC);
AnnaBridge 187:0387e8f68319 39 uint32_t pin_index = NU_PINNAME_TO_PIN(pin);
AnnaBridge 187:0387e8f68319 40 uint32_t port_index = NU_PINNAME_TO_PORT(pin);
AnnaBridge 187:0387e8f68319 41 GPIO_T *gpio_base = NU_PORT_BASE(port_index);
AnnaBridge 187:0387e8f68319 42
AnnaBridge 187:0387e8f68319 43 uint32_t mode_intern = GPIO_MODE_INPUT;
AnnaBridge 188:bcfe06ba3d64 44
AnnaBridge 187:0387e8f68319 45 switch (mode) {
AnnaBridge 188:bcfe06ba3d64 46 case InputOnly:
AnnaBridge 187:0387e8f68319 47 mode_intern = GPIO_MODE_INPUT;
AnnaBridge 187:0387e8f68319 48 break;
AnnaBridge 188:bcfe06ba3d64 49
AnnaBridge 188:bcfe06ba3d64 50 case PushPullOutput:
AnnaBridge 187:0387e8f68319 51 mode_intern = GPIO_MODE_OUTPUT;
AnnaBridge 187:0387e8f68319 52 break;
AnnaBridge 188:bcfe06ba3d64 53
AnnaBridge 187:0387e8f68319 54 case OpenDrain:
AnnaBridge 187:0387e8f68319 55 mode_intern = GPIO_MODE_OPEN_DRAIN;
AnnaBridge 187:0387e8f68319 56 break;
AnnaBridge 188:bcfe06ba3d64 57
AnnaBridge 188:bcfe06ba3d64 58 case QuasiBidirectional:
AnnaBridge 187:0387e8f68319 59 mode_intern = GPIO_MODE_QUASI;
AnnaBridge 187:0387e8f68319 60 break;
AnnaBridge 188:bcfe06ba3d64 61
AnnaBridge 188:bcfe06ba3d64 62 default:
AnnaBridge 188:bcfe06ba3d64 63 /* H/W doesn't support separate configuration for input pull mode/direction.
AnnaBridge 188:bcfe06ba3d64 64 * We expect upper layer would have translated input pull mode/direction
AnnaBridge 188:bcfe06ba3d64 65 * to I/O mode */
AnnaBridge 188:bcfe06ba3d64 66 return;
AnnaBridge 187:0387e8f68319 67 }
AnnaBridge 188:bcfe06ba3d64 68
AnnaBridge 187:0387e8f68319 69 GPIO_SetMode(gpio_base, 1 << pin_index, mode_intern);
AnnaBridge 188:bcfe06ba3d64 70
AnnaBridge 188:bcfe06ba3d64 71 /* Invalid combinations of PinMode/PinDirection
AnnaBridge 188:bcfe06ba3d64 72 *
AnnaBridge 188:bcfe06ba3d64 73 * We assume developer would avoid the following combinations of PinMode/PinDirection
AnnaBridge 188:bcfe06ba3d64 74 * which are invalid:
AnnaBridge 188:bcfe06ba3d64 75 * 1. InputOnly/PIN_OUTPUT
AnnaBridge 188:bcfe06ba3d64 76 * 2. PushPullOutput/PIN_INPUT
AnnaBridge 188:bcfe06ba3d64 77 */
AnnaBridge 187:0387e8f68319 78 }
AnnaBridge 187:0387e8f68319 79
AnnaBridge 187:0387e8f68319 80 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
AnnaBridge 187:0387e8f68319 81 __NONSECURE_ENTRY
AnnaBridge 187:0387e8f68319 82 void pin_function_s(int32_t pin, int32_t data)
AnnaBridge 187:0387e8f68319 83 {
AnnaBridge 187:0387e8f68319 84 MBED_ASSERT(pin != (PinName)NC);
AnnaBridge 187:0387e8f68319 85 uint32_t pin_index = NU_PINNAME_TO_PIN(pin);
AnnaBridge 187:0387e8f68319 86 uint32_t port_index = NU_PINNAME_TO_PORT(pin);
AnnaBridge 187:0387e8f68319 87
AnnaBridge 187:0387e8f68319 88 /* Guard access to secure GPIO from non-secure domain */
AnnaBridge 187:0387e8f68319 89 if (cmse_nonsecure_caller() &&
AnnaBridge 187:0387e8f68319 90 (! (SCU_INIT_IONSSET_VAL & (1 << (port_index + 0))))) {
AnnaBridge 187:0387e8f68319 91 error("Non-secure domain tries to control secure or undefined GPIO.");
AnnaBridge 187:0387e8f68319 92 }
AnnaBridge 187:0387e8f68319 93
AnnaBridge 187:0387e8f68319 94 __IO uint32_t *GPx_MFPx = ((__IO uint32_t *) &SYS->GPA_MFPL) + port_index * 2 + (pin_index / 8);
AnnaBridge 187:0387e8f68319 95 uint32_t MFP_Msk = NU_MFP_MSK(pin_index);
AnnaBridge 187:0387e8f68319 96
AnnaBridge 187:0387e8f68319 97 // E.g.: SYS->GPA_MFPL = (SYS->GPA_MFPL & (~SYS_GPA_MFPL_PA0MFP_Msk) ) | SYS_GPA_MFPL_PA0MFP_SC0_CD ;
AnnaBridge 187:0387e8f68319 98 *GPx_MFPx = (*GPx_MFPx & (~MFP_Msk)) | data;
AnnaBridge 187:0387e8f68319 99 }
AnnaBridge 187:0387e8f68319 100 #endif