mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			
						commit
						e2efb35723
					
				| 
						 | 
				
			
			@ -25,6 +25,8 @@
 | 
			
		|||
    #define STACK_SIZE 512
 | 
			
		||||
#elif defined(TARGET_XDOT_L151CC)
 | 
			
		||||
    #define STACK_SIZE 1024
 | 
			
		||||
#elif defined(TARGET_HI2110)
 | 
			
		||||
    #define STACK_SIZE 512
 | 
			
		||||
#else
 | 
			
		||||
    #define STACK_SIZE DEFAULT_STACK_SIZE
 | 
			
		||||
#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"],
 | 
			
		||||
        "release_versions": ["2", "5"],
 | 
			
		||||
        "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