mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			
						commit
						e2efb35723
					
				| 
						 | 
					@ -25,6 +25,8 @@
 | 
				
			||||||
    #define STACK_SIZE 512
 | 
					    #define STACK_SIZE 512
 | 
				
			||||||
#elif defined(TARGET_XDOT_L151CC)
 | 
					#elif defined(TARGET_XDOT_L151CC)
 | 
				
			||||||
    #define STACK_SIZE 1024
 | 
					    #define STACK_SIZE 1024
 | 
				
			||||||
 | 
					#elif defined(TARGET_HI2110)
 | 
				
			||||||
 | 
					    #define STACK_SIZE 512
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    #define STACK_SIZE DEFAULT_STACK_SIZE
 | 
					    #define STACK_SIZE DEFAULT_STACK_SIZE
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,87 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MBED_PERIPHERALNAMES_H
 | 
				
			||||||
 | 
					#define MBED_PERIPHERALNAMES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cmsis.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define STDIO_UART_TX     UART0_TX
 | 
				
			||||||
 | 
					#define STDIO_UART_RX     UART0_RX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    SERIAL_CONFIG_UARTLP_RX_UART0_TX,
 | 
				
			||||||
 | 
					    SERIAL_CONFIG_UART0_RX_UART0_TX,
 | 
				
			||||||
 | 
					    SERIAL_CONFIG_UART1_RX_UART1_TX,
 | 
				
			||||||
 | 
					    MAX_NUM_SERIAL_CONFIGS
 | 
				
			||||||
 | 
					} SerialConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UNCLAIMED = 0,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_GPIO = 1,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_PWM0 = 2,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_PWM0B = 3,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_PWM1 = 4,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_PWM1B = 5,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP0TXD = 6,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP0RXD = 7,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP0TRX = 8,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP0CLK = 9,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP0FSS = 10,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP1CLK = 11,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP1FSS = 12,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP1TXD = 13,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP1RXD = 14,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_SSP1TRX = 15,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_I2C0 = 16,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_I2C1 = 17,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_TXD = 18,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_TXIR = 19,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_O2 = 20,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_O1 = 21,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_RTS = 22,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_DTR = 23,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_RXD = 24,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_RXIR = 25,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_CTS = 26,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_DCD = 27,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_DSR = 28,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART0_RI = 29,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_TXD = 30,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_TXIR = 31,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_O2 = 32,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_O1 = 33,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_RTS = 34,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_DTR = 35,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_RXD = 36,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_RXIR = 37,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_CTS = 38,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_DCD = 39,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_DSR = 40,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_UART1_RI = 41,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_LP_UART = 42,
 | 
				
			||||||
 | 
					    PIN_FUNCTION_MAX_NUMBER
 | 
				
			||||||
 | 
					} PinFunction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef MBED_PORTNAMES_H
 | 
				
			||||||
 | 
					#define MBED_PORTNAMES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    Port0 = 0, //GPIO pins 0-19
 | 
				
			||||||
 | 
					    PortMaxNumber
 | 
				
			||||||
 | 
					} PortName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,111 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2006-2015 ARM Limited
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef MBED_PINNAMES_H
 | 
				
			||||||
 | 
					#define MBED_PINNAMES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cmsis.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    PIN_INPUT,
 | 
				
			||||||
 | 
					    PIN_OUTPUT
 | 
				
			||||||
 | 
					} PinDirection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    p0  = 0,
 | 
				
			||||||
 | 
					    p1  = 1,
 | 
				
			||||||
 | 
					    p2  = 2,
 | 
				
			||||||
 | 
					    p3  = 3,
 | 
				
			||||||
 | 
					    p4  = 4,
 | 
				
			||||||
 | 
					    p5  = 5,
 | 
				
			||||||
 | 
					    p6  = 6,
 | 
				
			||||||
 | 
					    p7  = 7,
 | 
				
			||||||
 | 
					    p8  = 8,
 | 
				
			||||||
 | 
					    p9  = 9,
 | 
				
			||||||
 | 
					    p10 = 10,
 | 
				
			||||||
 | 
					    p11 = 11,
 | 
				
			||||||
 | 
					    p12 = 12,
 | 
				
			||||||
 | 
					    p13 = 13,
 | 
				
			||||||
 | 
					    p14 = 14,
 | 
				
			||||||
 | 
					    p15 = 15,
 | 
				
			||||||
 | 
					    p16 = 16,
 | 
				
			||||||
 | 
					    p17 = 17,
 | 
				
			||||||
 | 
					    p18 = 18,
 | 
				
			||||||
 | 
					    p19 = 19,
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    UART0_RX = p13,
 | 
				
			||||||
 | 
					    UART0_TX = p18,
 | 
				
			||||||
 | 
					    UART0_CTS = p12,
 | 
				
			||||||
 | 
					    UART0_RTS = p11,
 | 
				
			||||||
 | 
					    I2C_SCL = p0,
 | 
				
			||||||
 | 
					    I2C_SDA = p1,
 | 
				
			||||||
 | 
					    SPI_CS = p2,
 | 
				
			||||||
 | 
					    SPI_CLK = p3,
 | 
				
			||||||
 | 
					    SPI_MOSI = p4,
 | 
				
			||||||
 | 
					    SPI_MISO = p5,
 | 
				
			||||||
 | 
					    UART1_RX = p7,
 | 
				
			||||||
 | 
					    UART1_TX = p6,
 | 
				
			||||||
 | 
					    LED1 = p2,
 | 
				
			||||||
 | 
					    LED2 = p3,
 | 
				
			||||||
 | 
					    LED3 = p4,
 | 
				
			||||||
 | 
					    LED4 = p5,
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // mBed interface Pins
 | 
				
			||||||
 | 
					    USBTX = UART0_TX,
 | 
				
			||||||
 | 
					    USBRX = UART0_RX,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    P0_0 = p0,
 | 
				
			||||||
 | 
					    P0_1 = p1,
 | 
				
			||||||
 | 
					    P0_2 = p2,
 | 
				
			||||||
 | 
					    P0_3 = p3,
 | 
				
			||||||
 | 
					    P0_4 = p4,
 | 
				
			||||||
 | 
					    P0_5 = p5,
 | 
				
			||||||
 | 
					    P0_6 = p6,
 | 
				
			||||||
 | 
					    P0_7 = p7,
 | 
				
			||||||
 | 
					    P0_8 = p8,
 | 
				
			||||||
 | 
					    P0_9 = p9,
 | 
				
			||||||
 | 
					    P0_10 = p10,
 | 
				
			||||||
 | 
					    P0_11 = p11,
 | 
				
			||||||
 | 
					    P0_12 = p12,
 | 
				
			||||||
 | 
					    P0_13 = p13,
 | 
				
			||||||
 | 
					    P0_14 = p14,
 | 
				
			||||||
 | 
					    P0_15 = p15,
 | 
				
			||||||
 | 
					    P0_16 = p16,
 | 
				
			||||||
 | 
					    P0_17 = p17,
 | 
				
			||||||
 | 
					    P0_18 = p18,
 | 
				
			||||||
 | 
					    P0_19 = p19,
 | 
				
			||||||
 | 
					    NUM_PINS,
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Not connected
 | 
				
			||||||
 | 
					    NC = (int)0xFFFFFFFF
 | 
				
			||||||
 | 
					} PinName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    PullNone = 0,
 | 
				
			||||||
 | 
					    PullDown = 1,
 | 
				
			||||||
 | 
					    PullUp = 0xff,  /* TODO: current HI2110 chip does not have pull-up */
 | 
				
			||||||
 | 
					    PullDefault = PullDown /* TODO: mbed requires PullUp as default but HI2110 doesn't have it */
 | 
				
			||||||
 | 
					} PinMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // MBED_PINNAMES_H
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					// The 'features' section in 'target.json' is now used to create the device's hardware preprocessor switches.
 | 
				
			||||||
 | 
					// Check the 'features' section of the target description in 'targets.json' for more details.
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2006-2013 ARM Limited
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef MBED_DEVICE_H
 | 
				
			||||||
 | 
					#define MBED_DEVICE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "objects.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					LR_IROM1 0x00000000 0x20000 {
 | 
				
			||||||
 | 
					  ER_IROM1 0x00000000 0x20000  {
 | 
				
			||||||
 | 
					   *.o (RESET, +First)
 | 
				
			||||||
 | 
					   *(InRoot$$Sections)
 | 
				
			||||||
 | 
					   .ANY (+RO)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  RW_IRAM_VTABLE 0x01000000 EMPTY 128  {
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  RW_IRAM1 +0 (0x5000 - 256)  {
 | 
				
			||||||
 | 
					   .ANY (+RW +ZI)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  RW_IPCRAM +0 256 {
 | 
				
			||||||
 | 
					   ipc.o (+RW)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,163 @@
 | 
				
			||||||
 | 
					; mbed Microcontroller Library
 | 
				
			||||||
 | 
					; Copyright (c) 2016 u-blox.
 | 
				
			||||||
 | 
					;Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					;you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					;You may obtain a copy of the License at
 | 
				
			||||||
 | 
					;http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					;Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					;distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					;See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					;limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Description message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__initial_sp    EQU     (0x01000000 + 0x5000 - 256)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                PRESERVE8
 | 
				
			||||||
 | 
					                THUMB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Vector Table Mapped to Address 0 at Reset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                AREA    RESET, DATA, READONLY
 | 
				
			||||||
 | 
					                EXPORT  __Vectors
 | 
				
			||||||
 | 
					                EXPORT  __Vectors_End
 | 
				
			||||||
 | 
					                EXPORT  __Vectors_Size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__Vectors       DCD     __initial_sp              ; Top of Stack
 | 
				
			||||||
 | 
					                DCD     Reset_Handler             ; Reset Handler
 | 
				
			||||||
 | 
					                DCD     NMI_Handler               ; NMI Handler
 | 
				
			||||||
 | 
					                DCD     HardFault_Handler         ; Hard Fault Handler
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     SVC_Handler               ; SVCall Handler
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     0                         ; Reserved
 | 
				
			||||||
 | 
					                DCD     PendSV_Handler            ; PendSV Handler
 | 
				
			||||||
 | 
					                DCD     SysTick_Handler           ; SysTick Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; External Interrupts
 | 
				
			||||||
 | 
					                DCD      IRQ0_RTC_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ1_TMR0_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ2_SECURITY_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ3_PROTOCOL_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ4_APPS_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ5_GPIO_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ6_DMA_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ7_UART0_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ8_UART1_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ9_SSP0_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ10_SSP1_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ11_PWM0IN_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ12_PWM0OUT_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ13_PWM1IN_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ14_PWM1OUT_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ15_I2C_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ16_LPUART_Handler
 | 
				
			||||||
 | 
					                DCD      IRQ17_CAP_Handler
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                DCD      0
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					__Vectors_End
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__Vectors_Size  EQU     __Vectors_End - __Vectors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                AREA    |.text|, CODE, READONLY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Reset Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reset_Handler   PROC
 | 
				
			||||||
 | 
					                EXPORT  Reset_Handler             [WEAK]
 | 
				
			||||||
 | 
					                IMPORT  SystemInit
 | 
				
			||||||
 | 
					                IMPORT  __main
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                LDR     R0, =SystemInit
 | 
				
			||||||
 | 
					                BLX     R0
 | 
				
			||||||
 | 
					                LDR     R0, =__main
 | 
				
			||||||
 | 
					                BX      R0
 | 
				
			||||||
 | 
					                ENDP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Dummy Exception Handlers (infinite loops which can be modified)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NMI_Handler     PROC
 | 
				
			||||||
 | 
					                EXPORT  NMI_Handler               [WEAK]
 | 
				
			||||||
 | 
					                B       .
 | 
				
			||||||
 | 
					                ENDP
 | 
				
			||||||
 | 
					HardFault_Handler\
 | 
				
			||||||
 | 
					                PROC
 | 
				
			||||||
 | 
					                EXPORT  HardFault_Handler         [WEAK]
 | 
				
			||||||
 | 
					                B       .
 | 
				
			||||||
 | 
					                ENDP
 | 
				
			||||||
 | 
					SVC_Handler     PROC
 | 
				
			||||||
 | 
					                EXPORT  SVC_Handler               [WEAK]
 | 
				
			||||||
 | 
					                B       .
 | 
				
			||||||
 | 
					                ENDP
 | 
				
			||||||
 | 
					PendSV_Handler  PROC
 | 
				
			||||||
 | 
					                EXPORT  PendSV_Handler            [WEAK]
 | 
				
			||||||
 | 
					                B       .
 | 
				
			||||||
 | 
					                ENDP
 | 
				
			||||||
 | 
					SysTick_Handler PROC
 | 
				
			||||||
 | 
					                EXPORT  SysTick_Handler           [WEAK]
 | 
				
			||||||
 | 
					                B       .
 | 
				
			||||||
 | 
					                ENDP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Default_Handler PROC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                EXPORT   IRQ0_RTC_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ1_TMR0_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ2_SECURITY_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ3_PROTOCOL_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ4_APPS_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ5_GPIO_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ6_DMA_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ7_UART0_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ8_UART1_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ9_SSP0_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ10_SSP1_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ11_PWM0IN_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ12_PWM0OUT_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ13_PWM1IN_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ14_PWM1OUT_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ15_I2C_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ16_LPUART_Handler [WEAK]
 | 
				
			||||||
 | 
					                EXPORT   IRQ17_CAP_Handler [WEAK]
 | 
				
			||||||
 | 
					IRQ0_RTC_Handler
 | 
				
			||||||
 | 
					IRQ1_TMR0_Handler
 | 
				
			||||||
 | 
					IRQ2_SECURITY_Handler
 | 
				
			||||||
 | 
					IRQ3_PROTOCOL_Handler
 | 
				
			||||||
 | 
					IRQ4_APPS_Handler
 | 
				
			||||||
 | 
					IRQ5_GPIO_Handler
 | 
				
			||||||
 | 
					IRQ6_DMA_Handler
 | 
				
			||||||
 | 
					IRQ7_UART0_Handler
 | 
				
			||||||
 | 
					IRQ8_UART1_Handler
 | 
				
			||||||
 | 
					IRQ9_SSP0_Handler
 | 
				
			||||||
 | 
					IRQ10_SSP1_Handler
 | 
				
			||||||
 | 
					IRQ11_PWM0IN_Handler
 | 
				
			||||||
 | 
					IRQ12_PWM0OUT_Handler
 | 
				
			||||||
 | 
					IRQ13_PWM1IN_Handler
 | 
				
			||||||
 | 
					IRQ14_PWM1OUT_Handler
 | 
				
			||||||
 | 
					IRQ15_I2C_Handler
 | 
				
			||||||
 | 
					IRQ16_LPUART_Handler
 | 
				
			||||||
 | 
					IRQ17_CAP_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                B .
 | 
				
			||||||
 | 
					                ENDP
 | 
				
			||||||
 | 
					                ALIGN
 | 
				
			||||||
 | 
					                END
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library - stackheap
 | 
				
			||||||
 | 
					 * Copyright (C) 2009-2016 ARM Limited. All rights reserved.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Setup a fixed single stack/heap memory model, 
 | 
				
			||||||
 | 
					 * between the top of the RW/ZI region and the stackpointer
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <rt_misc.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern char Image$$RW_IRAM1$$ZI$$Limit[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern __value_in_regs struct __initial_stackheap __user_setup_stackheap(uint32_t R0, uint32_t R1, uint32_t R2, uint32_t R3) {
 | 
				
			||||||
 | 
					    uint32_t zi_limit = (uint32_t)Image$$RW_IRAM1$$ZI$$Limit;
 | 
				
			||||||
 | 
					    uint32_t sp_limit = __current_sp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    zi_limit = (zi_limit + 7) & ~0x7;    // ensure zi_limit is 8-byte aligned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct __initial_stackheap r;
 | 
				
			||||||
 | 
					    r.heap_base = zi_limit;
 | 
				
			||||||
 | 
					    r.heap_limit = sp_limit;
 | 
				
			||||||
 | 
					    return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif 
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,170 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library */
 | 
				
			||||||
 | 
					/* Copyright (c) 2016 u-blox. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OUTPUT_FORMAT("elf32-littlearm")
 | 
				
			||||||
 | 
					OUTPUT_ARCH(arm)
 | 
				
			||||||
 | 
					ENTRY(Reset_Handler)
 | 
				
			||||||
 | 
					MEMORY
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    FLASH_VECTORS : ORIGIN = 0, LENGTH = 192
 | 
				
			||||||
 | 
					    FLASH : ORIGIN = (0 + 192), LENGTH = (0x20000 - 192)
 | 
				
			||||||
 | 
					    RAM_VECTORS : ORIGIN = 0, LENGTH = 128 /* Reserve space for dynamic vectors mapped to RAM (see cmsis_nvic.c) */
 | 
				
			||||||
 | 
					    RAM : ORIGIN = 0x01000000 + 128, LENGTH = 0x5000 - 256
 | 
				
			||||||
 | 
					    IPC_MAILBOX : ORIGIN = (0x01000000 + 128 + 0x5000 - 256), LENGTH = 256
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					SECTIONS
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Vector table in FLASH */
 | 
				
			||||||
 | 
					    . = 0;
 | 
				
			||||||
 | 
					    startup :
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KEEP (*(.isr_vector))
 | 
				
			||||||
 | 
					    } > FLASH_VECTORS
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Code and const data */
 | 
				
			||||||
 | 
					    .text :
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        . = ALIGN(4);
 | 
				
			||||||
 | 
					        *(.text)
 | 
				
			||||||
 | 
					        *(.text*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KEEP(*(.init))
 | 
				
			||||||
 | 
					        KEEP(*(.fini))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* .ctors */
 | 
				
			||||||
 | 
					        *crtbegin.o(.ctors)
 | 
				
			||||||
 | 
					        *crtbegin?.o(.ctors)
 | 
				
			||||||
 | 
					        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
 | 
				
			||||||
 | 
					        *(SORT(.ctors.*))
 | 
				
			||||||
 | 
					        *(.ctors)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* .dtors */
 | 
				
			||||||
 | 
					        *crtbegin.o(.dtors)
 | 
				
			||||||
 | 
					        *crtbegin?.o(.dtors)
 | 
				
			||||||
 | 
					        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
 | 
				
			||||||
 | 
					        *(SORT(.dtors.*))
 | 
				
			||||||
 | 
					        *(.dtors)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        *(.rodata)
 | 
				
			||||||
 | 
					        *(.rodata*)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        KEEP(*(.eh_frame*))
 | 
				
			||||||
 | 
					    } > FLASH
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    .ARM.exidx :
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        __exidx_start = .;
 | 
				
			||||||
 | 
					        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
 | 
				
			||||||
 | 
					        __exidx_end = .;
 | 
				
			||||||
 | 
					    } > FLASH
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    __etext = .;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .ARM.extab :
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        *(.ARM.extab* .gnu.linkonce.armextab.*)
 | 
				
			||||||
 | 
					    } > FLASH
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    __RAM_START__ = ORIGIN(RAM);
 | 
				
			||||||
 | 
					    __RAM_SIZE__ = LENGTH(RAM);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Initialised data */
 | 
				
			||||||
 | 
					    .data :
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        FILL(0xFF)
 | 
				
			||||||
 | 
					        __data_load__ = LOADADDR(.data);
 | 
				
			||||||
 | 
					        __data_start__ = .;
 | 
				
			||||||
 | 
					        *(.data)
 | 
				
			||||||
 | 
					        *(.data*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        . = ALIGN(4);
 | 
				
			||||||
 | 
					        /* preinit data */
 | 
				
			||||||
 | 
					        PROVIDE_HIDDEN (__preinit_array_start = .);
 | 
				
			||||||
 | 
					        KEEP(*(.preinit_array))
 | 
				
			||||||
 | 
					        PROVIDE_HIDDEN (__preinit_array_end = .);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        . = ALIGN(4);
 | 
				
			||||||
 | 
					        /* init data */
 | 
				
			||||||
 | 
					        PROVIDE_HIDDEN (__init_array_start = .);
 | 
				
			||||||
 | 
					        KEEP(*(SORT(.init_array.*)))
 | 
				
			||||||
 | 
					        KEEP(*(.init_array))
 | 
				
			||||||
 | 
					        PROVIDE_HIDDEN (__init_array_end = .);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        . = ALIGN(4);
 | 
				
			||||||
 | 
					        /* finit data */
 | 
				
			||||||
 | 
					        PROVIDE_HIDDEN (__fini_array_start = .);
 | 
				
			||||||
 | 
					        KEEP(*(SORT(.fini_array.*)))
 | 
				
			||||||
 | 
					        KEEP(*(.fini_array))
 | 
				
			||||||
 | 
					        PROVIDE_HIDDEN (__fini_array_end = .);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        __data_end__ = .;
 | 
				
			||||||
 | 
					    } > RAM AT > FLASH
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    __data_size__ = __data_end__ - __data_start__;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Uninitialised data */
 | 
				
			||||||
 | 
					    .bss (NOLOAD):
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        . = ALIGN(4);
 | 
				
			||||||
 | 
					        __bss_start__ = .;
 | 
				
			||||||
 | 
					        *(.bss)
 | 
				
			||||||
 | 
					        *(.bss*)
 | 
				
			||||||
 | 
					        *(COMMON)
 | 
				
			||||||
 | 
					        . = ALIGN(4);
 | 
				
			||||||
 | 
					        __bss_end__ = .;
 | 
				
			||||||
 | 
					    } > RAM
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    __bss_size__ = __bss_end__ - __bss_start__;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    .resume (NOLOAD):
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        . = ALIGN(4);
 | 
				
			||||||
 | 
					        *(preserve)
 | 
				
			||||||
 | 
					    } > RAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Heap fills the rest of the space up to the start of the stack */
 | 
				
			||||||
 | 
					    .heap (NOLOAD):
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        __end__ = .;
 | 
				
			||||||
 | 
					        end = __end__;
 | 
				
			||||||
 | 
					        __HeapBase = .;
 | 
				
			||||||
 | 
					        *(.heap*)
 | 
				
			||||||
 | 
					        . = ORIGIN(RAM) + LENGTH(RAM) - Stack_Size; /* Remember that LENGTH(RAM) is already reduced by the IPC block */
 | 
				
			||||||
 | 
					        __HeapLimit = .;
 | 
				
			||||||
 | 
					    } > RAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    PROVIDE(__heap_start = ADDR(.heap));
 | 
				
			||||||
 | 
					    PROVIDE(__heap_size = SIZEOF(.heap));
 | 
				
			||||||
 | 
					    PROVIDE(__mbed_sbrk_start = ADDR(.heap));
 | 
				
			||||||
 | 
					    PROVIDE(__mbed_krbs_start = ADDR(.heap) + SIZEOF(.heap));
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    /* .stack_dummy section doesn't contains any symbols. It is only
 | 
				
			||||||
 | 
					     * used for linker to calculate size of stack sections, and assign
 | 
				
			||||||
 | 
					     * values to stack symbols later */
 | 
				
			||||||
 | 
					    .stack_dummy (NOLOAD):
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        __SYSTEM_STACK_START__ = .;
 | 
				
			||||||
 | 
					        *(.stack*)
 | 
				
			||||||
 | 
					        __SYSTEM_STACK_END__ = .;
 | 
				
			||||||
 | 
					    } > RAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set stack top to end of RAM, and stack limit move down by
 | 
				
			||||||
 | 
					     * size of stack_dummy section */
 | 
				
			||||||
 | 
					    __StackTop = ORIGIN(RAM) + LENGTH(RAM); /* Remember that LENGTH(RAM) is already reduced by the IPC block */
 | 
				
			||||||
 | 
					    __StackLimit = __StackTop - SIZEOF(.stack_dummy);
 | 
				
			||||||
 | 
					    PROVIDE(__stack = __StackTop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Check if data + heap + stack exceeds RAM limit */
 | 
				
			||||||
 | 
					    ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* IPC mailboxes at the top of RAM */
 | 
				
			||||||
 | 
					    /* The size of this section (256 bytes) is already taken off the size of RAM so there is no danger of the heap overflowing into it */
 | 
				
			||||||
 | 
					    .ipc_mailbox (NOLOAD):
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        . = ALIGN(4);
 | 
				
			||||||
 | 
					        __ipc_mailbox_start__ = .;
 | 
				
			||||||
 | 
					        *(.ipc_mailbox)
 | 
				
			||||||
 | 
					        *(.ipc_mailbox*)
 | 
				
			||||||
 | 
					        __ipc_mailbox_end__ = .;
 | 
				
			||||||
 | 
					    } > IPC_MAILBOX
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,254 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					    .syntax unified
 | 
				
			||||||
 | 
					    .cpu    cortex-m0
 | 
				
			||||||
 | 
					    .fpu    softvfp
 | 
				
			||||||
 | 
					    .thumb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Setup the stack
 | 
				
			||||||
 | 
					 *  Since it grows downward the stack_system is the first location is the highest address
 | 
				
			||||||
 | 
					 *  The first other usage should therefore be at stack_system + 4
 | 
				
			||||||
 | 
					 *  Should the stack overflow, there would be a hard fault in the core
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .section .stacks,"aw",%progbits
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __STACK_SIZE
 | 
				
			||||||
 | 
					    .equ    Stack_Size, __STACK_SIZE
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    .equ    Stack_Size, 1024
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    .globl    Stack_Size
 | 
				
			||||||
 | 
					    .globl    __StackTop
 | 
				
			||||||
 | 
					    .globl    __StackLimit
 | 
				
			||||||
 | 
					    .align  2
 | 
				
			||||||
 | 
					    .type   stack_system, %object
 | 
				
			||||||
 | 
					    .size   stack_system, Stack_Size
 | 
				
			||||||
 | 
					stack_system_end:
 | 
				
			||||||
 | 
					    .space  Stack_Size - 4
 | 
				
			||||||
 | 
					stack_system:
 | 
				
			||||||
 | 
					    .space  4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This is the code that gets called when the processor first
 | 
				
			||||||
 | 
					 * starts execution following a reset event. Only the absolutely
 | 
				
			||||||
 | 
					 * necessary set is performed, after which the application
 | 
				
			||||||
 | 
					 * supplied main() routine is called.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					        .section        .text.Reset_Handler,"ax",%progbits
 | 
				
			||||||
 | 
					        .weak           Reset_Handler
 | 
				
			||||||
 | 
					        .type           Reset_Handler, %function
 | 
				
			||||||
 | 
					        .thumb
 | 
				
			||||||
 | 
					        .func           Reset_Handler
 | 
				
			||||||
 | 
					Reset_Handler:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Make sure SP is really at the start of the stack */
 | 
				
			||||||
 | 
					        ldr     r0, =stack_system
 | 
				
			||||||
 | 
					        msr     msp, r0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Prefill the system stack with 0xefbeadde (or deafbeef in little endian) */
 | 
				
			||||||
 | 
					        ldr     r1, =__SYSTEM_STACK_START__
 | 
				
			||||||
 | 
					        ldr     r3, =__SYSTEM_STACK_END__
 | 
				
			||||||
 | 
					        subs    r3, r3, r1
 | 
				
			||||||
 | 
					        beq     .stack_fill_loop_end
 | 
				
			||||||
 | 
					        ldr     r2, =0xefbeadde
 | 
				
			||||||
 | 
					.stack_fill_loop:
 | 
				
			||||||
 | 
					        str     r2, [r1, #0]           /* Store the quad octet initialisation value in r2 into address in r1 */
 | 
				
			||||||
 | 
					        adds    r1, r1, #4             /* Increased address in r1 by a quad octet */
 | 
				
			||||||
 | 
					        subs    r3, r3, #4             /* Decrease the number of bytes to do by a quad octet */
 | 
				
			||||||
 | 
					        bgt     .stack_fill_loop       /* Keep going until it is all done */
 | 
				
			||||||
 | 
					.stack_fill_loop_end:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* setup .data section */
 | 
				
			||||||
 | 
					        ldr     r1, =__data_start__
 | 
				
			||||||
 | 
					        ldr     r2, =__data_load__
 | 
				
			||||||
 | 
					        ldr     r3, =__data_size__
 | 
				
			||||||
 | 
					        cmp     r3, #0
 | 
				
			||||||
 | 
					        beq     .end_set_data_loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.set_data_loop:
 | 
				
			||||||
 | 
					        ldrb    r4, [r2, #0]           /* Load the octet value into r4 from address in r2 */
 | 
				
			||||||
 | 
					        strb    r4, [r1, #0]           /* Store the octet value in r4 to address in r1 */
 | 
				
			||||||
 | 
					        adds    r2, r2, #1             /* Move onto next octet */
 | 
				
			||||||
 | 
					        adds    r1, r1, #1
 | 
				
			||||||
 | 
					        subs    r3, r3, #1             /* Decrease the number of bytes to do by an octet */
 | 
				
			||||||
 | 
					        bgt     .set_data_loop         /* Keep going until it is all done */
 | 
				
			||||||
 | 
					.end_set_data_loop:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Call init function */
 | 
				
			||||||
 | 
					        ldr     r0, =SystemInit
 | 
				
			||||||
 | 
					        blx     r0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Call C++ startup */
 | 
				
			||||||
 | 
					        ldr     r0, =_start
 | 
				
			||||||
 | 
					        bx      r0
 | 
				
			||||||
 | 
					        bl      .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .size  Reset_Handler, .-Reset_Handler
 | 
				
			||||||
 | 
					        .endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This is the code that gets called when the processor receives an
 | 
				
			||||||
 | 
					 * unexpected interrupt.  This simply enters an infinite loop, preserving
 | 
				
			||||||
 | 
					 * the system state for examination by a debugger.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					        .section        .text.Default_Handler,"ax",%progbits
 | 
				
			||||||
 | 
					        .global         Default_Handler
 | 
				
			||||||
 | 
					        .func           Default_Handler
 | 
				
			||||||
 | 
					Default_Handler:
 | 
				
			||||||
 | 
					Infinite_Loop:
 | 
				
			||||||
 | 
					        b       Infinite_Loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .endfunc
 | 
				
			||||||
 | 
					        .size  Default_Handler, .-Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/******************************************************************************
 | 
				
			||||||
 | 
					 * The minimal vector table for a Cortex M0+. Note that the proper constructs
 | 
				
			||||||
 | 
					 * must be placed on this to ensure that it ends up at physical address 0x0000.0000.
 | 
				
			||||||
 | 
					 *******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .section        .isr_vector,"a",%progbits
 | 
				
			||||||
 | 
					        .type           g_pfnVectors, %object
 | 
				
			||||||
 | 
					        .size           g_pfnVectors, .-g_pfnVectors
 | 
				
			||||||
 | 
					        .global         g_pfnVectors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					g_pfnVectors:
 | 
				
			||||||
 | 
					        .word   stack_system
 | 
				
			||||||
 | 
					        .word   Reset_Handler
 | 
				
			||||||
 | 
					        .word   NMI_Handler
 | 
				
			||||||
 | 
					        .word   HardFault_Handler
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   SVC_Handler
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   PendSV_Handler
 | 
				
			||||||
 | 
					        .word   SysTick_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* External Interrupts */
 | 
				
			||||||
 | 
					        .word   IRQ0_RTC_Handler
 | 
				
			||||||
 | 
					        .word   IRQ1_TMR0_Handler
 | 
				
			||||||
 | 
					        .word   IRQ2_SECURITY_Handler
 | 
				
			||||||
 | 
					        .word   IRQ3_PROTOCOL_Handler
 | 
				
			||||||
 | 
					        .word   IRQ4_APPS_Handler
 | 
				
			||||||
 | 
					        .word   IRQ5_GPIO_Handler
 | 
				
			||||||
 | 
					        .word   IRQ6_DMA_Handler
 | 
				
			||||||
 | 
					        .word   IRQ7_UART0_Handler
 | 
				
			||||||
 | 
					        .word   IRQ8_UART1_Handler
 | 
				
			||||||
 | 
					        .word   IRQ9_SSP0_Handler
 | 
				
			||||||
 | 
					        .word   IRQ10_SSP1_Handler
 | 
				
			||||||
 | 
					        .word   IRQ11_PWM0IN_Handler
 | 
				
			||||||
 | 
					        .word   IRQ12_PWM0OUT_Handler
 | 
				
			||||||
 | 
					        .word   IRQ13_PWM1IN_Handler
 | 
				
			||||||
 | 
					        .word   IRQ14_PWM1OUT_Handler
 | 
				
			||||||
 | 
					        .word   IRQ15_I2C_Handler
 | 
				
			||||||
 | 
					        .word   IRQ16_LPUART_Handler
 | 
				
			||||||
 | 
					        .word   IRQ17_CAP_Handler
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					        .word   0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Provide weak aliases for each Exception handler to the Default_Handler.
 | 
				
			||||||
 | 
					 * As they are weak aliases, any function with the same name will override this definition.
 | 
				
			||||||
 | 
					 * Note: For system exception handlers we don't want those references to be weak
 | 
				
			||||||
 | 
					 * - we want to force someone to write those handlers.
 | 
				
			||||||
 | 
					 *******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       NMI_Handler
 | 
				
			||||||
 | 
					        .thumb_set  NMI_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       HardFault_Handler
 | 
				
			||||||
 | 
					        .thumb_set  HardFault_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       SVC_Handler
 | 
				
			||||||
 | 
					        .thumb_set  SVC_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       PendSV_Handler
 | 
				
			||||||
 | 
					        .thumb_set  PendSV_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       SysTick_Handler
 | 
				
			||||||
 | 
					        .thumb_set  SysTick_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ0_RTC_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ0_RTC_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ1_TMR0_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ1_TMR0_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ2_SECURITY_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ2_SECURITY_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ3_PROTOCOL_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ3_PROTOCOL_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ4_APPS_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ4_APPS_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ5_GPIO_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ5_GPIO_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ6_DMA_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ6_DMA_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ7_UART0_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ7_UART0_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ8_UART1_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ8_UART1_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ9_SSP0_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ9_SSP0_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ10_SSP1_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ10_SSP1_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ11_PWM0IN_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ11_PWM0IN_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ12_PWM0OUT_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ12_PWM0OUT_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ13_PWM1IN_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ13_PWM1IN_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ14_PWM1OUT_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ14_PWM1OUT_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ15_I2C_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ15_I2C_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ16_LPUART_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ16_LPUART_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .weak       IRQ17_CAP_Handler
 | 
				
			||||||
 | 
					        .thumb_set  IRQ17_CAP_Handler,Default_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,60 @@
 | 
				
			||||||
 | 
					/* Sizes and locations */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define symbol __start_flash__       = 0x00000000;
 | 
				
			||||||
 | 
					define symbol __size_flash__        = 0x20000;
 | 
				
			||||||
 | 
					define symbol __start_ram__         = 0x01000000;
 | 
				
			||||||
 | 
					define symbol __size_ram__          = 0x5000;
 | 
				
			||||||
 | 
					define symbol __size_flash_vtable__ = 192;
 | 
				
			||||||
 | 
					define symbol __size_ram_vtable__   = 128;  /* Reserve space for dynamic vectors mapped to RAM (see cmsis_nvic.c) */
 | 
				
			||||||
 | 
					define symbol __size_ipc__          = 256;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (isdefinedsymbol(__stack_size__)) {
 | 
				
			||||||
 | 
					  define symbol __size_cstack__        = __stack_size__;
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  define symbol __size_cstack__        = 1024;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (isdefinedsymbol(__heap_size__)) {
 | 
				
			||||||
 | 
					  define symbol __size_heap__          = __heap_size__;
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  define symbol __size_heap__          = (1024 * 8);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Memory regions */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define symbol __region_INTVEC_FLASH_start__ = __start_flash__;
 | 
				
			||||||
 | 
					define symbol __region_INTVEC_FLASH_end__   = __start_flash__ + __size_flash_vtable__ - 1;
 | 
				
			||||||
 | 
					define symbol __region_TEXT_start__         = __start_flash__ + __size_flash_vtable__; /* Leave room for flash vector table at start */
 | 
				
			||||||
 | 
					define symbol __region_TEXT_end__           = __start_flash__ + __size_flash__ - 1;
 | 
				
			||||||
 | 
					define symbol __region_INTVEC_RAM_start__   = __start_ram__;
 | 
				
			||||||
 | 
					define symbol __region_DATA_start__         = __start_ram__ + __size_ram_vtable__;  /* Leave room for RAM vector table at start */
 | 
				
			||||||
 | 
					define symbol __region_DATA_end__           = __start_ram__ + __size_ram__ - __size_cstack__ - __size_ipc__ - 1; /* Leave room for IPC and stack at end */
 | 
				
			||||||
 | 
					define symbol __region_CSTACK_start__       = __start_ram__ + __size_ram__ - __size_cstack__ - __size_ipc__;
 | 
				
			||||||
 | 
					define symbol __region_CSTACK_end__         = __start_ram__ + __size_ram__ - __size_ipc__ - 1;
 | 
				
			||||||
 | 
					define symbol __region_IPC_start__          = __start_ram__ + __size_ram__ - __size_ipc__;
 | 
				
			||||||
 | 
					define symbol __region_IPC_end__            = __start_ram__ + __size_ram__ - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define memory mem with size = 4G;
 | 
				
			||||||
 | 
					define region FLASH_region   = mem:[from __region_INTVEC_FLASH_start__ to __region_INTVEC_FLASH_end__] | mem:[from __region_TEXT_start__ to __region_TEXT_end__];
 | 
				
			||||||
 | 
					define region DATA_region    = mem:[from __region_DATA_start__ to __region_DATA_end__];
 | 
				
			||||||
 | 
					define region CSTACK_region  = mem:[from __region_CSTACK_start__ to __region_CSTACK_end__];
 | 
				
			||||||
 | 
					define region IPC_region     = mem:[from __region_IPC_start__ to __region_IPC_end__];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define block CSTACK     with alignment = 8, size = __size_cstack__     { };
 | 
				
			||||||
 | 
					define block HEAP       with alignment = 8, size = __size_heap__       { };
 | 
				
			||||||
 | 
					define block RW         { readwrite };
 | 
				
			||||||
 | 
					define block ZI         { zi };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Place sections */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					initialize by copy { readwrite };
 | 
				
			||||||
 | 
					do not initialize  { section .noinit };
 | 
				
			||||||
 | 
					do not initialize  { section .ipc };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					place at address mem:__region_INTVEC_FLASH_start__ { readonly section .intvec };
 | 
				
			||||||
 | 
					place in FLASH_region  { readonly };
 | 
				
			||||||
 | 
					place in DATA_region   { block RW };
 | 
				
			||||||
 | 
					place in DATA_region   { block ZI };
 | 
				
			||||||
 | 
					place in DATA_region   { last block HEAP };
 | 
				
			||||||
 | 
					place in CSTACK_region { block CSTACK };
 | 
				
			||||||
 | 
					place in IPC_region    { section .ipc };
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,202 @@
 | 
				
			||||||
 | 
					; mbed Microcontroller Library
 | 
				
			||||||
 | 
					; Copyright (c) 2016 u-blox.
 | 
				
			||||||
 | 
					; Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					; you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					; You may obtain a copy of the License at
 | 
				
			||||||
 | 
					; http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					; Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					; distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					; See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					; limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Description message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        MODULE  ?cstartup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ; Stack size default : 1024
 | 
				
			||||||
 | 
					        ; Heap size default : 2048
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ; Forward declaration of sections.
 | 
				
			||||||
 | 
					        SECTION CSTACK:DATA:NOROOT(3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        SECTION .intvec:CODE:NOROOT(2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        EXTERN  __iar_program_start
 | 
				
			||||||
 | 
					        EXTERN  SystemInit
 | 
				
			||||||
 | 
					        PUBLIC  __vector_table
 | 
				
			||||||
 | 
					        PUBLIC  __Vectors
 | 
				
			||||||
 | 
					        PUBLIC  __Vectors_End
 | 
				
			||||||
 | 
					        PUBLIC  __Vectors_Size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        DATA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__vector_table
 | 
				
			||||||
 | 
					        DCD     sfe(CSTACK)
 | 
				
			||||||
 | 
					        DCD     Reset_Handler
 | 
				
			||||||
 | 
					        DCD     NMI_Handler
 | 
				
			||||||
 | 
					        DCD     HardFault_Handler
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     SVC_Handler
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     0
 | 
				
			||||||
 | 
					        DCD     PendSV_Handler
 | 
				
			||||||
 | 
					        DCD     SysTick_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; External Interrupts
 | 
				
			||||||
 | 
					        DCD      IRQ0_RTC_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ1_TMR0_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ2_SECURITY_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ3_PROTOCOL_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ4_APPS_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ5_GPIO_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ6_DMA_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ7_UART0_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ8_UART1_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ9_SSP0_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ10_SSP1_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ11_PWM0IN_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ12_PWM0OUT_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ13_PWM1IN_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ14_PWM1OUT_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ15_I2C_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ16_LPUART_Handler
 | 
				
			||||||
 | 
					        DCD      IRQ17_CAP_Handler
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					        DCD      0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__Vectors_End
 | 
				
			||||||
 | 
					__Vectors                           EQU   __vector_table
 | 
				
			||||||
 | 
					__Vectors_Size                      EQU   __Vectors_End - __Vectors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Default handlers.
 | 
				
			||||||
 | 
					        THUMB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUBWEAK Reset_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(2)
 | 
				
			||||||
 | 
					Reset_Handler
 | 
				
			||||||
 | 
					        LDR     R0, =SystemInit
 | 
				
			||||||
 | 
					        BLX     R0
 | 
				
			||||||
 | 
					        LDR     R0, =__iar_program_start
 | 
				
			||||||
 | 
					        BX      R0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ; Dummy exception handlers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUBWEAK NMI_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					NMI_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUBWEAK HardFault_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					HardFault_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUBWEAK SVC_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					SVC_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUBWEAK PendSV_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					PendSV_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUBWEAK SysTick_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					SysTick_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       ; Dummy interrupt handlers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ0_RTC_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ0_RTC_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ1_TMR0_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ1_TMR0_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ2_SECURITY_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ2_SECURITY_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ3_PROTOCOL_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ3_PROTOCOL_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ4_APPS_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ4_APPS_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ5_GPIO_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ5_GPIO_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ6_DMA_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ6_DMA_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ7_UART0_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ7_UART0_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ8_UART1_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ8_UART1_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ9_SSP0_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ9_SSP0_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ10_SSP1_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ10_SSP1_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ11_PWM0IN_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ11_PWM0IN_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ12_PWM0OUT_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ12_PWM0OUT_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ13_PWM1IN_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ13_PWM1IN_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ14_PWM1OUT_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ14_PWM1OUT_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ15_I2C_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ15_I2C_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ16_LPUART_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ16_LPUART_Handler
 | 
				
			||||||
 | 
					        B .
 | 
				
			||||||
 | 
					        PUBWEAK  IRQ17_CAP_Handler
 | 
				
			||||||
 | 
					        SECTION .text:CODE:REORDER:NOROOT(1)
 | 
				
			||||||
 | 
					IRQ17_CAP_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        END
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * PackageLicenseDeclared: Apache-2.0
 | 
				
			||||||
 | 
					 * Copyright (c) 2015 ARM Limited
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MBED_CMSIS_H
 | 
				
			||||||
 | 
					#define MBED_CMSIS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "hi2110.h"
 | 
				
			||||||
 | 
					#include "cmsis_nvic.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**  Reference clock in Hz */
 | 
				
			||||||
 | 
					#define CLOCKS_REFERENCE_CLOCK_FREQ   32768
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * CMSIS-style functionality to support dynamic vectors
 | 
				
			||||||
 | 
					 *******************************************************************************
 | 
				
			||||||
 | 
					 * Copyright (c) 2011 ARM Limited. All rights reserved.
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 1. Redistributions of source code must retain the above copyright notice,
 | 
				
			||||||
 | 
					 *    this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
				
			||||||
 | 
					 *    this list of conditions and the following disclaimer in the documentation
 | 
				
			||||||
 | 
					 *    and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 * 3. Neither the name of ARM Limited nor the names of its contributors
 | 
				
			||||||
 | 
					 *    may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *    without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
				
			||||||
 | 
					 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
				
			||||||
 | 
					 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
				
			||||||
 | 
					 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 | 
					 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 *******************************************************************************
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#include "cmsis_nvic.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NVIC_RAM_VECTOR_ADDRESS   (0x01000000)  // Location of vectors in RAM
 | 
				
			||||||
 | 
					#define NVIC_FLASH_VECTOR_ADDRESS (0x0)         // Initial vector position in flash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
 | 
				
			||||||
 | 
					    // Space for dynamic vectors, initialised to allocate in R/W
 | 
				
			||||||
 | 
					    static volatile uint32_t* vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Set the vector
 | 
				
			||||||
 | 
					    vectors[IRQn + 16] = vector;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t NVIC_GetVector(IRQn_Type IRQn) {
 | 
				
			||||||
 | 
					    // We can always read vectors at 0x0, as the addresses are remapped
 | 
				
			||||||
 | 
					    uint32_t *vectors = (uint32_t*)0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Return the vector
 | 
				
			||||||
 | 
					    return vectors[IRQn + 16];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * PackageLicenseDeclared: Apache-2.0
 | 
				
			||||||
 | 
					 * Copyright (c) 2015 ARM Limited
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MBED_CMSIS_NVIC_H
 | 
				
			||||||
 | 
					#define MBED_CMSIS_NVIC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NVIC_NUM_VECTORS      (16 + 32)   // CORE + MCU Peripherals
 | 
				
			||||||
 | 
					#define NVIC_USER_IRQ_OFFSET  16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cmsis.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector);
 | 
				
			||||||
 | 
					uint32_t NVIC_GetVector(IRQn_Type IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,492 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef HI2110_H
 | 
				
			||||||
 | 
					#define HI2110_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					 extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/******************************************************************************/
 | 
				
			||||||
 | 
					/*                Processor and Core Peripherals                              */
 | 
				
			||||||
 | 
					/******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * ==========================================================================
 | 
				
			||||||
 | 
					 * ---------- Interrupt Number Definition -----------------------------------
 | 
				
			||||||
 | 
					 * ==========================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum IRQn
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					/******  Cortex-M0 Processor Exceptions Numbers ***************************************************/
 | 
				
			||||||
 | 
					  Thread_mode                   = -16,      /*!<  0 Thread mode                                   */
 | 
				
			||||||
 | 
					  NonMaskableInt_IRQn           = -14,      /*!<  2 Non Maskable Interrupt                        */
 | 
				
			||||||
 | 
					  HardFault_IRQn                = -13,      /*!<  3 Hard Fault Interrupt                          */
 | 
				
			||||||
 | 
					  SVCall_IRQn                   = -5,       /*!< 11 SV Call Interrupt                             */
 | 
				
			||||||
 | 
					  PendSV_IRQn                   = -2,       /*!< 14 Pend SV Interrupt                             */
 | 
				
			||||||
 | 
					  SysTick_IRQn                  = -1,       /*!< 15 System Tick Interrupt                         */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/******  Device Specific Interrupt Numbers ********************************************************/
 | 
				
			||||||
 | 
					  RTC_IRQn                      = 0,        /*!< RTC Interrupt                                    */
 | 
				
			||||||
 | 
					  Timer_IRQn                    = 1,        /*!< Timer Interrupt                                  */
 | 
				
			||||||
 | 
					  Security_IRQn                 = 2,        /*!< From Security Interrupt                          */
 | 
				
			||||||
 | 
					  Protocol_IRQn                 = 3,        /*!< From Protocol Interrupt                          */
 | 
				
			||||||
 | 
					  Apps_IRQn                     = 4,        /*!< Core Self Interrupt                              */
 | 
				
			||||||
 | 
					  GPIO_IRQn                     = 5,        /*!< GPIO Interrupt                                   */
 | 
				
			||||||
 | 
					  DMA_IRQn                      = 6,        /*!< DMA Interrupt                                    */
 | 
				
			||||||
 | 
					  UART0_IRQn                    = 7,        /*!< UART0 Interrupt                                  */
 | 
				
			||||||
 | 
					  UART1_IRQn                    = 8,        /*!< UART1 Interrupt                                  */
 | 
				
			||||||
 | 
					  SSP0_IRQn                     = 9,        /*!< SPI0 Interrupt                                   */
 | 
				
			||||||
 | 
					  SSP1_IRQn                     = 10,       /*!< SPI1 Interrupt                                   */
 | 
				
			||||||
 | 
					  PWM0_Inner_IRQn               = 11,       /*!< PW0 Inner Interrupt                              */
 | 
				
			||||||
 | 
					  PWM0_Outer_IRQn               = 12,       /*!< PW0 Outer Interrupt                              */
 | 
				
			||||||
 | 
					  PWM1_Inner_IRQn               = 13,       /*!< PW1 Inner Interrupt                              */
 | 
				
			||||||
 | 
					  PWM1_Outer_IRQn               = 14,       /*!< PW1 Outer Interrupt                              */
 | 
				
			||||||
 | 
					  I2C_IRQn                      = 15,       /*!< I2C Interrupt                                    */
 | 
				
			||||||
 | 
					  LPUART_IRQn                   = 16,       /*!< Low Power UART Interrupt                         */
 | 
				
			||||||
 | 
					  CAP_IRQn                      = 17,       /*!< CAP Interrupt                                    */
 | 
				
			||||||
 | 
					  COMP_IRQn                     = 18,       /*!< COMP Interrupt                                   */
 | 
				
			||||||
 | 
					  EDGE_IRQn                     = 19,       /*!< EDGE Interrupt                                   */
 | 
				
			||||||
 | 
					  Pulse_SWD_IRQn                = 23,       /*!< SWD Pulse Interrupt                              */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} IRQn_Type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * ==========================================================================
 | 
				
			||||||
 | 
					 * ----------- Processor and Core Peripheral Section ------------------------
 | 
				
			||||||
 | 
					 * ==========================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Configuration of the Cortex-M# Processor and Core Peripherals */
 | 
				
			||||||
 | 
					#define __CM0_REV                 0x0000    /*!< Core Revision r2p1                               */
 | 
				
			||||||
 | 
					#define __NVIC_PRIO_BITS          2         /*!< Number of Bits used for Priority Levels          */
 | 
				
			||||||
 | 
					#define __Vendor_SysTickConfig    0         /*!< Set to 1 if different SysTick Config is used     */
 | 
				
			||||||
 | 
					#define __MPU_PRESENT             0         /*!< MPU present or not                               */
 | 
				
			||||||
 | 
					#define __FPU_PRESENT             0         /*!< FPU present or not                               */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <core_cm0.h>                       /* Cortex-M# processor and core peripherals */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/******************************************************************************/
 | 
				
			||||||
 | 
					/*                Device Specific Peripheral registers structures             */
 | 
				
			||||||
 | 
					/******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* UART */
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    uint32_t UARTDR;
 | 
				
			||||||
 | 
					    uint32_t UARTRSR;
 | 
				
			||||||
 | 
					    uint32_t res0;
 | 
				
			||||||
 | 
					    uint32_t res1;
 | 
				
			||||||
 | 
					    uint32_t res2;
 | 
				
			||||||
 | 
					    uint32_t res3;
 | 
				
			||||||
 | 
					    uint32_t UARTFR;
 | 
				
			||||||
 | 
					    uint32_t res4;
 | 
				
			||||||
 | 
					    uint32_t UARTILPR;
 | 
				
			||||||
 | 
					    uint32_t UARTIBRD; // Integer baud divider
 | 
				
			||||||
 | 
					    uint32_t UARTFBRD; // Fractional Baud divider
 | 
				
			||||||
 | 
					    uint32_t UARTLCR_H;
 | 
				
			||||||
 | 
					    uint32_t UARTCR;
 | 
				
			||||||
 | 
					    uint32_t UARTIFLS;
 | 
				
			||||||
 | 
					    uint32_t UARTIMSC;
 | 
				
			||||||
 | 
					    uint32_t UARTRIS;
 | 
				
			||||||
 | 
					    uint32_t UARTMIS;
 | 
				
			||||||
 | 
					    uint32_t UARTICR;
 | 
				
			||||||
 | 
					    uint32_t UARTDMACR;
 | 
				
			||||||
 | 
					} uart_ctrl_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/******************************************************************************/
 | 
				
			||||||
 | 
					/*                         Peripheral memory map                              */
 | 
				
			||||||
 | 
					/******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RTC_IRQ_TIME_LSBS (*(volatile uint32_t *)(0x40002000))
 | 
				
			||||||
 | 
					#define RTC_IRQ_TIME_LSBS_BITSET (*(volatile uint32_t *)(0x40002400))
 | 
				
			||||||
 | 
					#define RTC_IRQ_TIME_LSBS_BITCLR (*(volatile uint32_t *)(0x40002800))
 | 
				
			||||||
 | 
					#define RTC_IRQ_TIME_LSBS_BITTOG (*(volatile uint32_t *)(0x40002C00))
 | 
				
			||||||
 | 
					#define RTC_IRQ_TIME_MSBS (*(volatile uint32_t *)(0x40002004))
 | 
				
			||||||
 | 
					#define RTC_IRQ_TIME_MSBS_BITSET (*(volatile uint32_t *)(0x40002404))
 | 
				
			||||||
 | 
					#define RTC_IRQ_TIME_MSBS_BITCLR (*(volatile uint32_t *)(0x40002804))
 | 
				
			||||||
 | 
					#define RTC_IRQ_TIME_MSBS_BITTOG (*(volatile uint32_t *)(0x40002C04))
 | 
				
			||||||
 | 
					#define RTC_IRQ_CLR (*(volatile uint32_t *)(0x40002008))
 | 
				
			||||||
 | 
					#define RTC_IRQ_CLR_BITSET (*(volatile uint32_t *)(0x40002408))
 | 
				
			||||||
 | 
					#define RTC_IRQ_CLR_BITCLR (*(volatile uint32_t *)(0x40002808))
 | 
				
			||||||
 | 
					#define RTC_IRQ_CLR_BITTOG (*(volatile uint32_t *)(0x40002C08))
 | 
				
			||||||
 | 
					#define TIMER0_LOAD (*(volatile uint32_t *)(0x4000200C))
 | 
				
			||||||
 | 
					#define TIMER0_LOAD_BITSET (*(volatile uint32_t *)(0x4000240C))
 | 
				
			||||||
 | 
					#define TIMER0_LOAD_BITCLR (*(volatile uint32_t *)(0x4000280C))
 | 
				
			||||||
 | 
					#define TIMER0_LOAD_BITTOG (*(volatile uint32_t *)(0x40002C0C))
 | 
				
			||||||
 | 
					#define TIMER0_CTRL (*(volatile uint32_t *)(0x40002010))
 | 
				
			||||||
 | 
					#define TIMER0_CTRL_BITSET (*(volatile uint32_t *)(0x40002410))
 | 
				
			||||||
 | 
					#define TIMER0_CTRL_BITCLR (*(volatile uint32_t *)(0x40002810))
 | 
				
			||||||
 | 
					#define TIMER0_CTRL_BITTOG (*(volatile uint32_t *)(0x40002C10))
 | 
				
			||||||
 | 
					#define TIMER0_TIME (*(volatile uint32_t *)(0x40002014))
 | 
				
			||||||
 | 
					#define ARM_IRQ_REG (*(volatile uint32_t *)(0x40002018))
 | 
				
			||||||
 | 
					#define ARM_IRQ_REG_BITSET (*(volatile uint32_t *)(0x40002418))
 | 
				
			||||||
 | 
					#define ARM_IRQ_REG_BITCLR (*(volatile uint32_t *)(0x40002818))
 | 
				
			||||||
 | 
					#define ARM_IRQ_REG_BITTOG (*(volatile uint32_t *)(0x40002C18))
 | 
				
			||||||
 | 
					#define PIO_FUNC0 (*(volatile uint32_t *)(0x4000201C))
 | 
				
			||||||
 | 
					#define PIO_FUNC0_BITSET (*(volatile uint32_t *)(0x4000241C))
 | 
				
			||||||
 | 
					#define PIO_FUNC0_BITCLR (*(volatile uint32_t *)(0x4000281C))
 | 
				
			||||||
 | 
					#define PIO_FUNC0_BITTOG (*(volatile uint32_t *)(0x40002C1C))
 | 
				
			||||||
 | 
					#define PIO_FUNC1 (*(volatile uint32_t *)(0x40002020))
 | 
				
			||||||
 | 
					#define PIO_FUNC1_BITSET (*(volatile uint32_t *)(0x40002420))
 | 
				
			||||||
 | 
					#define PIO_FUNC1_BITCLR (*(volatile uint32_t *)(0x40002820))
 | 
				
			||||||
 | 
					#define PIO_FUNC1_BITTOG (*(volatile uint32_t *)(0x40002C20))
 | 
				
			||||||
 | 
					#define PIO_FUNC2 (*(volatile uint32_t *)(0x40002024))
 | 
				
			||||||
 | 
					#define PIO_FUNC2_BITSET (*(volatile uint32_t *)(0x40002424))
 | 
				
			||||||
 | 
					#define PIO_FUNC2_BITCLR (*(volatile uint32_t *)(0x40002824))
 | 
				
			||||||
 | 
					#define PIO_FUNC2_BITTOG (*(volatile uint32_t *)(0x40002C24))
 | 
				
			||||||
 | 
					#define PIO_FUNC3 (*(volatile uint32_t *)(0x40002028))
 | 
				
			||||||
 | 
					#define PIO_FUNC3_BITSET (*(volatile uint32_t *)(0x40002428))
 | 
				
			||||||
 | 
					#define PIO_FUNC3_BITCLR (*(volatile uint32_t *)(0x40002828))
 | 
				
			||||||
 | 
					#define PIO_FUNC3_BITTOG (*(volatile uint32_t *)(0x40002C28))
 | 
				
			||||||
 | 
					#define PIO_FUNC4 (*(volatile uint32_t *)(0x4000202C))
 | 
				
			||||||
 | 
					#define PIO_FUNC4_BITSET (*(volatile uint32_t *)(0x4000242C))
 | 
				
			||||||
 | 
					#define PIO_FUNC4_BITCLR (*(volatile uint32_t *)(0x4000282C))
 | 
				
			||||||
 | 
					#define PIO_FUNC4_BITTOG (*(volatile uint32_t *)(0x40002C2C))
 | 
				
			||||||
 | 
					#define GPIO_DIR (*(volatile uint32_t *)(0x40002030))
 | 
				
			||||||
 | 
					#define GPIO_DIR_BITSET (*(volatile uint32_t *)(0x40002430))
 | 
				
			||||||
 | 
					#define GPIO_DIR_BITCLR (*(volatile uint32_t *)(0x40002830))
 | 
				
			||||||
 | 
					#define GPIO_DIR_BITTOG (*(volatile uint32_t *)(0x40002C30))
 | 
				
			||||||
 | 
					#define GPIO_OUT (*(volatile uint32_t *)(0x40002034))
 | 
				
			||||||
 | 
					#define GPIO_OUT_BITSET (*(volatile uint32_t *)(0x40002434))
 | 
				
			||||||
 | 
					#define GPIO_OUT_BITCLR (*(volatile uint32_t *)(0x40002834))
 | 
				
			||||||
 | 
					#define GPIO_OUT_BITTOG (*(volatile uint32_t *)(0x40002C34))
 | 
				
			||||||
 | 
					#define GPIO_DRIVE (*(volatile uint32_t *)(0x40002038))
 | 
				
			||||||
 | 
					#define GPIO_DRIVE_BITSET (*(volatile uint32_t *)(0x40002438))
 | 
				
			||||||
 | 
					#define GPIO_DRIVE_BITCLR (*(volatile uint32_t *)(0x40002838))
 | 
				
			||||||
 | 
					#define GPIO_DRIVE_BITTOG (*(volatile uint32_t *)(0x40002C38))
 | 
				
			||||||
 | 
					#define GPIO_PULLEN (*(volatile uint32_t *)(0x4000203C))
 | 
				
			||||||
 | 
					#define GPIO_PULLEN_BITSET (*(volatile uint32_t *)(0x4000243C))
 | 
				
			||||||
 | 
					#define GPIO_PULLEN_BITCLR (*(volatile uint32_t *)(0x4000283C))
 | 
				
			||||||
 | 
					#define GPIO_PULLEN_BITTOG (*(volatile uint32_t *)(0x40002C3C))
 | 
				
			||||||
 | 
					#define GPIO_INT_RISE (*(volatile uint32_t *)(0x40002040))
 | 
				
			||||||
 | 
					#define GPIO_INT_RISE_BITSET (*(volatile uint32_t *)(0x40002440))
 | 
				
			||||||
 | 
					#define GPIO_INT_RISE_BITCLR (*(volatile uint32_t *)(0x40002840))
 | 
				
			||||||
 | 
					#define GPIO_INT_RISE_BITTOG (*(volatile uint32_t *)(0x40002C40))
 | 
				
			||||||
 | 
					#define GPIO_INT_FALL (*(volatile uint32_t *)(0x40002044))
 | 
				
			||||||
 | 
					#define GPIO_INT_FALL_BITSET (*(volatile uint32_t *)(0x40002444))
 | 
				
			||||||
 | 
					#define GPIO_INT_FALL_BITCLR (*(volatile uint32_t *)(0x40002844))
 | 
				
			||||||
 | 
					#define GPIO_INT_FALL_BITTOG (*(volatile uint32_t *)(0x40002C44))
 | 
				
			||||||
 | 
					#define GPIO_INT_HIGH (*(volatile uint32_t *)(0x40002048))
 | 
				
			||||||
 | 
					#define GPIO_INT_HIGH_BITSET (*(volatile uint32_t *)(0x40002448))
 | 
				
			||||||
 | 
					#define GPIO_INT_HIGH_BITCLR (*(volatile uint32_t *)(0x40002848))
 | 
				
			||||||
 | 
					#define GPIO_INT_HIGH_BITTOG (*(volatile uint32_t *)(0x40002C48))
 | 
				
			||||||
 | 
					#define GPIO_INT_LOW (*(volatile uint32_t *)(0x4000204C))
 | 
				
			||||||
 | 
					#define GPIO_INT_LOW_BITSET (*(volatile uint32_t *)(0x4000244C))
 | 
				
			||||||
 | 
					#define GPIO_INT_LOW_BITCLR (*(volatile uint32_t *)(0x4000284C))
 | 
				
			||||||
 | 
					#define GPIO_INT_LOW_BITTOG (*(volatile uint32_t *)(0x40002C4C))
 | 
				
			||||||
 | 
					#define GPIO_INT_CLR (*(volatile uint32_t *)(0x40002050))
 | 
				
			||||||
 | 
					#define GPIO_INT_CLR_BITSET (*(volatile uint32_t *)(0x40002450))
 | 
				
			||||||
 | 
					#define GPIO_INT_CLR_BITCLR (*(volatile uint32_t *)(0x40002850))
 | 
				
			||||||
 | 
					#define GPIO_INT_CLR_BITTOG (*(volatile uint32_t *)(0x40002C50))
 | 
				
			||||||
 | 
					#define GPIO_VALUE (*(volatile uint32_t *)(0x40002054))
 | 
				
			||||||
 | 
					#define GPIO_IRQ (*(volatile uint32_t *)(0x40002058))
 | 
				
			||||||
 | 
					#define WDT_INTERVAL (*(volatile uint32_t *)(0x4000205C))
 | 
				
			||||||
 | 
					#define WDT_INTERVAL_BITSET (*(volatile uint32_t *)(0x4000245C))
 | 
				
			||||||
 | 
					#define WDT_INTERVAL_BITCLR (*(volatile uint32_t *)(0x4000285C))
 | 
				
			||||||
 | 
					#define WDT_INTERVAL_BITTOG (*(volatile uint32_t *)(0x40002C5C))
 | 
				
			||||||
 | 
					#define WDT_CTRL (*(volatile uint32_t *)(0x40002060))
 | 
				
			||||||
 | 
					#define WDT_CTRL_BITSET (*(volatile uint32_t *)(0x40002460))
 | 
				
			||||||
 | 
					#define WDT_CTRL_BITCLR (*(volatile uint32_t *)(0x40002860))
 | 
				
			||||||
 | 
					#define WDT_CTRL_BITTOG (*(volatile uint32_t *)(0x40002C60))
 | 
				
			||||||
 | 
					#define WDT_TIME (*(volatile uint32_t *)(0x40002064))
 | 
				
			||||||
 | 
					#define RESET_CAUSE (*(volatile uint32_t *)(0x40002134))
 | 
				
			||||||
 | 
					#define PWM0_CTRL (*(volatile uint32_t *)(0x40002068))
 | 
				
			||||||
 | 
					#define PWM0_CTRL_BITSET (*(volatile uint32_t *)(0x40002468))
 | 
				
			||||||
 | 
					#define PWM0_CTRL_BITCLR (*(volatile uint32_t *)(0x40002868))
 | 
				
			||||||
 | 
					#define PWM0_CTRL_BITTOG (*(volatile uint32_t *)(0x40002C68))
 | 
				
			||||||
 | 
					#define PWM0_COUNT (*(volatile uint32_t *)(0x4000206C))
 | 
				
			||||||
 | 
					#define PWM0_COUNT_BITSET (*(volatile uint32_t *)(0x4000246C))
 | 
				
			||||||
 | 
					#define PWM0_COUNT_BITCLR (*(volatile uint32_t *)(0x4000286C))
 | 
				
			||||||
 | 
					#define PWM0_COUNT_BITTOG (*(volatile uint32_t *)(0x40002C6C))
 | 
				
			||||||
 | 
					#define PWM1_CTRL (*(volatile uint32_t *)(0x40002070))
 | 
				
			||||||
 | 
					#define PWM1_CTRL_BITSET (*(volatile uint32_t *)(0x40002470))
 | 
				
			||||||
 | 
					#define PWM1_CTRL_BITCLR (*(volatile uint32_t *)(0x40002870))
 | 
				
			||||||
 | 
					#define PWM1_CTRL_BITTOG (*(volatile uint32_t *)(0x40002C70))
 | 
				
			||||||
 | 
					#define PWM1_COUNT (*(volatile uint32_t *)(0x40002074))
 | 
				
			||||||
 | 
					#define PWM1_COUNT_BITSET (*(volatile uint32_t *)(0x40002474))
 | 
				
			||||||
 | 
					#define PWM1_COUNT_BITCLR (*(volatile uint32_t *)(0x40002874))
 | 
				
			||||||
 | 
					#define PWM1_COUNT_BITTOG (*(volatile uint32_t *)(0x40002C74))
 | 
				
			||||||
 | 
					#define PWM_STATUS (*(volatile uint32_t *)(0x40002078))
 | 
				
			||||||
 | 
					#define CLKEN_REG (*(volatile uint32_t *)(0x4000207C))
 | 
				
			||||||
 | 
					#define CLKEN_REG_BITSET (*(volatile uint32_t *)(0x4000247C))
 | 
				
			||||||
 | 
					#define CLKEN_REG_BITCLR (*(volatile uint32_t *)(0x4000287C))
 | 
				
			||||||
 | 
					#define CLKEN_REG_BITTOG (*(volatile uint32_t *)(0x40002C7C))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_STATUS (*(volatile uint32_t *)(0x40002080))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_CLEAR (*(volatile uint32_t *)(0x40002084))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_CLEAR_BITSET (*(volatile uint32_t *)(0x40002484))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_CLEAR_BITCLR (*(volatile uint32_t *)(0x40002884))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_CLEAR_BITTOG (*(volatile uint32_t *)(0x40002C84))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_ENABLE (*(volatile uint32_t *)(0x40002088))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_ENABLE_BITSET (*(volatile uint32_t *)(0x40002488))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_ENABLE_BITCLR (*(volatile uint32_t *)(0x40002888))
 | 
				
			||||||
 | 
					#define I2C_INTERRUPT_ENABLE_BITTOG (*(volatile uint32_t *)(0x40002C88))
 | 
				
			||||||
 | 
					#define I2C_MODE (*(volatile uint32_t *)(0x4000208C))
 | 
				
			||||||
 | 
					#define I2C_MODE_BITSET (*(volatile uint32_t *)(0x4000248C))
 | 
				
			||||||
 | 
					#define I2C_MODE_BITCLR (*(volatile uint32_t *)(0x4000288C))
 | 
				
			||||||
 | 
					#define I2C_MODE_BITTOG (*(volatile uint32_t *)(0x40002C8C))
 | 
				
			||||||
 | 
					#define I2C_TX_DATA (*(volatile uint32_t *)(0x40002090))
 | 
				
			||||||
 | 
					#define I2C_TX_DATA_BITSET (*(volatile uint32_t *)(0x40002490))
 | 
				
			||||||
 | 
					#define I2C_TX_DATA_BITCLR (*(volatile uint32_t *)(0x40002890))
 | 
				
			||||||
 | 
					#define I2C_TX_DATA_BITTOG (*(volatile uint32_t *)(0x40002C90))
 | 
				
			||||||
 | 
					#define I2C_RX_DATA (*(volatile uint32_t *)(0x40002144))
 | 
				
			||||||
 | 
					#define I2C_TX_RD_WRB (*(volatile uint32_t *)(0x40002094))
 | 
				
			||||||
 | 
					#define I2C_TX_RD_WRB_BITSET (*(volatile uint32_t *)(0x40002494))
 | 
				
			||||||
 | 
					#define I2C_TX_RD_WRB_BITCLR (*(volatile uint32_t *)(0x40002894))
 | 
				
			||||||
 | 
					#define I2C_TX_RD_WRB_BITTOG (*(volatile uint32_t *)(0x40002C94))
 | 
				
			||||||
 | 
					#define I2C_TX_NO_BYTES (*(volatile uint32_t *)(0x40002098))
 | 
				
			||||||
 | 
					#define I2C_TX_NO_BYTES_BITSET (*(volatile uint32_t *)(0x40002498))
 | 
				
			||||||
 | 
					#define I2C_TX_NO_BYTES_BITCLR (*(volatile uint32_t *)(0x40002898))
 | 
				
			||||||
 | 
					#define I2C_TX_NO_BYTES_BITTOG (*(volatile uint32_t *)(0x40002C98))
 | 
				
			||||||
 | 
					#define I2C_RX_NO_BYTES (*(volatile uint32_t *)(0x4000209C))
 | 
				
			||||||
 | 
					#define I2C_RX_NO_BYTES_MASTER (*(volatile uint32_t *)(0x400020A0))
 | 
				
			||||||
 | 
					#define I2C_RX_NO_BYTES_MASTER_BITSET (*(volatile uint32_t *)(0x400024A0))
 | 
				
			||||||
 | 
					#define I2C_RX_NO_BYTES_MASTER_BITCLR (*(volatile uint32_t *)(0x400028A0))
 | 
				
			||||||
 | 
					#define I2C_RX_NO_BYTES_MASTER_BITTOG (*(volatile uint32_t *)(0x40002CA0))
 | 
				
			||||||
 | 
					#define I2C_GO (*(volatile uint32_t *)(0x400020A4))
 | 
				
			||||||
 | 
					#define I2C_GO_BITSET (*(volatile uint32_t *)(0x400024A4))
 | 
				
			||||||
 | 
					#define I2C_GO_BITCLR (*(volatile uint32_t *)(0x400028A4))
 | 
				
			||||||
 | 
					#define I2C_GO_BITTOG (*(volatile uint32_t *)(0x40002CA4))
 | 
				
			||||||
 | 
					#define I2C_RX_EARLY_THRESHOLD (*(volatile uint32_t *)(0x400020A8))
 | 
				
			||||||
 | 
					#define I2C_RX_EARLY_THRESHOLD_BITSET (*(volatile uint32_t *)(0x400024A8))
 | 
				
			||||||
 | 
					#define I2C_RX_EARLY_THRESHOLD_BITCLR (*(volatile uint32_t *)(0x400028A8))
 | 
				
			||||||
 | 
					#define I2C_RX_EARLY_THRESHOLD_BITTOG (*(volatile uint32_t *)(0x40002CA8))
 | 
				
			||||||
 | 
					#define I2C_RX_AUTO_NAG_BYTE_CNT (*(volatile uint32_t *)(0x400020AC))
 | 
				
			||||||
 | 
					#define I2C_RX_AUTO_NAG_BYTE_CNT_BITSET (*(volatile uint32_t *)(0x400024AC))
 | 
				
			||||||
 | 
					#define I2C_RX_AUTO_NAG_BYTE_CNT_BITCLR (*(volatile uint32_t *)(0x400028AC))
 | 
				
			||||||
 | 
					#define I2C_RX_AUTO_NAG_BYTE_CNT_BITTOG (*(volatile uint32_t *)(0x40002CAC))
 | 
				
			||||||
 | 
					#define I2C_HALF_TIME (*(volatile uint32_t *)(0x400020B0))
 | 
				
			||||||
 | 
					#define I2C_HALF_TIME_BITSET (*(volatile uint32_t *)(0x400024B0))
 | 
				
			||||||
 | 
					#define I2C_HALF_TIME_BITCLR (*(volatile uint32_t *)(0x400028B0))
 | 
				
			||||||
 | 
					#define I2C_HALF_TIME_BITTOG (*(volatile uint32_t *)(0x40002CB0))
 | 
				
			||||||
 | 
					#define I2C_ADDRESS (*(volatile uint32_t *)(0x400020B4))
 | 
				
			||||||
 | 
					#define I2C_ADDRESS_BITSET (*(volatile uint32_t *)(0x400024B4))
 | 
				
			||||||
 | 
					#define I2C_ADDRESS_BITCLR (*(volatile uint32_t *)(0x400028B4))
 | 
				
			||||||
 | 
					#define I2C_ADDRESS_BITTOG (*(volatile uint32_t *)(0x40002CB4))
 | 
				
			||||||
 | 
					#define I2C_ADDR_TYPE (*(volatile uint32_t *)(0x400020B8))
 | 
				
			||||||
 | 
					#define I2C_ADDR_TYPE_BITSET (*(volatile uint32_t *)(0x400024B8))
 | 
				
			||||||
 | 
					#define I2C_ADDR_TYPE_BITCLR (*(volatile uint32_t *)(0x400028B8))
 | 
				
			||||||
 | 
					#define I2C_ADDR_TYPE_BITTOG (*(volatile uint32_t *)(0x40002CB8))
 | 
				
			||||||
 | 
					#define I2C_SOFT_RESET (*(volatile uint32_t *)(0x400020BC))
 | 
				
			||||||
 | 
					#define I2C_SOFT_RESET_BITSET (*(volatile uint32_t *)(0x400024BC))
 | 
				
			||||||
 | 
					#define I2C_SOFT_RESET_BITCLR (*(volatile uint32_t *)(0x400028BC))
 | 
				
			||||||
 | 
					#define I2C_SOFT_RESET_BITTOG (*(volatile uint32_t *)(0x40002CBC))
 | 
				
			||||||
 | 
					#define I2C_SLAVE_RWB (*(volatile uint32_t *)(0x400020C0))
 | 
				
			||||||
 | 
					#define I2C_MASTER_SM (*(volatile uint32_t *)(0x400020C4))
 | 
				
			||||||
 | 
					#define I2C_SLAVE_SM (*(volatile uint32_t *)(0x400020C8))
 | 
				
			||||||
 | 
					#define I2C_SLAVE_ENABLE (*(volatile uint32_t *)(0x400020CC))
 | 
				
			||||||
 | 
					#define I2C_SLAVE_ENABLE_BITSET (*(volatile uint32_t *)(0x400024CC))
 | 
				
			||||||
 | 
					#define I2C_SLAVE_ENABLE_BITCLR (*(volatile uint32_t *)(0x400028CC))
 | 
				
			||||||
 | 
					#define I2C_SLAVE_ENABLE_BITTOG (*(volatile uint32_t *)(0x40002CCC))
 | 
				
			||||||
 | 
					#define I2C_MASTER_SEND_RESTART (*(volatile uint32_t *)(0x400020D0))
 | 
				
			||||||
 | 
					#define I2C_MASTER_SEND_RESTART_BITSET (*(volatile uint32_t *)(0x400024D0))
 | 
				
			||||||
 | 
					#define I2C_MASTER_SEND_RESTART_BITCLR (*(volatile uint32_t *)(0x400028D0))
 | 
				
			||||||
 | 
					#define I2C_MASTER_SEND_RESTART_BITTOG (*(volatile uint32_t *)(0x40002CD0))
 | 
				
			||||||
 | 
					#define DMA_MUX (*(volatile uint32_t *)(0x400020D4))
 | 
				
			||||||
 | 
					#define DMA_MUX_BITSET (*(volatile uint32_t *)(0x400024D4))
 | 
				
			||||||
 | 
					#define DMA_MUX_BITCLR (*(volatile uint32_t *)(0x400028D4))
 | 
				
			||||||
 | 
					#define DMA_MUX_BITTOG (*(volatile uint32_t *)(0x40002CD4))
 | 
				
			||||||
 | 
					#define DMA_CTRL_STAT (*(volatile uint32_t *)(0x400020D8))
 | 
				
			||||||
 | 
					#define COMP_CTRL (*(volatile uint32_t *)(0x400020DC))
 | 
				
			||||||
 | 
					#define COMP_CTRL_BITSET (*(volatile uint32_t *)(0x400024DC))
 | 
				
			||||||
 | 
					#define COMP_CTRL_BITCLR (*(volatile uint32_t *)(0x400028DC))
 | 
				
			||||||
 | 
					#define COMP_CTRL_BITTOG (*(volatile uint32_t *)(0x40002CDC))
 | 
				
			||||||
 | 
					#define COMP_STAT (*(volatile uint32_t *)(0x400020E0))
 | 
				
			||||||
 | 
					#define LP_UART_CTRL (*(volatile uint32_t *)(0x400020E4))
 | 
				
			||||||
 | 
					#define LP_UART_CTRL_BITSET (*(volatile uint32_t *)(0x400024E4))
 | 
				
			||||||
 | 
					#define LP_UART_CTRL_BITCLR (*(volatile uint32_t *)(0x400028E4))
 | 
				
			||||||
 | 
					#define LP_UART_CTRL_BITTOG (*(volatile uint32_t *)(0x40002CE4))
 | 
				
			||||||
 | 
					#define LP_UART_STATUS (*(volatile uint32_t *)(0x400020E8))
 | 
				
			||||||
 | 
					#define LP_UART_DATA (*(volatile uint32_t *)(0x40002154))
 | 
				
			||||||
 | 
					#define CAP_FILT_CONF (*(volatile uint32_t *)(0x400020EC))
 | 
				
			||||||
 | 
					#define CAP_FILT_CONF_BITSET (*(volatile uint32_t *)(0x400024EC))
 | 
				
			||||||
 | 
					#define CAP_FILT_CONF_BITCLR (*(volatile uint32_t *)(0x400028EC))
 | 
				
			||||||
 | 
					#define CAP_FILT_CONF_BITTOG (*(volatile uint32_t *)(0x40002CEC))
 | 
				
			||||||
 | 
					#define CAP_IRQ_CONF (*(volatile uint32_t *)(0x400020F0))
 | 
				
			||||||
 | 
					#define CAP_IRQ_CONF_BITSET (*(volatile uint32_t *)(0x400024F0))
 | 
				
			||||||
 | 
					#define CAP_IRQ_CONF_BITCLR (*(volatile uint32_t *)(0x400028F0))
 | 
				
			||||||
 | 
					#define CAP_IRQ_CONF_BITTOG (*(volatile uint32_t *)(0x40002CF0))
 | 
				
			||||||
 | 
					#define CAP_STATUS (*(volatile uint32_t *)(0x400020F4))
 | 
				
			||||||
 | 
					#define CORE_ENABLE_SWD_ACCESS_APPS (*(volatile uint32_t *)(0x400020F8))
 | 
				
			||||||
 | 
					#define CORE_ENABLE_SWD_ACCESS_APPS_BITSET (*(volatile uint32_t *)(0x400024F8))
 | 
				
			||||||
 | 
					#define CORE_ENABLE_SWD_ACCESS_APPS_BITCLR (*(volatile uint32_t *)(0x400028F8))
 | 
				
			||||||
 | 
					#define CORE_ENABLE_SWD_ACCESS_APPS_BITTOG (*(volatile uint32_t *)(0x40002CF8))
 | 
				
			||||||
 | 
					#define APPS_DEBUGGER_TO_CORE_DATA (*(volatile uint32_t *)(0x400020FC))
 | 
				
			||||||
 | 
					#define APPS_CORE_TO_DEBUGGER_DATA (*(volatile uint32_t *)(0x40002100))
 | 
				
			||||||
 | 
					#define APPS_CORE_TO_DEBUGGER_DATA_BITSET (*(volatile uint32_t *)(0x40002500))
 | 
				
			||||||
 | 
					#define APPS_CORE_TO_DEBUGGER_DATA_BITCLR (*(volatile uint32_t *)(0x40002900))
 | 
				
			||||||
 | 
					#define APPS_CORE_TO_DEBUGGER_DATA_BITTOG (*(volatile uint32_t *)(0x40002D00))
 | 
				
			||||||
 | 
					#define APPS_DEBUG_DATA_TO_CORE_AVAILABLE (*(volatile uint32_t *)(0x40002104))
 | 
				
			||||||
 | 
					#define APPS_DEBUG_DATA_TO_CORE_ACCEPTED (*(volatile uint32_t *)(0x40002108))
 | 
				
			||||||
 | 
					#define APPS_DEBUG_DATA_TO_CORE_ACCEPTED_BITSET (*(volatile uint32_t *)(0x40002508))
 | 
				
			||||||
 | 
					#define APPS_DEBUG_DATA_TO_CORE_ACCEPTED_BITCLR (*(volatile uint32_t *)(0x40002908))
 | 
				
			||||||
 | 
					#define APPS_DEBUG_DATA_TO_CORE_ACCEPTED_BITTOG (*(volatile uint32_t *)(0x40002D08))
 | 
				
			||||||
 | 
					#define APPS_CORE_DATA_TO_DEBUGGER_AVAILABLE (*(volatile uint32_t *)(0x4000210C))
 | 
				
			||||||
 | 
					#define APPS_CORE_DATA_TO_DEBUGGER_AVAILABLE_BITSET (*(volatile uint32_t *)(0x4000250C))
 | 
				
			||||||
 | 
					#define APPS_CORE_DATA_TO_DEBUGGER_AVAILABLE_BITCLR (*(volatile uint32_t *)(0x4000290C))
 | 
				
			||||||
 | 
					#define APPS_CORE_DATA_TO_DEBUGGER_AVAILABLE_BITTOG (*(volatile uint32_t *)(0x40002D0C))
 | 
				
			||||||
 | 
					#define APPS_CORE_DATA_TO_DEBUGGER_ACCEPTED (*(volatile uint32_t *)(0x40002110))
 | 
				
			||||||
 | 
					#define SWD_REQUEST (*(volatile uint32_t *)(0x40002114))
 | 
				
			||||||
 | 
					#define EDGE_CTRL0 (*(volatile uint32_t *)(0x40002118))
 | 
				
			||||||
 | 
					#define EDGE_CTRL0_BITSET (*(volatile uint32_t *)(0x40002518))
 | 
				
			||||||
 | 
					#define EDGE_CTRL0_BITCLR (*(volatile uint32_t *)(0x40002918))
 | 
				
			||||||
 | 
					#define EDGE_CTRL0_BITTOG (*(volatile uint32_t *)(0x40002D18))
 | 
				
			||||||
 | 
					#define EDGE_CTRL1 (*(volatile uint32_t *)(0x4000211C))
 | 
				
			||||||
 | 
					#define EDGE_CTRL1_BITSET (*(volatile uint32_t *)(0x4000251C))
 | 
				
			||||||
 | 
					#define EDGE_CTRL1_BITCLR (*(volatile uint32_t *)(0x4000291C))
 | 
				
			||||||
 | 
					#define EDGE_CTRL1_BITTOG (*(volatile uint32_t *)(0x40002D1C))
 | 
				
			||||||
 | 
					#define EDGE_COUNT (*(volatile uint32_t *)(0x40002120))
 | 
				
			||||||
 | 
					#define RESET_REG (*(volatile uint32_t *)(0x40002124))
 | 
				
			||||||
 | 
					#define RESET_REG_BITSET (*(volatile uint32_t *)(0x40002524))
 | 
				
			||||||
 | 
					#define RESET_REG_BITCLR (*(volatile uint32_t *)(0x40002924))
 | 
				
			||||||
 | 
					#define RESET_REG_BITTOG (*(volatile uint32_t *)(0x40002D24))
 | 
				
			||||||
 | 
					#define DIGITAL_VERSION (*(volatile uint32_t *)(0x40000000))
 | 
				
			||||||
 | 
					#define CLK_FREQ_DAC (*(volatile uint32_t *)(0x40000004))
 | 
				
			||||||
 | 
					#define CLK_FREQ_SET (*(volatile uint32_t *)(0x40000008))
 | 
				
			||||||
 | 
					#define CLK_FREQ_SET_BITSET (*(volatile uint32_t *)(0x40000408))
 | 
				
			||||||
 | 
					#define CLK_FREQ_SET_BITCLR (*(volatile uint32_t *)(0x40000808))
 | 
				
			||||||
 | 
					#define CLK_FREQ_SET_BITTOG (*(volatile uint32_t *)(0x40000C08))
 | 
				
			||||||
 | 
					#define CLK_FREQ_NREFCLKS (*(volatile uint32_t *)(0x4000000C))
 | 
				
			||||||
 | 
					#define CLK_FREQ_NREFCLKS_BITSET (*(volatile uint32_t *)(0x4000040C))
 | 
				
			||||||
 | 
					#define CLK_FREQ_NREFCLKS_BITCLR (*(volatile uint32_t *)(0x4000080C))
 | 
				
			||||||
 | 
					#define CLK_FREQ_NREFCLKS_BITTOG (*(volatile uint32_t *)(0x40000C0C))
 | 
				
			||||||
 | 
					#define CLK_FREQ_REF_SEL (*(volatile uint32_t *)(0x40000010))
 | 
				
			||||||
 | 
					#define CLK_FREQ_REF_SEL_BITSET (*(volatile uint32_t *)(0x40000410))
 | 
				
			||||||
 | 
					#define CLK_FREQ_REF_SEL_BITCLR (*(volatile uint32_t *)(0x40000810))
 | 
				
			||||||
 | 
					#define CLK_FREQ_REF_SEL_BITTOG (*(volatile uint32_t *)(0x40000C10))
 | 
				
			||||||
 | 
					#define CLK_FREQ_DIG_CLKS (*(volatile uint32_t *)(0x40000014))
 | 
				
			||||||
 | 
					#define CLK_FREQ_HIGHTARGET (*(volatile uint32_t *)(0x40000018))
 | 
				
			||||||
 | 
					#define CLK_FREQ_HIGHTARGET_BITSET (*(volatile uint32_t *)(0x40000418))
 | 
				
			||||||
 | 
					#define CLK_FREQ_HIGHTARGET_BITCLR (*(volatile uint32_t *)(0x40000818))
 | 
				
			||||||
 | 
					#define CLK_FREQ_HIGHTARGET_BITTOG (*(volatile uint32_t *)(0x40000C18))
 | 
				
			||||||
 | 
					#define CLK_FREQ_LOWTARGET (*(volatile uint32_t *)(0x4000001C))
 | 
				
			||||||
 | 
					#define CLK_FREQ_LOWTARGET_BITSET (*(volatile uint32_t *)(0x4000041C))
 | 
				
			||||||
 | 
					#define CLK_FREQ_LOWTARGET_BITCLR (*(volatile uint32_t *)(0x4000081C))
 | 
				
			||||||
 | 
					#define CLK_FREQ_LOWTARGET_BITTOG (*(volatile uint32_t *)(0x40000C1C))
 | 
				
			||||||
 | 
					#define CLK_FREQ_LP_BACKOFF (*(volatile uint32_t *)(0x40000020))
 | 
				
			||||||
 | 
					#define CLK_FREQ_LP_BACKOFF_BITSET (*(volatile uint32_t *)(0x40000420))
 | 
				
			||||||
 | 
					#define CLK_FREQ_LP_BACKOFF_BITCLR (*(volatile uint32_t *)(0x40000820))
 | 
				
			||||||
 | 
					#define CLK_FREQ_LP_BACKOFF_BITTOG (*(volatile uint32_t *)(0x40000C20))
 | 
				
			||||||
 | 
					#define CLK_FREQ_ENABLE (*(volatile uint32_t *)(0x40000024))
 | 
				
			||||||
 | 
					#define CLK_FREQ_ENABLE_BITSET (*(volatile uint32_t *)(0x40000424))
 | 
				
			||||||
 | 
					#define CLK_FREQ_ENABLE_BITCLR (*(volatile uint32_t *)(0x40000824))
 | 
				
			||||||
 | 
					#define CLK_FREQ_ENABLE_BITTOG (*(volatile uint32_t *)(0x40000C24))
 | 
				
			||||||
 | 
					#define CLK_GATE_SYS (*(volatile uint32_t *)(0x40000028))
 | 
				
			||||||
 | 
					#define CLK_GATE_SYS_BITSET (*(volatile uint32_t *)(0x40000428))
 | 
				
			||||||
 | 
					#define CLK_GATE_SYS_BITCLR (*(volatile uint32_t *)(0x40000828))
 | 
				
			||||||
 | 
					#define CLK_GATE_SYS_BITTOG (*(volatile uint32_t *)(0x40000C28))
 | 
				
			||||||
 | 
					#define CLK_GATE_MODEM (*(volatile uint32_t *)(0x4000002C))
 | 
				
			||||||
 | 
					#define CLK_GATE_MODEM_BITSET (*(volatile uint32_t *)(0x4000042C))
 | 
				
			||||||
 | 
					#define CLK_GATE_MODEM_BITCLR (*(volatile uint32_t *)(0x4000082C))
 | 
				
			||||||
 | 
					#define CLK_GATE_MODEM_BITTOG (*(volatile uint32_t *)(0x40000C2C))
 | 
				
			||||||
 | 
					#define CLK_GATE_RADIO (*(volatile uint32_t *)(0x40000030))
 | 
				
			||||||
 | 
					#define CLK_GATE_RADIO_BITSET (*(volatile uint32_t *)(0x40000430))
 | 
				
			||||||
 | 
					#define CLK_GATE_RADIO_BITCLR (*(volatile uint32_t *)(0x40000830))
 | 
				
			||||||
 | 
					#define CLK_GATE_RADIO_BITTOG (*(volatile uint32_t *)(0x40000C30))
 | 
				
			||||||
 | 
					#define CLK_GATE_DEBUG (*(volatile uint32_t *)(0x40000034))
 | 
				
			||||||
 | 
					#define CLK_GATE_DEBUG_BITSET (*(volatile uint32_t *)(0x40000434))
 | 
				
			||||||
 | 
					#define CLK_GATE_DEBUG_BITCLR (*(volatile uint32_t *)(0x40000834))
 | 
				
			||||||
 | 
					#define CLK_GATE_DEBUG_BITTOG (*(volatile uint32_t *)(0x40000C34))
 | 
				
			||||||
 | 
					#define CLK_GATE_RBIST (*(volatile uint32_t *)(0x40000038))
 | 
				
			||||||
 | 
					#define CLK_GATE_RBIST_BITSET (*(volatile uint32_t *)(0x40000438))
 | 
				
			||||||
 | 
					#define CLK_GATE_RBIST_BITCLR (*(volatile uint32_t *)(0x40000838))
 | 
				
			||||||
 | 
					#define CLK_GATE_RBIST_BITTOG (*(volatile uint32_t *)(0x40000C38))
 | 
				
			||||||
 | 
					#define LPC_CTRL (*(volatile uint32_t *)(0x4000003C))
 | 
				
			||||||
 | 
					#define LPC_CTRL_BITSET (*(volatile uint32_t *)(0x4000043C))
 | 
				
			||||||
 | 
					#define LPC_CTRL_BITCLR (*(volatile uint32_t *)(0x4000083C))
 | 
				
			||||||
 | 
					#define LPC_CTRL_BITTOG (*(volatile uint32_t *)(0x40000C3C))
 | 
				
			||||||
 | 
					#define LPC_TEST (*(volatile uint32_t *)(0x40000040))
 | 
				
			||||||
 | 
					#define LPC_TEST_BITSET (*(volatile uint32_t *)(0x40000440))
 | 
				
			||||||
 | 
					#define LPC_TEST_BITCLR (*(volatile uint32_t *)(0x40000840))
 | 
				
			||||||
 | 
					#define LPC_TEST_BITTOG (*(volatile uint32_t *)(0x40000C40))
 | 
				
			||||||
 | 
					#define FPGA_FLASH_WR (*(volatile uint32_t *)(0x40000044))
 | 
				
			||||||
 | 
					#define FPGA_FLASH_WR_BITSET (*(volatile uint32_t *)(0x40000444))
 | 
				
			||||||
 | 
					#define FPGA_FLASH_WR_BITCLR (*(volatile uint32_t *)(0x40000844))
 | 
				
			||||||
 | 
					#define FPGA_FLASH_WR_BITTOG (*(volatile uint32_t *)(0x40000C44))
 | 
				
			||||||
 | 
					#define FPGA_FLASH_RD (*(volatile uint32_t *)(0x40000048))
 | 
				
			||||||
 | 
					#define PMU_CTRL (*(volatile uint32_t *)(0x4000004C))
 | 
				
			||||||
 | 
					#define PMU_CTRL_BITSET (*(volatile uint32_t *)(0x4000044C))
 | 
				
			||||||
 | 
					#define PMU_CTRL_BITCLR (*(volatile uint32_t *)(0x4000084C))
 | 
				
			||||||
 | 
					#define PMU_CTRL_BITTOG (*(volatile uint32_t *)(0x40000C4C))
 | 
				
			||||||
 | 
					#define APP_CTRL0 (*(volatile uint32_t *)(0x40000050))
 | 
				
			||||||
 | 
					#define APP_CTRL0_BITSET (*(volatile uint32_t *)(0x40000450))
 | 
				
			||||||
 | 
					#define APP_CTRL0_BITCLR (*(volatile uint32_t *)(0x40000850))
 | 
				
			||||||
 | 
					#define APP_CTRL0_BITTOG (*(volatile uint32_t *)(0x40000C50))
 | 
				
			||||||
 | 
					#define APP_CTRL1 (*(volatile uint32_t *)(0x40000054))
 | 
				
			||||||
 | 
					#define APP_CTRL1_BITSET (*(volatile uint32_t *)(0x40000454))
 | 
				
			||||||
 | 
					#define APP_CTRL1_BITCLR (*(volatile uint32_t *)(0x40000854))
 | 
				
			||||||
 | 
					#define APP_CTRL1_BITTOG (*(volatile uint32_t *)(0x40000C54))
 | 
				
			||||||
 | 
					#define APP_CTRL2 (*(volatile uint32_t *)(0x40000058))
 | 
				
			||||||
 | 
					#define APP_CTRL2_BITSET (*(volatile uint32_t *)(0x40000458))
 | 
				
			||||||
 | 
					#define APP_CTRL2_BITCLR (*(volatile uint32_t *)(0x40000858))
 | 
				
			||||||
 | 
					#define APP_CTRL2_BITTOG (*(volatile uint32_t *)(0x40000C58))
 | 
				
			||||||
 | 
					#define APP_CTRL3 (*(volatile uint32_t *)(0x4000005C))
 | 
				
			||||||
 | 
					#define APP_CTRL3_BITSET (*(volatile uint32_t *)(0x4000045C))
 | 
				
			||||||
 | 
					#define APP_CTRL3_BITCLR (*(volatile uint32_t *)(0x4000085C))
 | 
				
			||||||
 | 
					#define APP_CTRL3_BITTOG (*(volatile uint32_t *)(0x40000C5C))
 | 
				
			||||||
 | 
					#define PMU_STAT (*(volatile uint32_t *)(0x40000060))
 | 
				
			||||||
 | 
					#define PMUBIST_ADC_CONF (*(volatile uint32_t *)(0x40000064))
 | 
				
			||||||
 | 
					#define PMUBIST_ADC_CONF_BITSET (*(volatile uint32_t *)(0x40000464))
 | 
				
			||||||
 | 
					#define PMUBIST_ADC_CONF_BITCLR (*(volatile uint32_t *)(0x40000864))
 | 
				
			||||||
 | 
					#define PMUBIST_ADC_CONF_BITTOG (*(volatile uint32_t *)(0x40000C64))
 | 
				
			||||||
 | 
					#define PMUBIST_ADC_DATA (*(volatile uint32_t *)(0x40000068))
 | 
				
			||||||
 | 
					#define STATUS (*(volatile uint32_t *)(0x4000006C))
 | 
				
			||||||
 | 
					#define LPC_STATUS (*(volatile uint32_t *)(0x40000070))
 | 
				
			||||||
 | 
					#define LPC_PDTIMER (*(volatile uint32_t *)(0x40000074))
 | 
				
			||||||
 | 
					#define LPC_PDTIMER_BITSET (*(volatile uint32_t *)(0x40000474))
 | 
				
			||||||
 | 
					#define LPC_PDTIMER_BITCLR (*(volatile uint32_t *)(0x40000874))
 | 
				
			||||||
 | 
					#define LPC_PDTIMER_BITTOG (*(volatile uint32_t *)(0x40000C74))
 | 
				
			||||||
 | 
					#define PIO_OWNER0 (*(volatile uint32_t *)(0x40000078))
 | 
				
			||||||
 | 
					#define PIO_OWNER1 (*(volatile uint32_t *)(0x4000007C))
 | 
				
			||||||
 | 
					#define RTC_TIME_LSBS (*(volatile uint32_t *)(0x40000080))
 | 
				
			||||||
 | 
					#define RTC_TIME_MSBS (*(volatile uint32_t *)(0x40000084))
 | 
				
			||||||
 | 
					#define DEBUG_SEL (*(volatile uint32_t *)(0x40000088))
 | 
				
			||||||
 | 
					#define DEBUG_SEL_BITSET (*(volatile uint32_t *)(0x40000488))
 | 
				
			||||||
 | 
					#define DEBUG_SEL_BITCLR (*(volatile uint32_t *)(0x40000888))
 | 
				
			||||||
 | 
					#define DEBUG_SEL_BITTOG (*(volatile uint32_t *)(0x40000C88))
 | 
				
			||||||
 | 
					#define FLASH_STATUS (*(volatile uint32_t *)(0x4000008C))
 | 
				
			||||||
 | 
					#define CHIP_WDT_INTERVAL (*(volatile uint32_t *)(0x40000090))
 | 
				
			||||||
 | 
					#define CHIP_WDT_INTERVAL_BITSET (*(volatile uint32_t *)(0x40000490))
 | 
				
			||||||
 | 
					#define CHIP_WDT_INTERVAL_BITCLR (*(volatile uint32_t *)(0x40000890))
 | 
				
			||||||
 | 
					#define CHIP_WDT_INTERVAL_BITTOG (*(volatile uint32_t *)(0x40000C90))
 | 
				
			||||||
 | 
					#define CHIP_WDT_CTRL (*(volatile uint32_t *)(0x40000094))
 | 
				
			||||||
 | 
					#define CHIP_WDT_CTRL_BITSET (*(volatile uint32_t *)(0x40000494))
 | 
				
			||||||
 | 
					#define CHIP_WDT_CTRL_BITCLR (*(volatile uint32_t *)(0x40000894))
 | 
				
			||||||
 | 
					#define CHIP_WDT_CTRL_BITTOG (*(volatile uint32_t *)(0x40000C94))
 | 
				
			||||||
 | 
					#define CHIP_WDT_TIME (*(volatile uint32_t *)(0x40000098))
 | 
				
			||||||
 | 
					#define CHIP_RESET (*(volatile uint32_t *)(0x4000009C))
 | 
				
			||||||
 | 
					#define CHIP_RESET_BITSET (*(volatile uint32_t *)(0x4000049C))
 | 
				
			||||||
 | 
					#define CHIP_RESET_BITCLR (*(volatile uint32_t *)(0x4000089C))
 | 
				
			||||||
 | 
					#define CHIP_RESET_BITTOG (*(volatile uint32_t *)(0x40000C9C))
 | 
				
			||||||
 | 
					#define SWD_PIN_CFG (*(volatile uint32_t *)(0x400000A0))
 | 
				
			||||||
 | 
					#define SWD_PIN_CFG_BITSET (*(volatile uint32_t *)(0x400004A0))
 | 
				
			||||||
 | 
					#define SWD_PIN_CFG_BITCLR (*(volatile uint32_t *)(0x400008A0))
 | 
				
			||||||
 | 
					#define SWD_PIN_CFG_BITTOG (*(volatile uint32_t *)(0x40000CA0))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/******************************************************************************/
 | 
				
			||||||
 | 
					/*                         Peripheral declaration                             */
 | 
				
			||||||
 | 
					/******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* UART Defines */
 | 
				
			||||||
 | 
					#define UART0_BASE 0x50003000
 | 
				
			||||||
 | 
					#define UART1_BASE 0x50004000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif  /* HI2110_H */
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,86 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "system_hi2110.h"
 | 
				
			||||||
 | 
					#include "cmsis.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*lint ++flb "Enter library region" */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __SYSTEM_CLOCK      (48000000UL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined ( __CC_ARM )
 | 
				
			||||||
 | 
					    uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK;  
 | 
				
			||||||
 | 
					#elif defined ( __ICCARM__ )
 | 
				
			||||||
 | 
					    __root uint32_t SystemCoreClock = __SYSTEM_CLOCK;
 | 
				
			||||||
 | 
					#elif defined   ( __GNUC__ )
 | 
				
			||||||
 | 
					    uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SystemCoreClockUpdate(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SystemCoreClock = __SYSTEM_CLOCK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Restart the core if we're in an interrupt context to ensure a known state.
 | 
				
			||||||
 | 
					 * Also reset any PIOs and ensure interrupts are disabled. */
 | 
				
			||||||
 | 
					void SystemInit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t x = __get_xPSR();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Check for interrupt context and reboot needed. */
 | 
				
			||||||
 | 
					    if (x & 0x3f) {
 | 
				
			||||||
 | 
					        /* Processor is in an interrupt context, reset the core by triggering
 | 
				
			||||||
 | 
					         * the reset vector using the SYSRESETREQ bit in the AIRCR register */
 | 
				
			||||||
 | 
					        x =  SCB->AIRCR;
 | 
				
			||||||
 | 
					        x &= 0xffff;            /* Mask out the top 16 bits */
 | 
				
			||||||
 | 
					        x |= 0x05fa0000;        /* Must write with this value for the write to take effect */
 | 
				
			||||||
 | 
					        x |= 0x04;              /* Set the SYSRESETREQ bit */
 | 
				
			||||||
 | 
					        SCB->AIRCR  = x;        /* Reset the core */
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Release claim on any pins */
 | 
				
			||||||
 | 
					    PIO_FUNC0_BITCLR = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					    PIO_FUNC1_BITCLR = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					    PIO_FUNC2_BITCLR = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					    PIO_FUNC3_BITCLR = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					    PIO_FUNC4_BITCLR = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable all IRQ interrupts */
 | 
				
			||||||
 | 
					    NVIC->ICER[0] = 0xffffffff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Ensure interrupts are enabled */
 | 
				
			||||||
 | 
					    __set_PRIMASK(0);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Allow sleep */
 | 
				
			||||||
 | 
					    SystemAllowSleep(true);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SystemAllowSleep(bool sleepAllowed)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (sleepAllowed) {
 | 
				
			||||||
 | 
					        /* Set deep sleep, though not on exit */
 | 
				
			||||||
 | 
					        SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
 | 
				
			||||||
 | 
					        SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        /* Unset deep sleep */
 | 
				
			||||||
 | 
					        SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*lint --flb "Leave library region" */
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,69 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SYSTEM_HI2110_H
 | 
				
			||||||
 | 
					#define SYSTEM_HI2110_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern uint32_t SystemCoreClock;    /*!< System Clock Frequency (Core Clock)  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Initialize the system
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param  none
 | 
				
			||||||
 | 
					 * @return none
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @brief  Setup the microcontroller system.
 | 
				
			||||||
 | 
					 *         Initialize the System and update the SystemCoreClock variable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					extern void SystemInit (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Update SystemCoreClock variable
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param  none
 | 
				
			||||||
 | 
					 * @return none
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @brief  Updates the SystemCoreClock with current core Clock 
 | 
				
			||||||
 | 
					 *         retrieved from cpu registers.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					extern void SystemCoreClockUpdate (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Allow the system to go to sleep, shutting down clocks, etc.
 | 
				
			||||||
 | 
					 * or not.  If the system is allowed to sleep it will awake
 | 
				
			||||||
 | 
					 * and restore clocks automatically on an interrupt however
 | 
				
			||||||
 | 
					 * there will be a 200 to 300 usecond delay.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param  sleepAllowed  if true then sleep is allowed.
 | 
				
			||||||
 | 
					 * @return none
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @brief  Allow full sleep, or not.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					extern void SystemAllowSleep(bool sleepAllowed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* SYSTEM_HI2110_H */
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,80 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mbed_assert.h"
 | 
				
			||||||
 | 
					#include "gpio_api.h"
 | 
				
			||||||
 | 
					#include "pinmap.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * TYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * GLOBAL VARIABLES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API CALLS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_init(gpio_t *obj, PinName pin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (pin == (PinName)NC) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    MBED_ASSERT (pin <  NUM_PINS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->pin = pin;
 | 
				
			||||||
 | 
					    obj->mask = (1ul << pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->reg_set = &GPIO_OUT_BITSET;
 | 
				
			||||||
 | 
					    obj->reg_clr = &GPIO_OUT_BITCLR;
 | 
				
			||||||
 | 
					    obj->reg_val = &GPIO_VALUE;
 | 
				
			||||||
 | 
					    obj->reg_dir = &GPIO_DIR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Claim the pin */
 | 
				
			||||||
 | 
					    pin_function(pin, PIN_FUNCTION_GPIO);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_mode(gpio_t *obj, PinMode mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    pin_mode(obj->pin, mode);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_dir(gpio_t *obj, PinDirection direction)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MBED_ASSERT(obj->pin != (PinName)NC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (direction) {
 | 
				
			||||||
 | 
					        case PIN_INPUT:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            *(obj->reg_dir) &= ~(obj->mask);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case PIN_OUTPUT:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            *(obj->reg_dir) |= obj->mask;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        /* TODO: looks as though the default is
 | 
				
			||||||
 | 
					         * not normally trapped here */
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,148 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TODO: this needs testing */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
					#include "cmsis.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "gpio_irq_api.h"
 | 
				
			||||||
 | 
					#include "mbed_error.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * TYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * GLOBAL VARIABLES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Each GPIO pin is given an ID, if the ID is 0 the pin can be ignored. */
 | 
				
			||||||
 | 
					static uint8_t channel_ids[20] = {0};
 | 
				
			||||||
 | 
					static gpio_irq_handler irq_handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool initialised = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * NON-API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void IRQ5_GPIO_Handler()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (initialised) {
 | 
				
			||||||
 | 
					        for (uint8_t i = 0; i < sizeof (channel_ids) / sizeof (channel_ids[0]); i++) {
 | 
				
			||||||
 | 
					            uint8_t id = channel_ids[i];
 | 
				
			||||||
 | 
					            uint32_t mask = 1 << id;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					            if (id != 0) {
 | 
				
			||||||
 | 
					                if (GPIO_IRQ | mask) {
 | 
				
			||||||
 | 
					                    if (GPIO_INT_RISE | mask) {
 | 
				
			||||||
 | 
					                        irq_handler(id, IRQ_RISE);
 | 
				
			||||||
 | 
					                    } else if (GPIO_INT_FALL | mask) {
 | 
				
			||||||
 | 
					                        irq_handler(id, IRQ_FALL);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }    
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Clear all the interrupt bits (rather than wasting time on
 | 
				
			||||||
 | 
					     * each individual one), or we might get stuck if a spurious
 | 
				
			||||||
 | 
					     * one should arrive. */
 | 
				
			||||||
 | 
					    GPIO_INT_CLR = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API CALLS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    bool return_value = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (initialised) {
 | 
				
			||||||
 | 
					        return_value = 0;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        if (pin != NC) {
 | 
				
			||||||
 | 
					            MBED_ASSERT (pin < NUM_PINS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            irq_handler      = handler;
 | 
				
			||||||
 | 
					            obj->ch          = pin;
 | 
				
			||||||
 | 
					            channel_ids[pin] = id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            uint32_t mask = 1 << obj->ch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Remove any existing setting */
 | 
				
			||||||
 | 
					            GPIO_INT_RISE_BITCLR &= ~mask;
 | 
				
			||||||
 | 
					            GPIO_INT_FALL_BITCLR &= ~mask;
 | 
				
			||||||
 | 
					            GPIO_INT_LOW_BITCLR &= ~mask;
 | 
				
			||||||
 | 
					            GPIO_INT_HIGH_BITCLR &= ~mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            initialised = true;
 | 
				
			||||||
 | 
					            NVIC_EnableIRQ  (GPIO_IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return_value = 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return return_value;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_irq_free(gpio_irq_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    channel_ids[obj->ch] = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t mask = 1 << obj->ch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (enable) {
 | 
				
			||||||
 | 
					        if (event == IRQ_RISE) {
 | 
				
			||||||
 | 
					            GPIO_INT_RISE_BITSET |= mask;
 | 
				
			||||||
 | 
					        } else if (event == IRQ_FALL) {
 | 
				
			||||||
 | 
					            GPIO_INT_FALL_BITSET |= mask;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (event == IRQ_RISE) {
 | 
				
			||||||
 | 
					            GPIO_INT_RISE_BITSET &= ~mask;
 | 
				
			||||||
 | 
					        } else if (event == IRQ_FALL) {
 | 
				
			||||||
 | 
					            GPIO_INT_FALL_BITSET &= ~mask;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_irq_enable(gpio_irq_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    (void) obj;
 | 
				
			||||||
 | 
					    NVIC_EnableIRQ  (GPIO_IRQn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_irq_disable(gpio_irq_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    (void) obj;
 | 
				
			||||||
 | 
					    NVIC_DisableIRQ  (GPIO_IRQn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,57 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2006-2013 ARM Limited
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef MBED_GPIO_OBJECT_H
 | 
				
			||||||
 | 
					#define MBED_GPIO_OBJECT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mbed_assert.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    PinName  pin;
 | 
				
			||||||
 | 
					    uint32_t mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    __IO uint32_t *reg_dir;
 | 
				
			||||||
 | 
					    __IO uint32_t *reg_set;
 | 
				
			||||||
 | 
					    __IO uint32_t *reg_clr;
 | 
				
			||||||
 | 
					    __I  uint32_t *reg_val;
 | 
				
			||||||
 | 
					} gpio_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void gpio_write(gpio_t *obj, int value) {
 | 
				
			||||||
 | 
					    MBED_ASSERT(obj->pin != (PinName)NC);
 | 
				
			||||||
 | 
					    if (value) {
 | 
				
			||||||
 | 
					        *obj->reg_set = obj->mask;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        *obj->reg_clr = obj->mask;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int gpio_read(gpio_t *obj) {
 | 
				
			||||||
 | 
					    MBED_ASSERT(obj->pin != (PinName)NC);
 | 
				
			||||||
 | 
					    return ((*obj->reg_val & obj->mask) ? 1 : 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int gpio_is_connected(const gpio_t *obj) {
 | 
				
			||||||
 | 
					    return obj->pin != (PinName)NC;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,69 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include "mbed_assert.h"
 | 
				
			||||||
 | 
					#include "cmsis.h"
 | 
				
			||||||
 | 
					#include "hi2110_init.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint8_t get_owner(uint8_t pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * NON-API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Determine which core owns a given pin
 | 
				
			||||||
 | 
					 * 0: None
 | 
				
			||||||
 | 
					 * 1: security core
 | 
				
			||||||
 | 
					 * 2: protocol core
 | 
				
			||||||
 | 
					 * 3: apps core */
 | 
				
			||||||
 | 
					static uint8_t get_owner(uint8_t pin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t value;
 | 
				
			||||||
 | 
					    uint8_t pio_owner_shift = (pin & 0x0F) << 1;
 | 
				
			||||||
 | 
					    volatile uint32_t * pio_owner_reg = (&PIO_OWNER0 + (pin >> 4));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    value = 0x03 & (*pio_owner_reg >> pio_owner_shift);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return value;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void HI2110_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    __attribute__ ((unused)) uint8_t owner[20];
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* This purely for diagnostics to see who owns which PIO pin.
 | 
				
			||||||
 | 
					     * Put a break-point at the end of this function and take a look
 | 
				
			||||||
 | 
					     * at the array.
 | 
				
			||||||
 | 
					     * Any items marked as 1 or 2 belong to the security or protocol
 | 
				
			||||||
 | 
					     * cores.  Otherwise they are up for grabs. */
 | 
				
			||||||
 | 
					    for (uint8_t x = 0; x < 20; x++) {
 | 
				
			||||||
 | 
					        owner[x] = get_owner(x);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef HI2110_INIT_H
 | 
				
			||||||
 | 
					#define HI2110_INIT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void HI2110_init(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,340 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The LP Ticker performs two functions for mbed:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 1.  Allows tracking of the passage of time.
 | 
				
			||||||
 | 
					 * 2.  Allows the system to enter the lowest power
 | 
				
			||||||
 | 
					 *     state for a given time.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * For this to work the single RTC interrupt needs
 | 
				
			||||||
 | 
					 * to perform two functions.  It needs to increment
 | 
				
			||||||
 | 
					 * an overflow counter at every 32-bit overflow without
 | 
				
			||||||
 | 
					 * otherwise affecting the system state (i.e. not waking it
 | 
				
			||||||
 | 
					 * up and not putting it to sleep) and, when requested,
 | 
				
			||||||
 | 
					 * it *also* needs to wake the system up from sleep
 | 
				
			||||||
 | 
					 * at a specific time.  Note also that the units of time
 | 
				
			||||||
 | 
					 * from an mbed perspective are useconds, whereas the RTC
 | 
				
			||||||
 | 
					 * is clocked at 32 kHz, hence there is conversion to be done.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Since it is not possible to reset the RTC, we maintain
 | 
				
			||||||
 | 
					 * a 32-bit window on it, starting at g_last_32bit_overflow_value
 | 
				
			||||||
 | 
					 * and ending at g_next_32bit_overflow_value.  All values
 | 
				
			||||||
 | 
					 * fed back up to mbed are relative to g_last_32bit_overflow_value.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "lp_ticker_api.h"
 | 
				
			||||||
 | 
					#include "sleep_api.h"
 | 
				
			||||||
 | 
					#include "critical.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The maximum value of the RTC (48 bits) */
 | 
				
			||||||
 | 
					#define RTC_MAX 0x0000FFFFFFFFFFFFULL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* RTC modulo */
 | 
				
			||||||
 | 
					#define RTC_MODULO (RTC_MAX + 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The 32-bit overflow value */
 | 
				
			||||||
 | 
					#define MODULO_32BIT 0x100000000ULL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Macro to increment a 64-bit RTC value x by y, with wrap */
 | 
				
			||||||
 | 
					#define INCREMENT_MOD(x, y)  (x = ((uint64_t) x + (uint64_t) y) % RTC_MODULO)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Macro to get MSBs from a 64-bit integer */
 | 
				
			||||||
 | 
					#define MSBS(x) ((uint32_t) ((uint64_t) (x) >> 32))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Macro to get LSBs from a 64-bit integer */
 | 
				
			||||||
 | 
					#define LSBS(x) ((uint32_t) (x))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * TYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * GLOBAL VARIABLES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Incremented each time the RTC goes over 32 bits */
 | 
				
			||||||
 | 
					static uint32_t g_overflow_count = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set when a user interrupt has been requested but an overflow
 | 
				
			||||||
 | 
					 * interrupt needs to happen first */
 | 
				
			||||||
 | 
					static bool g_user_interrupt_pending = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set when a user interrupt is the next interrupt to happen */
 | 
				
			||||||
 | 
					static bool g_user_interrupt_set = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Initialised flag, used to protect against interrupts going
 | 
				
			||||||
 | 
					 * off before we're initialised */
 | 
				
			||||||
 | 
					static bool g_initialised = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The next overflow value to be used */
 | 
				
			||||||
 | 
					static uint64_t g_next_32bit_overflow_value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The next match-compare value to be used */
 | 
				
			||||||
 | 
					static uint64_t g_next_compare_value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Keep track of the previous 32-bit overflow
 | 
				
			||||||
 | 
					 * value so that we can report 32-bit time
 | 
				
			||||||
 | 
					 * correctly */
 | 
				
			||||||
 | 
					static uint64_t g_last_32bit_overflow_value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void set_interrupt_to_32bit_overflow(void);
 | 
				
			||||||
 | 
					static void set_interrupt_to_user_value(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * STATIC FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Convert a tick value (32,768 Hz) into a microsecond value */
 | 
				
			||||||
 | 
					static inline uint32_t ticksToUSeconds(uint32_t x)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* TODO: find a way to avoid the multiply by 1000000
 | 
				
			||||||
 | 
					     * Shift by 20 would introduce a 5% error, which is
 | 
				
			||||||
 | 
					     * probably too much */
 | 
				
			||||||
 | 
					    uint64_t result = ((((uint64_t) x) * 1000000) >> 15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (result > 0xFFFFFFFF) {
 | 
				
			||||||
 | 
					        result = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (uint32_t) result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Convert a microsecond value into a tick value (32,768 Hz) */
 | 
				
			||||||
 | 
					static inline uint32_t uSecondsToTicks(uint32_t x)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* TODO: find a way to avoid the divide by 1000000
 | 
				
			||||||
 | 
					     * Shift by 20 would introduce a 5% error, which is
 | 
				
			||||||
 | 
					     * probably too much */
 | 
				
			||||||
 | 
					    return (uint32_t) ((((uint64_t) x) << 15) / 1000000);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Take g_next_32bit_overflow_value and apply it to g_next_compare_value and
 | 
				
			||||||
 | 
					 * then the chip registers
 | 
				
			||||||
 | 
					 * NOTE: the RTC interrupt should be disabled when calling this function */
 | 
				
			||||||
 | 
					static inline void set_interrupt_to_32bit_overflow()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Load up the values */
 | 
				
			||||||
 | 
					    g_next_compare_value = g_next_32bit_overflow_value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set up the match register values */
 | 
				
			||||||
 | 
					    RTC_IRQ_TIME_MSBS = MSBS(g_next_compare_value);
 | 
				
			||||||
 | 
					    RTC_IRQ_TIME_LSBS = LSBS(g_next_compare_value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Take g_next_compare_value and apply it to the chip registers
 | 
				
			||||||
 | 
					 * NOTE: the RTC interrupt should be disabled when calling this function */
 | 
				
			||||||
 | 
					static inline void set_interrupt_to_user_value()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_user_interrupt_set = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Write MSBS first, then the value is latched on LSBS write */
 | 
				
			||||||
 | 
					    RTC_IRQ_TIME_MSBS = MSBS(g_next_compare_value);
 | 
				
			||||||
 | 
					    RTC_IRQ_TIME_LSBS = LSBS(g_next_compare_value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Get the RTC value
 | 
				
			||||||
 | 
					 * NOTE: the RTC interrupt should be disabled when calling this function */
 | 
				
			||||||
 | 
					static inline uint64_t get_rtc_value()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint64_t rtc_value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rtc_value = ((uint64_t) RTC_TIME_MSBS) << 32;
 | 
				
			||||||
 | 
					    rtc_value |= RTC_TIME_LSBS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return rtc_value;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * NON-API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* RTC handler */
 | 
				
			||||||
 | 
					void IRQ0_RTC_Handler(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Have seen this interrupt occurring before initialisation, so guard
 | 
				
			||||||
 | 
					     * against that */
 | 
				
			||||||
 | 
					    if (g_initialised) {
 | 
				
			||||||
 | 
					        if (g_user_interrupt_pending) {
 | 
				
			||||||
 | 
					            /* If there was a user interrupt pending, set it now */
 | 
				
			||||||
 | 
					            set_interrupt_to_user_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Reset the pending flag */
 | 
				
			||||||
 | 
					            g_user_interrupt_pending = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* This must have been a 32-bit overflow interrupt so
 | 
				
			||||||
 | 
					             * increment the count */
 | 
				
			||||||
 | 
					            g_overflow_count++;
 | 
				
			||||||
 | 
					            g_last_32bit_overflow_value = g_next_32bit_overflow_value;
 | 
				
			||||||
 | 
					            INCREMENT_MOD(g_next_32bit_overflow_value, MODULO_32BIT);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            if (g_user_interrupt_set) {
 | 
				
			||||||
 | 
					                /* It's a user interrupt, so wake from sleep but don't
 | 
				
			||||||
 | 
					                 * increment the overflow count as this is not an
 | 
				
			||||||
 | 
					                 * overflow interrupt */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                /* Reset the user interrupt flag and call mbed */
 | 
				
			||||||
 | 
					                g_user_interrupt_set = false;
 | 
				
			||||||
 | 
					                lp_ticker_irq_handler();
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                /* Increment the count as this was a 32-bit overflow
 | 
				
			||||||
 | 
					                 * interrupt rather than a user interrupt */
 | 
				
			||||||
 | 
					                g_overflow_count++;
 | 
				
			||||||
 | 
					                g_last_32bit_overflow_value = g_next_32bit_overflow_value;
 | 
				
			||||||
 | 
					                INCREMENT_MOD(g_next_32bit_overflow_value, MODULO_32BIT);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Set the next interrupt to be at the 32-bit overflow */
 | 
				
			||||||
 | 
					            set_interrupt_to_32bit_overflow();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Clear the interrupt */
 | 
				
			||||||
 | 
					    RTC_IRQ_CLR = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API CALLS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This will be called once at start of day to get the RTC running */
 | 
				
			||||||
 | 
					void lp_ticker_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!g_initialised) {
 | 
				
			||||||
 | 
					        /* Reset the overflow count and the flags */
 | 
				
			||||||
 | 
					        g_overflow_count = 0;
 | 
				
			||||||
 | 
					        g_user_interrupt_pending = false;
 | 
				
			||||||
 | 
					        g_user_interrupt_set = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Setup the next natural 32-bit overflow value */
 | 
				
			||||||
 | 
					        g_next_32bit_overflow_value = get_rtc_value();
 | 
				
			||||||
 | 
					        g_last_32bit_overflow_value = g_next_32bit_overflow_value;
 | 
				
			||||||
 | 
					        INCREMENT_MOD(g_next_32bit_overflow_value, MODULO_32BIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Clear the interrupt */
 | 
				
			||||||
 | 
					        RTC_IRQ_CLR = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Interrupt at 32-bit overflow */
 | 
				
			||||||
 | 
					        set_interrupt_to_32bit_overflow();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Enable the interrupt */
 | 
				
			||||||
 | 
					        g_initialised = true;
 | 
				
			||||||
 | 
					        NVIC_EnableIRQ(RTC_IRQn);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t lp_ticker_read(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint64_t rtcNow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable interrupts to avoid collisions */
 | 
				
			||||||
 | 
					    core_util_critical_section_enter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Just in case this is called before initialisation has been performed */
 | 
				
			||||||
 | 
					    if (!g_initialised) {
 | 
				
			||||||
 | 
					        lp_ticker_init();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* What mbed expects here is a 32 bit timer value.  There is no
 | 
				
			||||||
 | 
					     * way to reset the RTC so, to pretend it is 32 bits, we have to
 | 
				
			||||||
 | 
					     * maintain a 32-bit window on it using the remembered overflow
 | 
				
			||||||
 | 
					     * value */
 | 
				
			||||||
 | 
					    rtcNow = get_rtc_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Put interrupts back */
 | 
				
			||||||
 | 
					    core_util_critical_section_exit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ticksToUSeconds(rtcNow - g_last_32bit_overflow_value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void lp_ticker_set_interrupt(timestamp_t time)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t timeNow = get_rtc_value() - g_last_32bit_overflow_value;
 | 
				
			||||||
 | 
					    uint32_t timeOffset = uSecondsToTicks(time) - timeNow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable interrupts to avoid collisions */
 | 
				
			||||||
 | 
					    core_util_critical_section_enter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_user_interrupt_pending = false;
 | 
				
			||||||
 | 
					    g_user_interrupt_set = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Handle time slipping into the past */
 | 
				
			||||||
 | 
					    if (timeOffset > 0xEFFFFFFF) {
 | 
				
			||||||
 | 
					        timeOffset = 100;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Read the current time */
 | 
				
			||||||
 | 
					    g_next_compare_value = get_rtc_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Add the offset */
 | 
				
			||||||
 | 
					    INCREMENT_MOD(g_next_compare_value, timeOffset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* We must let the normal overflow interrupt occur as
 | 
				
			||||||
 | 
					     * well as setting this interrupt so, if the value
 | 
				
			||||||
 | 
					     * of 'time' would occur after the overflow point,
 | 
				
			||||||
 | 
					     * put the change of compare-value off until afterwards. */
 | 
				
			||||||
 | 
					    /* TODO: this needs proper testing. */
 | 
				
			||||||
 | 
					    if (g_next_32bit_overflow_value > g_next_compare_value) {
 | 
				
			||||||
 | 
					        /* The easy case, no overlap */
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        /* Could be because g_next_compare_value has wrapped (around the
 | 
				
			||||||
 | 
					         * 48-bit limit of the RTC) */
 | 
				
			||||||
 | 
					        if (g_next_32bit_overflow_value - g_next_compare_value >= MODULO_32BIT) {
 | 
				
			||||||
 | 
					            /* The wrap case, we're OK */
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            /* There is an overlap, apply the value later */
 | 
				
			||||||
 | 
					            g_user_interrupt_pending = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (g_next_32bit_overflow_value == g_next_compare_value) {
 | 
				
			||||||
 | 
					                /* If they are on top of each other, bump this
 | 
				
			||||||
 | 
					                 * one forward to avoid losing the interrupt */
 | 
				
			||||||
 | 
					                INCREMENT_MOD(g_next_compare_value, 2);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!g_user_interrupt_pending) {
 | 
				
			||||||
 | 
					        /* Make the change immediately */
 | 
				
			||||||
 | 
					        set_interrupt_to_user_value();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Put interrupts back */
 | 
				
			||||||
 | 
					    core_util_critical_section_exit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void lp_ticker_disable_interrupt(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Can't disable interrupts as we need them to manage
 | 
				
			||||||
 | 
					     * overflow.  Instead, switch off the user part. */
 | 
				
			||||||
 | 
					    g_user_interrupt_pending = false;
 | 
				
			||||||
 | 
					    g_user_interrupt_set = false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void lp_ticker_clear_interrupt(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Can't disable interrupts as we need them to manage
 | 
				
			||||||
 | 
					     * overflow.  Instead, switch off the user part. */
 | 
				
			||||||
 | 
					    g_user_interrupt_pending = false;
 | 
				
			||||||
 | 
					    g_user_interrupt_set = false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					#include "hi2110_init.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * NON-API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mbed_sdk_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    HI2110_init();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,73 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MBED_OBJECTS_H
 | 
				
			||||||
 | 
					#define MBED_OBJECTS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cmsis.h"
 | 
				
			||||||
 | 
					#include "PortNames.h"
 | 
				
			||||||
 | 
					#include "PeripheralNames.h"
 | 
				
			||||||
 | 
					#include "PinNames.h"
 | 
				
			||||||
 | 
					#include "stdbool.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    IRQ_NOT_SET,
 | 
				
			||||||
 | 
					    IRQ_ON,
 | 
				
			||||||
 | 
					    IRQ_OFF
 | 
				
			||||||
 | 
					} irq_setting_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct port_s {
 | 
				
			||||||
 | 
					    __IO uint32_t *reg_dir;
 | 
				
			||||||
 | 
					    __IO uint32_t *reg_out;
 | 
				
			||||||
 | 
					    __IO uint32_t *reg_val;
 | 
				
			||||||
 | 
					    __IO uint32_t *reg_drv;
 | 
				
			||||||
 | 
					    PortName port;
 | 
				
			||||||
 | 
					    uint32_t mask;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct gpio_irq_s {
 | 
				
			||||||
 | 
					    /* Don't bother with having a port number here as there's only one */
 | 
				
			||||||
 | 
					    uint32_t ch;   /* Corresponds to the interrupt pin */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct serial_s {
 | 
				
			||||||
 | 
					    SerialConfig config;
 | 
				
			||||||
 | 
					    PinName rx_pin;
 | 
				
			||||||
 | 
					    PinName tx_pin;
 | 
				
			||||||
 | 
					    volatile uart_ctrl_t *reg_base;
 | 
				
			||||||
 | 
					    uint8_t index;
 | 
				
			||||||
 | 
					    uint32_t baud_rate;
 | 
				
			||||||
 | 
					    bool format_set; /* If true then the struct that follows is populated */
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					        uint8_t stop_bits;
 | 
				
			||||||
 | 
					        uint8_t data_bits;
 | 
				
			||||||
 | 
					        uint8_t parity;
 | 
				
			||||||
 | 
					    } format;
 | 
				
			||||||
 | 
					    irq_setting_t irq_rx_setting;
 | 
				
			||||||
 | 
					    irq_setting_t irq_tx_setting;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "gpio_object.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,145 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* As well as claiming and setting pins, the functions here also need
 | 
				
			||||||
 | 
					 * to take into account the way the pins are powered.  On the Boudica
 | 
				
			||||||
 | 
					 * chip they are arranged in three banks, PIO 0:5, PIO 6:10 and
 | 
				
			||||||
 | 
					 * PIO 11:19.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The arrangement for which PIO bank is powered is determined by the module
 | 
				
			||||||
 | 
					 * in which the HI2110 chip is mounted, hence the use of conditional
 | 
				
			||||||
 | 
					 * compilation below.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "stdbool.h"
 | 
				
			||||||
 | 
					#include "mbed_assert.h"
 | 
				
			||||||
 | 
					#include "mbed_error.h"
 | 
				
			||||||
 | 
					#include "pinmap.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define HAL_PIO_MASK_FUNC (0xFF)
 | 
				
			||||||
 | 
					#define HAL_PIO_MODULO_4_MASK (0x3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * GLOBAL VARIABLES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint32_t clr_mask (PinName pin);
 | 
				
			||||||
 | 
					static inline uint32_t set_mask (PinName pin, int function);
 | 
				
			||||||
 | 
					static inline volatile uint32_t * func_reg (PinName pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * NON-API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Return the clear mask for a pin
 | 
				
			||||||
 | 
					static inline uint32_t clr_mask (PinName pin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return HAL_PIO_MASK_FUNC << ((pin & HAL_PIO_MODULO_4_MASK) << 3);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Return the set mask for a pin and a given function
 | 
				
			||||||
 | 
					static inline uint32_t set_mask (PinName pin, int function)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return function << ((pin & HAL_PIO_MODULO_4_MASK) << 3);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Return the function register for a pin
 | 
				
			||||||
 | 
					static inline volatile uint32_t * func_reg (PinName pin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return &PIO_FUNC0 + (pin >> 2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Return the owner of a pin
 | 
				
			||||||
 | 
					// 0: None
 | 
				
			||||||
 | 
					// 1: security core
 | 
				
			||||||
 | 
					// 2: protocol core
 | 
				
			||||||
 | 
					// 3: apps core
 | 
				
			||||||
 | 
					static inline uint8_t get_owner(PinName pin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t pio_owner_shift = (pin & 0x0F) << 1;
 | 
				
			||||||
 | 
					    volatile uint32_t * pio_owner_reg = (&PIO_OWNER0 + (pin >> 4));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0x03 & (*pio_owner_reg >> pio_owner_shift);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED "INTERNAL" API CALLS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void pin_function(PinName pin, int function)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    volatile uint32_t *pio_func_reg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set the function for the given pin */
 | 
				
			||||||
 | 
					    pio_func_reg = func_reg (pin);
 | 
				
			||||||
 | 
					    *pio_func_reg = (*pio_func_reg & ~(clr_mask(pin))) | set_mask(pin, function);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Power the pin */
 | 
				
			||||||
 | 
					#ifdef TARGET_SARA_NBIOT
 | 
				
			||||||
 | 
					    /* On Sara NBIoT, GPIO pin 19 has to be high to power GPIO pins 0 to 10 */
 | 
				
			||||||
 | 
					    if ((pin >= p0) && (pin <= p10)) {
 | 
				
			||||||
 | 
					        /* Grab pin 19 as a GPIO if we don't have it already */
 | 
				
			||||||
 | 
					        if (get_owner(p19) != 0x03) {
 | 
				
			||||||
 | 
					            pio_func_reg = func_reg (p19);
 | 
				
			||||||
 | 
					            *pio_func_reg = (*pio_func_reg & ~(clr_mask(p19))) | set_mask(p19, 1); /* 1 == PIN_FUNCTION_GPIO */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            MBED_ASSERT (get_owner(p19) == 0x03);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Set pin 19 to be an output and to be high */
 | 
				
			||||||
 | 
					        GPIO_DIR |= (1ul << p19);
 | 
				
			||||||
 | 
					        GPIO_OUT_BITSET = (1ul << p19);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Note: the level on pins 6 to 10 is controlled by the protocol
 | 
				
			||||||
 | 
					         * processor to be the VCC level required by the SIM.  The
 | 
				
			||||||
 | 
					         * application has no control over this. */
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* The power to GPIOs 11 to 19 is fed directly from pin 51 of the module */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void pin_mode(PinName pin, PinMode mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MBED_ASSERT(pin != (PinName)NC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (mode) {
 | 
				
			||||||
 | 
					        case PullUp:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);  /* Not currently supported on HI2100 */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case PullDown:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            GPIO_PULLEN_BITSET = 1U << pin;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case PullNone:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            GPIO_PULLEN_BITCLR = 1U << pin;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,103 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TODO: this needs testing */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "port_api.h"
 | 
				
			||||||
 | 
					#include "pinmap.h"
 | 
				
			||||||
 | 
					#include "gpio_api.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PinName port_pin(PortName port, int pin_n)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MBED_ASSERT (port < PortMaxNumber);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (void) port;
 | 
				
			||||||
 | 
					    return (PinName)(pin_n);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MBED_ASSERT (port < PortMaxNumber);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->port = port;
 | 
				
			||||||
 | 
					    obj->mask = mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->reg_dir = &GPIO_DIR;
 | 
				
			||||||
 | 
					    obj->reg_out = &GPIO_OUT;
 | 
				
			||||||
 | 
					    obj->reg_val = &GPIO_VALUE;
 | 
				
			||||||
 | 
					    obj->reg_drv = &GPIO_DRIVE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Claim the pins */
 | 
				
			||||||
 | 
					    for (uint8_t x = 0; x < NUM_PINS; x++) {
 | 
				
			||||||
 | 
					        if (mask & (1ul << x)) {
 | 
				
			||||||
 | 
					            pin_function((PinName) x, PIN_FUNCTION_GPIO);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Set up the pins */
 | 
				
			||||||
 | 
					    port_dir(obj, dir);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void port_mode(port_t *obj, PinMode mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch (mode) {
 | 
				
			||||||
 | 
					        case PullUp:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);  /* Not currently supported on HI2110 */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case PullDown:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            GPIO_PULLEN_BITSET |= obj->mask;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case PullNone:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            GPIO_PULLEN_BITCLR &= ~(obj->mask);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void port_dir(port_t *obj, PinDirection dir)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch (dir) {
 | 
				
			||||||
 | 
					        case PIN_INPUT:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            *(obj->reg_dir) &= ~(obj->mask);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case PIN_OUTPUT:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            *(obj->reg_dir) |= obj->mask;
 | 
				
			||||||
 | 
					            /* TODO: do we need to set the drive strength?  If so, how do we decide which way? */
 | 
				
			||||||
 | 
					            /* obj->reg_drv |= obj->mask; */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void port_write(port_t *obj, int value)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    *(obj->reg_out) = value;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int port_read(port_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return *(obj->reg_val);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,819 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The serial driver connects UART HW to mbed and also associates the UART
 | 
				
			||||||
 | 
					 * HW with physical pins.  Any physical pin can be linked to any UART,
 | 
				
			||||||
 | 
					 * however the mbed serial port initialisation API makes no mention of
 | 
				
			||||||
 | 
					 * which UART HW is to be used (only the pins) and hence the driver needs
 | 
				
			||||||
 | 
					 * to make some decisions for itself.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * There are two and a half UARTs on the chip: UART0, UART1 and a
 | 
				
			||||||
 | 
					 * lower-power, receive-only UART that is clocked from 32 kHz and can
 | 
				
			||||||
 | 
					 * therefore be awake while the rest of the chip is sleeping peacefully.
 | 
				
			||||||
 | 
					 * This provides maximal power saving, however the LP UART can only run
 | 
				
			||||||
 | 
					 * at 9600 bits/s (which is quite sufficient for all NB-IoT needs).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * So, if the baud rate is 9600 the driver code configures the LP UART
 | 
				
			||||||
 | 
					 * for Rx and UART0 for Tx. If the baud rate is not 9600 then it configures
 | 
				
			||||||
 | 
					 * UART0 for both Rx and Tx.  Unless... the Tx pin is the pin UART1_TX (it
 | 
				
			||||||
 | 
					 * is an mbed convention to use the Tx pin), which is p6, in which case UART1
 | 
				
			||||||
 | 
					 * is configured instead.  This latter is not the normal case as this pin
 | 
				
			||||||
 | 
					 * is intended to be used as a GPIO.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If the baud rate is changed the driver reconfigures to match.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * TODO: implement asynchronous and flow control APIs.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mbed_assert.h"
 | 
				
			||||||
 | 
					#include "serial_api.h"
 | 
				
			||||||
 | 
					#include "pinmap.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cmsis.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Registers banks for the standard UARTs */
 | 
				
			||||||
 | 
					#define UART0_REG (*(volatile uart_ctrl_t *) UART0_BASE)
 | 
				
			||||||
 | 
					#define UART1_REG (*(volatile uart_ctrl_t *) UART1_BASE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Masks for the UART control bits in the reset and clock enable registers */
 | 
				
			||||||
 | 
					#define UART0_CTRL  (1 << 3)
 | 
				
			||||||
 | 
					#define UART1_CTRL  (1 << 4)
 | 
				
			||||||
 | 
					#define UARTLP_CTRL (1 << 6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Convert number of data bits to register values */
 | 
				
			||||||
 | 
					#define MIN_NUM_UART_DATA_BITS 5
 | 
				
			||||||
 | 
					#define MAX_NUM_UART_DATA_BITS 8
 | 
				
			||||||
 | 
					#define REGISTER_DATA_BITS(x) ((x) - MIN_NUM_UART_DATA_BITS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Number of stop bits */
 | 
				
			||||||
 | 
					#define NUM_UART_STOP_BITS_1 1
 | 
				
			||||||
 | 
					#define NUM_UART_STOP_BITS_2 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * TYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Enum to identify the interrupt to the UART handler */
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    IRQ_UART_ID_0_AND_LP,
 | 
				
			||||||
 | 
					    IRQ_UART_ID_1,
 | 
				
			||||||
 | 
					    NUM_IRQ_IDS
 | 
				
			||||||
 | 
					} irq_uart_id_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * GLOBAL VARIABLES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The IRQ configuration variables, set up and named by mbed */
 | 
				
			||||||
 | 
					static uint32_t serial_irq_ids[NUM_IRQ_IDS] = {0};
 | 
				
			||||||
 | 
					static uart_irq_handler irq_handler = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* RTX needs these */
 | 
				
			||||||
 | 
					int stdio_uart_inited = 0;
 | 
				
			||||||
 | 
					serial_t stdio_uart;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void init_config(serial_t *obj);
 | 
				
			||||||
 | 
					static void deinit_config(serial_t *obj);
 | 
				
			||||||
 | 
					static void set_baud(serial_t *obj, uint32_t baud_rate);
 | 
				
			||||||
 | 
					static void irq_enable(serial_t *obj);
 | 
				
			||||||
 | 
					static void irq_disable(serial_t *obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * NON-API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Initialise the given serial config by setting the pin functions
 | 
				
			||||||
 | 
					 * and then resetting the relevant HW */
 | 
				
			||||||
 | 
					static void init_config(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (obj->config) {
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UARTLP_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            pin_function(obj->rx_pin, PIN_FUNCTION_LP_UART);
 | 
				
			||||||
 | 
					            pin_function(obj->tx_pin, PIN_FUNCTION_UART0_TXD);
 | 
				
			||||||
 | 
					            CLKEN_REG_BITSET = UARTLP_CTRL | UART0_CTRL;
 | 
				
			||||||
 | 
					            obj->reg_base = &UART0_REG;
 | 
				
			||||||
 | 
					            obj->index = IRQ_UART_ID_0_AND_LP;
 | 
				
			||||||
 | 
					            /* Reset the LPUART and UART0 HW */
 | 
				
			||||||
 | 
					            /* NOTE: RESET_REG_BITTOG doesn't have the desired
 | 
				
			||||||
 | 
					             * effect, need to use BITSET and then BITCLR */
 | 
				
			||||||
 | 
					            RESET_REG_BITSET |= 1ul << 6;
 | 
				
			||||||
 | 
					            RESET_REG_BITCLR |= 1ul << 6;
 | 
				
			||||||
 | 
					            RESET_REG_BITSET |= 1ul << 3;
 | 
				
			||||||
 | 
					            RESET_REG_BITCLR |= 1ul << 3;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART0_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            pin_function(obj->rx_pin, PIN_FUNCTION_UART0_RXD);
 | 
				
			||||||
 | 
					            pin_function(obj->tx_pin, PIN_FUNCTION_UART0_TXD);
 | 
				
			||||||
 | 
					            CLKEN_REG_BITSET = UART0_CTRL;
 | 
				
			||||||
 | 
					            obj->reg_base = &UART0_REG;
 | 
				
			||||||
 | 
					            obj->index = IRQ_UART_ID_0_AND_LP;
 | 
				
			||||||
 | 
					            /* Reset the UART0 HW */
 | 
				
			||||||
 | 
					            RESET_REG_BITSET |= 1ul << 3;
 | 
				
			||||||
 | 
					            RESET_REG_BITCLR |= 1ul << 3;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART1_RX_UART1_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            pin_function(obj->rx_pin, PIN_FUNCTION_UART1_RXD);
 | 
				
			||||||
 | 
					            pin_function(obj->tx_pin, PIN_FUNCTION_UART1_TXD);
 | 
				
			||||||
 | 
					            CLKEN_REG_BITSET = UART1_CTRL;
 | 
				
			||||||
 | 
					            obj->reg_base = &UART1_REG;
 | 
				
			||||||
 | 
					            obj->index = IRQ_UART_ID_1;
 | 
				
			||||||
 | 
					            /* Reset the UART1 HW */
 | 
				
			||||||
 | 
					            RESET_REG_BITSET |= 1ul << 4;
 | 
				
			||||||
 | 
					            RESET_REG_BITCLR |= 1ul << 4;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Tickle the UART control register to make sure it is updated */
 | 
				
			||||||
 | 
					    x = obj->reg_base->UARTLCR_H;
 | 
				
			||||||
 | 
					    obj->reg_base->UARTLCR_H = x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set the FIFO. The meaning of the three FIFO interrupt-level
 | 
				
			||||||
 | 
					     * bits are as follows:
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * 0 = 1/8 full
 | 
				
			||||||
 | 
					     * 1 = 1/4 full
 | 
				
			||||||
 | 
					     * 2 = 1/2 full
 | 
				
			||||||
 | 
					     * 3 = 3/4 full
 | 
				
			||||||
 | 
					     * 4 = 7/8 full
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * Set up the Rx FIFO to be used fully (but we will also set
 | 
				
			||||||
 | 
					     * a timeout to get immediate notice) and also the Tx FIFO
 | 
				
			||||||
 | 
					     * to be fully used. */
 | 
				
			||||||
 | 
					     obj->reg_base->UARTIFLS = (obj->reg_base->UARTIFLS & ~(0x07 << 0)) | (4 << 0);
 | 
				
			||||||
 | 
					     obj->reg_base->UARTIFLS = (obj->reg_base->UARTIFLS & ~(0x07 << 3)) | (4 << 3);
 | 
				
			||||||
 | 
					     obj->reg_base->UARTLCR_H |= 1 << 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable for Tx and Rx (TODO: add CTS when we add flow control) */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR |= (1 << 8) | (1 << 9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Now enable it */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR |= 1 << 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->format_set = false;
 | 
				
			||||||
 | 
					    obj->baud_rate = 0;
 | 
				
			||||||
 | 
					    obj->irq_rx_setting = IRQ_NOT_SET;
 | 
				
			||||||
 | 
					    obj->irq_tx_setting = IRQ_NOT_SET;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Release a serial port */
 | 
				
			||||||
 | 
					static void deinit_config(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    pin_function(obj->rx_pin, PIN_FUNCTION_UNCLAIMED);
 | 
				
			||||||
 | 
					    pin_function(obj->tx_pin, PIN_FUNCTION_UNCLAIMED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable UART */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR &= ~(1 << 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Flush transmit FIFO */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTLCR_H = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable everything */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (obj->config) {
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UARTLP_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CLKEN_REG_BITCLR = UARTLP_CTRL | UART0_CTRL;
 | 
				
			||||||
 | 
					            LP_UART_CTRL &= ~(0xF << 20); /* Disable all LP interrupts */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART0_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CLKEN_REG_BITCLR = UART0_CTRL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART1_RX_UART1_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CLKEN_REG_BITCLR = UART1_CTRL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->config = MAX_NUM_SERIAL_CONFIGS;
 | 
				
			||||||
 | 
					    obj->reg_base = NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set the baud rate for either of the two (non-LP) UARTS */
 | 
				
			||||||
 | 
					static void set_baud(serial_t *obj, uint32_t baud_rate)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t baud_rate_divider_i;
 | 
				
			||||||
 | 
					    uint32_t baud_rate_divider_f;
 | 
				
			||||||
 | 
					    uint32_t remainder;
 | 
				
			||||||
 | 
					    uint32_t core_clock;
 | 
				
			||||||
 | 
					    uint32_t x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Baud rate divider calculation:
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * The integer part is: clock / (16 * baud)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * The fractional part is:  round (decimal_part * 64),
 | 
				
			||||||
 | 
					     * ...where decimal part is, for example, 0.085
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * decimal_part is: remainder / (16 * baud),
 | 
				
			||||||
 | 
					     * ...where: remainder = core_clock % (baud * 16),
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * So the fractional part becomes:
 | 
				
			||||||
 | 
					     * round (decimal_part * 64) = round (remainder * 64 / (16 * baud)) = round (remainder * 4 / baud)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Get the mean clock frequency */
 | 
				
			||||||
 | 
					    core_clock = (CLK_FREQ_HIGHTARGET >> 1) + (CLK_FREQ_LOWTARGET >> 1);
 | 
				
			||||||
 | 
					    /* Work out the actual clock frequency */
 | 
				
			||||||
 | 
					    core_clock = (core_clock * CLOCKS_REFERENCE_CLOCK_FREQ) / (((CLK_FREQ_NREFCLKS + 1) & 0xFFFF) * (CLK_GATE_SYS & 0xFF));
 | 
				
			||||||
 | 
					    baud_rate_divider_i = core_clock / (baud_rate << 4);
 | 
				
			||||||
 | 
					    remainder = core_clock % (baud_rate << 4);
 | 
				
			||||||
 | 
					    baud_rate_divider_f = ((remainder << 3) / baud_rate) >> 1;
 | 
				
			||||||
 | 
					    /* Round it */
 | 
				
			||||||
 | 
					    baud_rate_divider_f += ((remainder << 3) / baud_rate) & 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable UART while writing to control registers */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR &= ~(1 << 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->reg_base->UARTIBRD = baud_rate_divider_i;
 | 
				
			||||||
 | 
					    obj->reg_base->UARTFBRD = baud_rate_divider_f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Make IBRD and FBRD update */
 | 
				
			||||||
 | 
					    x = obj->reg_base->UARTLCR_H;
 | 
				
			||||||
 | 
					    obj->reg_base->UARTLCR_H = x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Now enable the UART again */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR |= 1 << 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set the NVIC bits */
 | 
				
			||||||
 | 
					static void irq_enable(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch (obj->config) {
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UARTLP_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NVIC_EnableIRQ(UART0_IRQn);
 | 
				
			||||||
 | 
					            NVIC_EnableIRQ(LPUART_IRQn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART0_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NVIC_EnableIRQ(UART0_IRQn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART1_RX_UART1_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NVIC_EnableIRQ(UART1_IRQn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Unset the NVIC bits */
 | 
				
			||||||
 | 
					static void irq_disable(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch (obj->config) {
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UARTLP_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NVIC_DisableIRQ(UART0_IRQn);
 | 
				
			||||||
 | 
					            NVIC_DisableIRQ(LPUART_IRQn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART0_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NVIC_DisableIRQ(UART0_IRQn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART1_RX_UART1_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NVIC_DisableIRQ(UART1_IRQn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* UART0 IRQ */
 | 
				
			||||||
 | 
					void IRQ7_UART0_Handler()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t id = serial_irq_ids[IRQ_UART_ID_0_AND_LP];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Check Rx and Rx Timeout bit */
 | 
				
			||||||
 | 
					    if (UART0_REG.UARTMIS & ((1 << 4) | (1 << 6))) {
 | 
				
			||||||
 | 
					        if (id != 0) {
 | 
				
			||||||
 | 
					            irq_handler(id, RxIrq);
 | 
				
			||||||
 | 
					            /* Reading the character clears the interrupt,
 | 
				
			||||||
 | 
					             * no way to protect against another arriving
 | 
				
			||||||
 | 
					             * while processing one */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* Check Tx bit */
 | 
				
			||||||
 | 
					    if (UART0_REG.UARTMIS & (1 << 5)) {
 | 
				
			||||||
 | 
					        if (id != 0) {
 | 
				
			||||||
 | 
					            irq_handler(id, TxIrq);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* Not sure what clears the interrupt so clear it explicitly */
 | 
				
			||||||
 | 
					        NVIC_ClearPendingIRQ(UART1_IRQn);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* UART1 IRQ */
 | 
				
			||||||
 | 
					void IRQ8_UART1_Handler()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t id = serial_irq_ids[IRQ_UART_ID_1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Check Rx and Rx Timeout bit */
 | 
				
			||||||
 | 
					    if (UART1_REG.UARTMIS & ((1 << 4) | (1 << 6))) {
 | 
				
			||||||
 | 
					        if (id != 0) {
 | 
				
			||||||
 | 
					            irq_handler(id, RxIrq);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* Reading the character clears the interrupt,
 | 
				
			||||||
 | 
					         * no way to protect against another arriving
 | 
				
			||||||
 | 
					         * while processing one */
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* Check Tx bit */
 | 
				
			||||||
 | 
					    if (UART1_REG.UARTMIS & (1 << 5)) {
 | 
				
			||||||
 | 
					        if (id != 0) {
 | 
				
			||||||
 | 
					            irq_handler(id, TxIrq);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* Not sure what clears the interrupt so clear it explicitly */
 | 
				
			||||||
 | 
					        NVIC_ClearPendingIRQ(UART1_IRQn);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* LP UART IRQ, receive only */
 | 
				
			||||||
 | 
					void IRQ16_LPUART_Handler()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t id = serial_irq_ids[IRQ_UART_ID_0_AND_LP];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (id != 0) {
 | 
				
			||||||
 | 
					        irq_handler(id, RxIrq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Another character might have arrived while
 | 
				
			||||||
 | 
					         * we are processing the last, so
 | 
				
			||||||
 | 
					         * check status bits 8 to 10 again and pend
 | 
				
			||||||
 | 
					         * interrupt if there's something there */
 | 
				
			||||||
 | 
					        if (((LP_UART_STATUS >> 8) & 0x07) != 0) {
 | 
				
			||||||
 | 
					            NVIC_SetPendingIRQ(LPUART_IRQn);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            LP_UART_CTRL |= 1 << 27; /* Clear the interrupt */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API CALLS: SETUP FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_init(serial_t *obj, PinName tx, PinName rx)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t clock = CLK_FREQ_DIG_CLKS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* There are two and a half UARTs on the chip. The normal
 | 
				
			||||||
 | 
					     * configuration is to use the LP_UART for Rx and UART0 for
 | 
				
			||||||
 | 
					     * Tx.  This gives maximal power saving in that the chip can
 | 
				
			||||||
 | 
					     * wake up on receipt of data. However, this only works if the
 | 
				
			||||||
 | 
					     * data rate is 9600 because that's the only data rate that
 | 
				
			||||||
 | 
					     * the 32 kHz (i.e. RTC) clock driving the LP UART can support.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * So, if the data rate is 9600, use the LP_UART/UART0
 | 
				
			||||||
 | 
					     * combination, otherwise use UART0 for both Rx and Tx.  However,
 | 
				
			||||||
 | 
					     * we don't know the data rate at this point so assume LP_UART
 | 
				
			||||||
 | 
					     * (as this works at the default baud rate) and we can change
 | 
				
			||||||
 | 
					     * our minds later.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * There is another serial port, UART1, which is normally used
 | 
				
			||||||
 | 
					     * by the modem processor to send out debug.  We only initialise
 | 
				
			||||||
 | 
					     * that here if the Tx pin is UART1_TX. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Wait for the clock to be stable */
 | 
				
			||||||
 | 
					    while ((clock < CLK_FREQ_LOWTARGET) || (clock > CLK_FREQ_HIGHTARGET)) {
 | 
				
			||||||
 | 
					        clock = CLK_FREQ_DIG_CLKS;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (tx == UART1_TX) {
 | 
				
			||||||
 | 
					        /* Use UART1 for Rx and Tx */
 | 
				
			||||||
 | 
					        obj->config = SERIAL_CONFIG_UART1_RX_UART1_TX;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        /* Use LP_UART for Rx, UART0 for Tx */
 | 
				
			||||||
 | 
					        obj->config = SERIAL_CONFIG_UARTLP_RX_UART0_TX;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->rx_pin = rx;
 | 
				
			||||||
 | 
					    obj->tx_pin = tx;
 | 
				
			||||||
 | 
					    init_config(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* TODO: set rx pin Pull mode ? */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* set default baud rate and format */
 | 
				
			||||||
 | 
					    serial_baud(obj, 9600);
 | 
				
			||||||
 | 
					    serial_format(obj, 8, ParityNone, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (tx == UART0_TX) {
 | 
				
			||||||
 | 
					        /* The UART0 pins are the stdio pins */
 | 
				
			||||||
 | 
					        stdio_uart_inited = 1;
 | 
				
			||||||
 | 
					        stdio_uart = *obj;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_free(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (obj->tx_pin == UART0_TX) {
 | 
				
			||||||
 | 
					        stdio_uart_inited = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    serial_irq_ids[obj->index] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Release the port HW */
 | 
				
			||||||
 | 
					    deinit_config(obj);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_baud(serial_t *obj, int baudrate)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    bool switch_port_config = false;
 | 
				
			||||||
 | 
					    bool format_set = obj->format_set;
 | 
				
			||||||
 | 
					    uint8_t stop_bits = obj->format.stop_bits;
 | 
				
			||||||
 | 
					    uint8_t data_bits = obj->format.data_bits;
 | 
				
			||||||
 | 
					    SerialParity parity = (SerialParity) obj->format.parity;
 | 
				
			||||||
 | 
					    irq_setting_t irq_rx_setting = obj->irq_rx_setting;
 | 
				
			||||||
 | 
					    irq_setting_t irq_tx_setting = obj->irq_tx_setting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((obj->config == SERIAL_CONFIG_UARTLP_RX_UART0_TX) && (baudrate != 9600)) {
 | 
				
			||||||
 | 
					        /* If we were on LP UART but the baud rate is not 9600 then
 | 
				
			||||||
 | 
					         * switch to the standard UART (as the LP UART can't go any higher
 | 
				
			||||||
 | 
					         * because it's clocked from 32 kHz) */
 | 
				
			||||||
 | 
					        deinit_config(obj);
 | 
				
			||||||
 | 
					        obj->config = SERIAL_CONFIG_UART0_RX_UART0_TX;
 | 
				
			||||||
 | 
					        init_config(obj);
 | 
				
			||||||
 | 
					        switch_port_config = true;
 | 
				
			||||||
 | 
					    } else if ((obj->config == SERIAL_CONFIG_UART0_RX_UART0_TX) && (baudrate == 9600)) {
 | 
				
			||||||
 | 
					        /* If we were on UART0 but the baud rate is 9600 then switch to the
 | 
				
			||||||
 | 
					         * LP UART for receive */
 | 
				
			||||||
 | 
					        deinit_config(obj);
 | 
				
			||||||
 | 
					        obj->config = SERIAL_CONFIG_UARTLP_RX_UART0_TX;
 | 
				
			||||||
 | 
					        init_config(obj);
 | 
				
			||||||
 | 
					        switch_port_config = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable UART while writing to control registers */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR &= ~(1 << 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (switch_port_config) {
 | 
				
			||||||
 | 
					        /* If the port was switched, switch the port configuration also */
 | 
				
			||||||
 | 
					        if (format_set) {
 | 
				
			||||||
 | 
					            /* This serial port has been previously set up so switch the
 | 
				
			||||||
 | 
					             * settings across to this new configuration */
 | 
				
			||||||
 | 
					            serial_format(obj, data_bits, parity, stop_bits);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (irq_rx_setting != IRQ_NOT_SET) {
 | 
				
			||||||
 | 
					            /* Do the same for Rx interrupts, if they were set */
 | 
				
			||||||
 | 
					            serial_irq_set(obj, RxIrq, (irq_rx_setting == IRQ_ON));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (irq_tx_setting != IRQ_NOT_SET) {
 | 
				
			||||||
 | 
					            /* Do the same for Tx interrupts, if they were set */
 | 
				
			||||||
 | 
					            serial_irq_set(obj, TxIrq, (irq_tx_setting == IRQ_ON));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (obj->config) {
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UARTLP_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /* Set LP UART to 9600 (numerator 75 (0x4B), denominator 256 (00 == 256)) */
 | 
				
			||||||
 | 
					            LP_UART_CTRL = (LP_UART_CTRL & ~0xFFFF) | 0x004B;
 | 
				
			||||||
 | 
					            set_baud(obj, baudrate);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART0_RX_UART0_TX:
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART1_RX_UART1_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            set_baud(obj, baudrate);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable the UART again */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR |= 1 << 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->baud_rate = baudrate;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    bool lp_also = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MBED_ASSERT(data_bits >= MIN_NUM_UART_DATA_BITS);
 | 
				
			||||||
 | 
					    MBED_ASSERT(data_bits <= MAX_NUM_UART_DATA_BITS);
 | 
				
			||||||
 | 
					    MBED_ASSERT(stop_bits >= NUM_UART_STOP_BITS_1);
 | 
				
			||||||
 | 
					    MBED_ASSERT(stop_bits <= NUM_UART_STOP_BITS_2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* The LP UART is different to UARTs 0 and 1 so deal with it
 | 
				
			||||||
 | 
					     * explicitly when required */
 | 
				
			||||||
 | 
					    if (obj->config == SERIAL_CONFIG_UARTLP_RX_UART0_TX) {
 | 
				
			||||||
 | 
					        lp_also = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable UART while writing to control registers */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR &= ~(1 << 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set data bits (bits 5 and 6 of the UART0/1 register, bits 18 and 19 of the LP UART register) */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTLCR_H = (obj->reg_base->UARTLCR_H & ~(0x03 << 5)) | (REGISTER_DATA_BITS(data_bits) << 5);
 | 
				
			||||||
 | 
					    if (lp_also) {
 | 
				
			||||||
 | 
					        LP_UART_CTRL = (LP_UART_CTRL & ~(0x03 << 18)) | (REGISTER_DATA_BITS(data_bits) << 18);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    obj->format.data_bits = (uint8_t) data_bits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set stop bits (bit 7 of the UART0/1 register) (there is no such setting for the LP UART) */
 | 
				
			||||||
 | 
					    if (stop_bits == NUM_UART_STOP_BITS_1) {
 | 
				
			||||||
 | 
					        /* Clear 2-stop-bits bit */
 | 
				
			||||||
 | 
					        obj->reg_base->UARTLCR_H &= ~(1 << 7);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        /* Set 2-stop-bits bit */
 | 
				
			||||||
 | 
					        obj->reg_base->UARTLCR_H |= 1 << 7;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    obj->format.stop_bits = (uint8_t) stop_bits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set parity */
 | 
				
			||||||
 | 
					    switch (parity) {
 | 
				
			||||||
 | 
					        case ParityNone:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /* Disable parity */
 | 
				
			||||||
 | 
					            obj->reg_base->UARTLCR_H &= ~0x02;
 | 
				
			||||||
 | 
					            if (lp_also)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LP_UART_CTRL &= ~(1 << 24);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case ParityOdd:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /* Set even bit and enable parity */
 | 
				
			||||||
 | 
					            obj->reg_base->UARTLCR_H = (obj->reg_base->UARTLCR_H | (1 << 3)) | (1 << 2);
 | 
				
			||||||
 | 
					            if (lp_also)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LP_UART_CTRL |= (1 << 24) | (1 << 25);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case ParityEven:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /* Clear even bit and enable parity */
 | 
				
			||||||
 | 
					            obj->reg_base->UARTLCR_H = (obj->reg_base->UARTLCR_H & ~(1 << 3)) | (1 << 2);
 | 
				
			||||||
 | 
					            if (lp_also)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LP_UART_CTRL &= ~(1 << 25);
 | 
				
			||||||
 | 
					                LP_UART_CTRL |= 1 << 24;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable the UART again */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR |= 1 << 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    obj->format.parity = (uint8_t) parity;
 | 
				
			||||||
 | 
					    obj->format_set = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API CALLS: INTERRUPT FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    irq_handler = handler;
 | 
				
			||||||
 | 
					    serial_irq_ids[obj->index] = id;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    bool lp_also = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (obj->config == SERIAL_CONFIG_UARTLP_RX_UART0_TX) {
 | 
				
			||||||
 | 
					        lp_also = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable UART while writing to control registers */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR &= ~(1 << 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (enable) {
 | 
				
			||||||
 | 
					        switch (irq) {
 | 
				
			||||||
 | 
					            case RxIrq:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                /* Bit 4 for Rx and bit 6 for Rx Timeout */
 | 
				
			||||||
 | 
					                obj->reg_base->UARTIMSC |= (1 << 4) | (1 << 6);
 | 
				
			||||||
 | 
					                if (lp_also)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    /* "Word Received" IRQ */
 | 
				
			||||||
 | 
					                    LP_UART_CTRL |= 1 << 23;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                obj->irq_rx_setting = IRQ_ON;
 | 
				
			||||||
 | 
					                irq_enable(obj);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					            case TxIrq:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                /* Bit 5 */
 | 
				
			||||||
 | 
					                obj->reg_base->UARTIMSC |= 1 << 5;
 | 
				
			||||||
 | 
					                obj->irq_tx_setting = IRQ_ON;
 | 
				
			||||||
 | 
					                irq_enable(obj);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                MBED_ASSERT(false);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        switch (irq) {
 | 
				
			||||||
 | 
					            case RxIrq:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                /* Bit 4  for Rx and bit 6 for Rx Timeout */
 | 
				
			||||||
 | 
					                obj->reg_base->UARTIMSC &= ~((1 << 4) | (1 << 6));
 | 
				
			||||||
 | 
					                if (lp_also)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    /* "Word Received" IRQ */
 | 
				
			||||||
 | 
					                    LP_UART_CTRL &= ~(1 << 23);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                obj->irq_rx_setting = IRQ_OFF;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					            case TxIrq:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                /* Bit 5 */
 | 
				
			||||||
 | 
					                obj->reg_base->UARTIMSC &= ~(1 << 5);
 | 
				
			||||||
 | 
					                obj->irq_tx_setting = IRQ_OFF;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                MBED_ASSERT(false);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ((obj->irq_rx_setting == IRQ_OFF) && (obj->irq_tx_setting == IRQ_OFF)) {
 | 
				
			||||||
 | 
					            irq_disable(obj);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable the UART again */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR |= 1 << 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API CALLS: TRANSMIT AND RECEIVE FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int serial_getc(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t data = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Block until there is data to read */
 | 
				
			||||||
 | 
					    while (!serial_readable(obj)) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Read the data */
 | 
				
			||||||
 | 
					    switch (obj->config) {
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UARTLP_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            data = (uint8_t) LP_UART_DATA;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART0_RX_UART0_TX:
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART1_RX_UART1_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            data = (uint8_t) obj->reg_base->UARTDR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (int) data;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_putc(serial_t *obj, int c)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Block until there is room to write */
 | 
				
			||||||
 | 
					    while (!serial_writable(obj)) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Write the data */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTDR = (uint8_t) c;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int serial_readable(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    bool readable = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (obj->config) {
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UARTLP_RX_UART0_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /* Check the status register, bits 8 to 10 indicate
 | 
				
			||||||
 | 
					             * the number of Rx bytes (make sure it's the status
 | 
				
			||||||
 | 
					             * register not the data register as a read from that
 | 
				
			||||||
 | 
					             * register would clear the Rx interrupt) */
 | 
				
			||||||
 | 
					            readable = (((LP_UART_STATUS >> 8) & 0x07) != 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART0_RX_UART0_TX:
 | 
				
			||||||
 | 
					        case SERIAL_CONFIG_UART1_RX_UART1_TX:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /* Check the Rx FIFO Empty bit */
 | 
				
			||||||
 | 
					            readable = ((obj->reg_base->UARTFR & (1 << 4)) != (1 << 4));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MBED_ASSERT(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (int) readable;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int serial_writable(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Check the "UART TX FIFO full" bit:
 | 
				
			||||||
 | 
					     * only if this is 0 can we transmit  */
 | 
				
			||||||
 | 
					    return (obj->reg_base->UARTFR & (1 << 5)) != (1 << 5);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_break_set(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Disable UART while writing to control registers */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR &= ~(1 << 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set bit 1 of the line control register */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTLCR_H |= 1 << 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable the UART again */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR |= 1 << 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void serial_break_clear(serial_t *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Disable UART while writing to control registers */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR &= ~(1 << 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Clear bit 1 of the line control register */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTLCR_H &= ~(1 << 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable the UART again */
 | 
				
			||||||
 | 
					    obj->reg_base->UARTCR |= 1 << 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "sleep_api.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * TYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * GLOBAL VARIABLES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * STATIC FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API CALLS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void sleep(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    __DSB();
 | 
				
			||||||
 | 
					    __WFI();
 | 
				
			||||||
 | 
					    __ISB();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void deepsleep()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    sleep();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,247 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The usecond ticker is mapped to TIMER0.  A few issues must be dealt
 | 
				
			||||||
 | 
					 * with in this driver:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 1.  The us_ticker API must count upwards, not down.
 | 
				
			||||||
 | 
					 * 2.  The expected range/resolution is 32 bits each of 1 usecond,
 | 
				
			||||||
 | 
					 *     whereas TIMER0 runs at 48 MHz (not 1 MHz) and so actually
 | 
				
			||||||
 | 
					 *     has a range/resolution of 26 bits at 0.02 useconds.  Software
 | 
				
			||||||
 | 
					 *     has to compensate for this.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "us_ticker_api.h"
 | 
				
			||||||
 | 
					#include "critical.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MACROS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TIMER0 clock is 48 MHz */
 | 
				
			||||||
 | 
					#define CLOCK_TICKS_PER_US 48
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The number of clock ticks in a full-run of
 | 
				
			||||||
 | 
					 * TIMER0, scaled to represent useconds */
 | 
				
			||||||
 | 
					#define USECONDS_PER_FULL_TIMER0_RUN 89478485
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * TYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * GLOBAL VARIABLES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Are we ready? */
 | 
				
			||||||
 | 
					static bool g_initialised = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Keep track of the number of useconds elapsed. */
 | 
				
			||||||
 | 
					static uint32_t g_us_overflow = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The number of useconds to increment the by at each interrupt */
 | 
				
			||||||
 | 
					static uint32_t g_us_overflow_increment = USECONDS_PER_FULL_TIMER0_RUN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Keep track of extra loops required to represent a particular time
 | 
				
			||||||
 | 
					 * as the HW timer runs faster than 1 MHz */
 | 
				
			||||||
 | 
					static uint32_t g_timer_extra_loops_required = 0;
 | 
				
			||||||
 | 
					static uint32_t g_timer_extra_loops_done = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Keep track of any adjustment due to user interrupts . */
 | 
				
			||||||
 | 
					static uint32_t g_user_interrupt_offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Flag that a user timer is running */
 | 
				
			||||||
 | 
					static bool g_user_interrupt = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * FUNCTION PROTOTYPES
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint32_t divide_by_48(uint32_t x);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * NON-API FUNCTIONS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Perform a divide-by-48 operation.
 | 
				
			||||||
 | 
					 * This is done as a multiply-shift operation to take advantage of
 | 
				
			||||||
 | 
					 * the ARM 32 bit single-cycle multiply and avoid using division;
 | 
				
			||||||
 | 
					 * 1/48 is equivalent to 1365/2^16.  It is also done in two halves
 | 
				
			||||||
 | 
					 * to make sure that the multiplies fit into 32 bits.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The principle is:
 | 
				
			||||||
 | 
					 *  - divide the top 16 bits by 48 using multiply-shift (=> x1),
 | 
				
			||||||
 | 
					 *  - work out the remainder of that operation and divide that by 48 (=> x1r),
 | 
				
			||||||
 | 
					 *  - divide the bottom 16 bits by 48 using multiply-shift (=> x2),
 | 
				
			||||||
 | 
					 *  - add the lot together to get the result.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The cost is 29 instructions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline uint32_t divide_by_48(uint32_t x)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t x1 = ((x >> 16) * 1365) >> 16;
 | 
				
			||||||
 | 
					    uint32_t x1r = ((x & 0xFFFF0000) - ((x1 * 48) << 16));
 | 
				
			||||||
 | 
					             x1r = (x1r  * 1365) >> 16;
 | 
				
			||||||
 | 
					    uint32_t x2 = ((x & 0xFFFF) * 1365) >> 16;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (x1 << 16) + x1r + x2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Timer0 handler */
 | 
				
			||||||
 | 
					void IRQ1_TMR0_Handler(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (g_initialised) {
 | 
				
			||||||
 | 
					        /* Increment the overflow count and set the increment
 | 
				
			||||||
 | 
					         * value for next time */
 | 
				
			||||||
 | 
					        g_us_overflow += g_us_overflow_increment;
 | 
				
			||||||
 | 
					        g_us_overflow_increment = USECONDS_PER_FULL_TIMER0_RUN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Now handle the user interrupt case */
 | 
				
			||||||
 | 
					        if (g_user_interrupt) {
 | 
				
			||||||
 | 
					            if (g_timer_extra_loops_done < g_timer_extra_loops_required) {
 | 
				
			||||||
 | 
					                /* Let the timer go round again */
 | 
				
			||||||
 | 
					                g_timer_extra_loops_done++;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                /* We've done with looping around for a user interrupt */
 | 
				
			||||||
 | 
					                g_user_interrupt = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                /* Call the mbed API */
 | 
				
			||||||
 | 
					                us_ticker_irq_handler();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NVIC_ClearPendingIRQ(Timer_IRQn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------
 | 
				
			||||||
 | 
					 * MBED API CALLS
 | 
				
			||||||
 | 
					 * ----------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void us_ticker_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!g_initialised) {
 | 
				
			||||||
 | 
					        /* Reset the globals */
 | 
				
			||||||
 | 
					        g_timer_extra_loops_done = 0;
 | 
				
			||||||
 | 
					        g_timer_extra_loops_required = 0;
 | 
				
			||||||
 | 
					        g_us_overflow = 0;
 | 
				
			||||||
 | 
					        g_us_overflow_increment = USECONDS_PER_FULL_TIMER0_RUN;
 | 
				
			||||||
 | 
					        g_user_interrupt_offset = 0;
 | 
				
			||||||
 | 
					        g_user_interrupt = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Get the timer running (starting at what is zero,
 | 
				
			||||||
 | 
					         * once inverted), with repeat */
 | 
				
			||||||
 | 
					        NVIC_ClearPendingIRQ(Timer_IRQn);
 | 
				
			||||||
 | 
					        TIMER0_LOAD = 0xFFFFFFFF;
 | 
				
			||||||
 | 
					        TIMER0_CTRL = 0x03;
 | 
				
			||||||
 | 
					        NVIC_EnableIRQ(Timer_IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        g_initialised = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t us_ticker_read()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t timeValue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* This can be called before initialisation has been performed */
 | 
				
			||||||
 | 
					    if (!g_initialised) {
 | 
				
			||||||
 | 
					        us_ticker_init();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable interrupts to avoid collisions */
 | 
				
			||||||
 | 
					    core_util_critical_section_enter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Get the timer value, adding the offset in case we've been moved
 | 
				
			||||||
 | 
					     * around by user activity, inverting it (as a count-up timer is
 | 
				
			||||||
 | 
					     * expected), then scaling it to useconds and finally adding the
 | 
				
			||||||
 | 
					     * usecond overflow value to make up the 32-bit usecond total */
 | 
				
			||||||
 | 
					    timeValue = divide_by_48(~(TIMER0_TIME + g_user_interrupt_offset)) + g_us_overflow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Put interrupts back */
 | 
				
			||||||
 | 
					    core_util_critical_section_exit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return timeValue;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* NOTE: it seems to be an accepted fact that users
 | 
				
			||||||
 | 
					 * will never ask for a timeout of more than 2^31 useconds
 | 
				
			||||||
 | 
					 * and hence it's possible to do signed arithmetic
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void us_ticker_set_interrupt(timestamp_t timestamp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_timer_extra_loops_required = 0;
 | 
				
			||||||
 | 
					    g_timer_extra_loops_done = 0;
 | 
				
			||||||
 | 
					    int32_t timeDelta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable interrupts to avoid collisions */
 | 
				
			||||||
 | 
					    core_util_critical_section_enter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Establish how far we're being asked to move */
 | 
				
			||||||
 | 
					    timeDelta = (int32_t) ((uint32_t) timestamp - us_ticker_read());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (timeDelta <= 0) {
 | 
				
			||||||
 | 
					        /* Make delta positive if it's not, it will expire pretty quickly */
 | 
				
			||||||
 | 
					        /* Note: can't just call us_ticker_irq_handler() directly as we
 | 
				
			||||||
 | 
					         * may already be in it and will overflow the stack */
 | 
				
			||||||
 | 
					        timeDelta = 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* The TIMER0 clock source is greater than 1 MHz, so
 | 
				
			||||||
 | 
					     * work out how many times we have to go around
 | 
				
			||||||
 | 
					     * and what the remainder is */
 | 
				
			||||||
 | 
					    g_timer_extra_loops_required = (uint32_t) timeDelta / USECONDS_PER_FULL_TIMER0_RUN;
 | 
				
			||||||
 | 
					    timeDelta -= g_timer_extra_loops_required * USECONDS_PER_FULL_TIMER0_RUN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Next time we hit the interrupt the increment will be smaller */
 | 
				
			||||||
 | 
					    g_us_overflow_increment = (uint32_t) timeDelta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* We're about to modify the timer value; work out the
 | 
				
			||||||
 | 
					     * difference so that we can compensate for it when
 | 
				
			||||||
 | 
					     * the time is read */
 | 
				
			||||||
 | 
					    timeDelta = timeDelta * CLOCK_TICKS_PER_US;
 | 
				
			||||||
 | 
					    g_user_interrupt_offset += TIMER0_TIME - timeDelta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Run for the remainder first, then we can loop for the full
 | 
				
			||||||
 | 
					     * USECONDS_PER_FULL_TIMER0_RUN afterwards */
 | 
				
			||||||
 | 
					    TIMER0_LOAD = timeDelta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* A user interrupt is now running */
 | 
				
			||||||
 | 
					    g_user_interrupt = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Put interrupts back */
 | 
				
			||||||
 | 
					    core_util_critical_section_exit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void us_ticker_disable_interrupt(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Can't actually disable the interrupt here
 | 
				
			||||||
 | 
					     * as we need it to manage the timer overflow,
 | 
				
			||||||
 | 
					     * instead switch off the user interrupt part */
 | 
				
			||||||
 | 
					    g_user_interrupt = false;
 | 
				
			||||||
 | 
					    g_timer_extra_loops_required = 0;
 | 
				
			||||||
 | 
					    g_us_overflow_increment = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void us_ticker_clear_interrupt(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* As above, can't clear the interrupt as it
 | 
				
			||||||
 | 
					     * may just be an overflow interrupt, instead
 | 
				
			||||||
 | 
					     * clear the variables */
 | 
				
			||||||
 | 
					    g_user_interrupt = false;
 | 
				
			||||||
 | 
					    g_timer_extra_loops_required = 0;
 | 
				
			||||||
 | 
					    g_us_overflow_increment = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					/* mbed Microcontroller Library
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 u-blox
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MBED_MBED_RTX_H
 | 
				
			||||||
 | 
					#define MBED_MBED_RTX_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(TARGET_HI2110)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef INITIAL_SP
 | 
				
			||||||
 | 
					#define INITIAL_SP              (0x01000000 + 0x05000 - 256)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef OS_TASKCNT
 | 
				
			||||||
 | 
					#define OS_TASKCNT              6
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef OS_MAINSTKSIZE
 | 
				
			||||||
 | 
					#define OS_MAINSTKSIZE          128
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef OS_CLOCK
 | 
				
			||||||
 | 
					#define OS_CLOCK                48000000
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif  // MBED_MBED_RTX_H
 | 
				
			||||||
| 
						 | 
					@ -2123,5 +2123,31 @@
 | 
				
			||||||
        "device_has": ["ANALOGIN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH"],
 | 
					        "device_has": ["ANALOGIN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH"],
 | 
				
			||||||
        "release_versions": ["2", "5"],
 | 
					        "release_versions": ["2", "5"],
 | 
				
			||||||
        "device_name": "M453VG6AE"
 | 
					        "device_name": "M453VG6AE"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "HI2110": {
 | 
				
			||||||
 | 
					        "inherits": ["Target"],
 | 
				
			||||||
 | 
					        "core": "Cortex-M0",
 | 
				
			||||||
 | 
					        "default_toolchain": "GCC_ARM",
 | 
				
			||||||
 | 
					        "supported_toolchains": ["GCC_ARM", "ARM", "IAR"],
 | 
				
			||||||
 | 
					        "extra_labels": ["ublox"],
 | 
				
			||||||
 | 
					        "macros": ["TARGET_PROCESSOR_FAMILY_BOUDICA", "BOUDICA_SARA", "NDEBUG=1"],
 | 
				
			||||||
 | 
					        "public": false,
 | 
				
			||||||
 | 
					        "target_overrides": {
 | 
				
			||||||
 | 
					            "*": {
 | 
				
			||||||
 | 
					                "core.stdio-flush-at-exit": false
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "device_has": ["INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "SERIAL", "SLEEP", "STDIO_MESSAGES"],
 | 
				
			||||||
 | 
					        "default_lib": "std",
 | 
				
			||||||
 | 
					        "release_versions": ["5"]
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					    "SARA_NBIOT": {
 | 
				
			||||||
 | 
					        "inherits": ["HI2110"],
 | 
				
			||||||
 | 
					        "extra_labels": ["ublox", "HI2110"],
 | 
				
			||||||
 | 
					        "public": false
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "SARA_NBIOT_EVK": {
 | 
				
			||||||
 | 
					        "inherits": ["SARA_NBIOT"],
 | 
				
			||||||
 | 
					        "extra_labels": ["ublox", "HI2110", "SARA_NBIOT"]
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue