mirror of https://github.com/ARMmbed/mbed-os.git
Merge branch 'master' of https://github.com/kyliuxing/mbed-os into dev_rollup
commit
88ef552d1a
|
@ -110,6 +110,9 @@
|
|||
},
|
||||
"EFR32": {
|
||||
"stdio-baud-rate": 115200
|
||||
},
|
||||
"UNO_91H": {
|
||||
"stdio-baud-rate": 115200
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,87 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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_PERIPHERALNAMES_H
|
||||
#define MBED_PERIPHERALNAMES_H
|
||||
|
||||
#include "cmsis.h"
|
||||
#include "PinNames.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
UART_0 = (int)RDA_UART0_BASE,
|
||||
UART_1 = (int)RDA_UART1_BASE
|
||||
} UARTName;
|
||||
|
||||
typedef enum {
|
||||
// Make sure GPIO_BASE & 0x1F == 0, store GPIO index at this field when mapping pins
|
||||
GPIO_0 = (int)RDA_GPIO_BASE
|
||||
} GPIOName;
|
||||
|
||||
typedef enum {
|
||||
I2C_0 = (int)RDA_I2C0_BASE
|
||||
} I2CName;
|
||||
|
||||
typedef enum {
|
||||
SPI_0 = (int)RDA_SPI0_BASE
|
||||
} SPIName;
|
||||
|
||||
typedef enum {
|
||||
I2S_0 = (int)RDA_I2S_BASE
|
||||
} I2SName;
|
||||
|
||||
typedef enum {
|
||||
WDT_0 = (int)RDA_WDT_BASE
|
||||
} WDTName;
|
||||
|
||||
typedef enum {
|
||||
PWM_0 = 0,
|
||||
PWM_1,
|
||||
PWM_2,
|
||||
PWM_3,
|
||||
PWM_4,
|
||||
PWM_5,
|
||||
PWM_6,
|
||||
PWM_7
|
||||
} PWMName;
|
||||
|
||||
typedef enum {
|
||||
ADC0_0 = 0,
|
||||
ADC0_1,
|
||||
ADC0_2
|
||||
} ADCName;
|
||||
|
||||
typedef enum {
|
||||
GPADC0_0 = 0,
|
||||
GPADC0_1
|
||||
} GPADCName;
|
||||
|
||||
#define STDIO_UART_TX UART0_TX
|
||||
#define STDIO_UART_RX UART0_RX
|
||||
#define STDIO_UART UART_0
|
||||
|
||||
// Default peripherals
|
||||
#define MBED_UART0 PA_0, PA_1
|
||||
#define MBED_UART1 PB_1, PB_2
|
||||
#define MBED_UARTUSB USBTX, USBRX
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,180 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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_PINNAMES_H
|
||||
#define MBED_PINNAMES_H
|
||||
|
||||
#include "cmsis.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
PIN_INPUT,
|
||||
PIN_OUTPUT
|
||||
} PinDirection;
|
||||
|
||||
#define PORT_SHIFT 8
|
||||
|
||||
typedef enum {
|
||||
PA_0 = (0 << PORT_SHIFT | 0 ),
|
||||
PA_1 = (0 << PORT_SHIFT | 1 ),
|
||||
PA_2 = (0 << PORT_SHIFT | 2 ),
|
||||
PA_3 = (0 << PORT_SHIFT | 3 ),
|
||||
PA_4 = (0 << PORT_SHIFT | 4 ),
|
||||
PA_5 = (0 << PORT_SHIFT | 5 ),
|
||||
PA_6 = (0 << PORT_SHIFT | 6 ),
|
||||
PA_7 = (0 << PORT_SHIFT | 7 ),
|
||||
PA_8 = (0 << PORT_SHIFT | 8 ),
|
||||
PA_9 = (0 << PORT_SHIFT | 9 ),
|
||||
PB_0 = (1 << PORT_SHIFT | 0 ),
|
||||
PB_1 = (1 << PORT_SHIFT | 1 ),
|
||||
PB_2 = (1 << PORT_SHIFT | 2 ),
|
||||
PB_3 = (1 << PORT_SHIFT | 3 ),
|
||||
PB_4 = (1 << PORT_SHIFT | 4 ),
|
||||
PB_5 = (1 << PORT_SHIFT | 5 ),
|
||||
PB_6 = (1 << PORT_SHIFT | 6 ),
|
||||
PB_7 = (1 << PORT_SHIFT | 7 ),
|
||||
PB_8 = (1 << PORT_SHIFT | 8 ),
|
||||
PB_9 = (1 << PORT_SHIFT | 9 ),
|
||||
PC_0 = (4 << PORT_SHIFT | 0 ),
|
||||
PC_1 = (4 << PORT_SHIFT | 1 ),
|
||||
PC_2 = (4 << PORT_SHIFT | 2 ),
|
||||
PC_3 = (4 << PORT_SHIFT | 3 ),
|
||||
PC_4 = (4 << PORT_SHIFT | 4 ),
|
||||
PC_5 = (4 << PORT_SHIFT | 5 ),
|
||||
PC_6 = (4 << PORT_SHIFT | 6 ),
|
||||
PC_7 = (4 << PORT_SHIFT | 7 ),
|
||||
PC_8 = (4 << PORT_SHIFT | 8 ),
|
||||
PC_9 = (4 << PORT_SHIFT | 9 ),
|
||||
PD_0 = (5 << PORT_SHIFT | 0 ),
|
||||
PD_1 = (5 << PORT_SHIFT | 1 ),
|
||||
PD_2 = (5 << PORT_SHIFT | 2 ),
|
||||
PD_3 = (5 << PORT_SHIFT | 3 ),
|
||||
PD_9 = (5 << PORT_SHIFT | 9 ), // Fake pin for GPADC_VBAT
|
||||
|
||||
UART0_RX = PA_0,
|
||||
UART0_TX = PA_1,
|
||||
UART1_RX = PB_1,
|
||||
UART1_TX = PB_2,
|
||||
|
||||
USBRX = UART0_RX,
|
||||
USBTX = UART0_TX,
|
||||
|
||||
I2C_SCL = PC_0,
|
||||
I2C_SDA = PC_1,
|
||||
|
||||
I2S_TX_SD = PB_1,
|
||||
I2S_TX_WS = PB_2,
|
||||
I2S_TX_BCLK = PB_3,
|
||||
I2S_RX_SD = PB_4,
|
||||
I2S_RX_WS = PB_5,
|
||||
I2S_RX_BCLK = PB_8,
|
||||
|
||||
GPIO_PIN0 = PB_0,
|
||||
GPIO_PIN1 = PB_1,
|
||||
GPIO_PIN2 = PB_2,
|
||||
GPIO_PIN3 = PB_3,
|
||||
GPIO_PIN4 = PB_4,
|
||||
GPIO_PIN5 = PB_5,
|
||||
GPIO_PIN6 = PB_6,
|
||||
GPIO_PIN7 = PB_7,
|
||||
GPIO_PIN8 = PB_8,
|
||||
GPIO_PIN9 = PB_9,
|
||||
GPIO_PIN10 = PA_8,
|
||||
GPIO_PIN11 = PA_9,
|
||||
GPIO_PIN12 = PC_0,
|
||||
GPIO_PIN13 = PC_1,
|
||||
GPIO_PIN14 = PC_2,
|
||||
GPIO_PIN15 = PC_3,
|
||||
GPIO_PIN16 = PC_4,
|
||||
GPIO_PIN17 = PC_5,
|
||||
GPIO_PIN18 = PC_6,
|
||||
GPIO_PIN19 = PC_7,
|
||||
GPIO_PIN20 = PC_8,
|
||||
GPIO_PIN21 = PC_9,
|
||||
GPIO_PIN22 = PD_0,
|
||||
GPIO_PIN23 = PD_1,
|
||||
GPIO_PIN24 = PD_2,
|
||||
GPIO_PIN25 = PD_3,
|
||||
GPIO_PIN26 = PA_0,
|
||||
GPIO_PIN27 = PA_1,
|
||||
|
||||
// Another pin names for GPIO 14 - 19
|
||||
GPIO_PIN14A = PA_2,
|
||||
GPIO_PIN15A = PA_3,
|
||||
GPIO_PIN16A = PA_4,
|
||||
GPIO_PIN17A = PA_5,
|
||||
GPIO_PIN18A = PA_6,
|
||||
GPIO_PIN19A = PA_7,
|
||||
|
||||
ADC_PIN0 = PB_6,
|
||||
ADC_PIN1 = PB_7,
|
||||
ADC_PIN1A = PB_8, // Another pin name for ADC 1
|
||||
ADC_PIN2 = PD_9,
|
||||
|
||||
LED1 = GPIO_PIN21,
|
||||
LED2 = GPIO_PIN1,
|
||||
|
||||
// Arduino Pin Names
|
||||
// Analog Ports (A0-A1)
|
||||
A0 = PB_6,
|
||||
A1 = PB_8,
|
||||
// A2
|
||||
// A3
|
||||
// Digital Pins with "An" name
|
||||
A4 = PB_2,
|
||||
A5 = PB_3,
|
||||
// Digital Port (D0-D7)
|
||||
D0 = PB_1,
|
||||
D1 = PB_2,
|
||||
D2 = PB_3,
|
||||
D3 = PB_4,
|
||||
D4 = PB_5,
|
||||
D5 = PB_7,
|
||||
D6 = PB_9,
|
||||
D7 = PC_9,
|
||||
// Digital Port (D8-D13)
|
||||
D8 = PB_0,
|
||||
// D9
|
||||
D10 = PD_1, // CS0
|
||||
D11 = PD_2, // MOSI
|
||||
D12 = PD_3, // MISO
|
||||
D13 = PD_0, // CLK
|
||||
// GND
|
||||
// AREF
|
||||
SDA = PC_1,
|
||||
D14 = SDA,
|
||||
SCL = PC_0,
|
||||
D15 = SCL,
|
||||
|
||||
// Not connected
|
||||
NC = (int)0xFFFFFFFF
|
||||
} PinName;
|
||||
|
||||
typedef enum {
|
||||
PullNone = 0,
|
||||
PullDown = 1,
|
||||
PullUp = 2,
|
||||
Repeater = 3,
|
||||
PullDefault = Repeater,
|
||||
} PinMode;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,33 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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_PORTNAMES_H
|
||||
#define MBED_PORTNAMES_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
PortA = 0,
|
||||
PortB = 1,
|
||||
PortC = 4,
|
||||
PortD = 5
|
||||
} PortName;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,92 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include "mbed_assert.h"
|
||||
#include "analogin_api.h"
|
||||
#include "pinmap.h"
|
||||
|
||||
#include "rda_ccfg_api.h"
|
||||
|
||||
#define ANALOGIN_MEDIAN_FILTER 1
|
||||
#define RDA_ADC_RANGE (0x03FFU)
|
||||
|
||||
#if DEVICE_ANALOGIN
|
||||
static const PinMap PinMap_ADC[] = {
|
||||
{PB_6, ADC0_0, 0},
|
||||
{PB_7, ADC0_1, 0},
|
||||
{PB_8, ADC0_1, 0},
|
||||
{PD_9, ADC0_2, 0},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
static unsigned char adc1_gp = 0U;
|
||||
static int adc_inited_cnt = 0;
|
||||
|
||||
void analogin_init(analogin_t *obj, PinName pin)
|
||||
{
|
||||
unsigned char gp = (unsigned char)(pin & 0x00FFU);
|
||||
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
|
||||
MBED_ASSERT(obj->adc != (ADCName)NC);
|
||||
|
||||
/* Init ADC */
|
||||
if (0 == adc_inited_cnt) {
|
||||
rda_ccfg_adc_init();
|
||||
}
|
||||
adc_inited_cnt++;
|
||||
if (ADC0_2 == obj->adc) {
|
||||
return;
|
||||
}
|
||||
if ((ADC0_1 == obj->adc) && (0U == adc1_gp)) {
|
||||
adc1_gp = (2 >= rda_ccfg_hwver()) ? 7U : 8U;
|
||||
MBED_ASSERT(gp == adc1_gp);
|
||||
}
|
||||
rda_ccfg_gp(gp, 0x00U);
|
||||
rda_ccfg_adc_gp(gp, 0x00U);
|
||||
rda_ccfg_adc_oenb(obj->adc, 0x01U);
|
||||
|
||||
pinmap_pinout(pin, PinMap_ADC);
|
||||
}
|
||||
|
||||
uint16_t analogin_read_u16(analogin_t *obj)
|
||||
{
|
||||
uint16_t value = rda_ccfg_adc_read((unsigned char)(obj->adc));
|
||||
return (value); // 10 bit
|
||||
}
|
||||
|
||||
float analogin_read(analogin_t *obj)
|
||||
{
|
||||
uint16_t value = rda_ccfg_adc_read((unsigned char)(obj->adc));
|
||||
return (float)value * (1.0f / (float)RDA_ADC_RANGE);
|
||||
}
|
||||
|
||||
void analogin_free(analogin_t *obj)
|
||||
{
|
||||
unsigned char gp = 6U;
|
||||
adc_inited_cnt--;
|
||||
if (0 == adc_inited_cnt) {
|
||||
rda_ccfg_adc_free();
|
||||
}
|
||||
if (ADC0_2 == obj->adc) {
|
||||
return;
|
||||
}
|
||||
if (ADC0_1 == obj->adc) {
|
||||
if (0U == adc1_gp) {
|
||||
return;
|
||||
}
|
||||
gp = adc1_gp;
|
||||
}
|
||||
rda_ccfg_adc_gp(gp, 0x01U);
|
||||
rda_ccfg_gp(gp, 0x01U);
|
||||
}
|
||||
#endif /* DEVICE_ANALOGIN */
|
|
@ -0,0 +1,40 @@
|
|||
// 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-2018 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define DEVICE_ID_LENGTH 32
|
||||
#define DEVICE_MAC_OFFSET 20
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include "objects.h"
|
||||
|
||||
#endif
|
|
@ -0,0 +1,78 @@
|
|||
/**************************************************************************//**
|
||||
* @file RDA5981_nvic_virtual.h
|
||||
* @brief
|
||||
* @version
|
||||
* @date
|
||||
******************************************************************************/
|
||||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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 __RDA5981_NVIC
|
||||
#define __RDA5981_NVIC
|
||||
|
||||
//#include "cmsis.h"
|
||||
//#include <stdint.h>
|
||||
|
||||
extern void rda_ccfg_ckrst(void);
|
||||
extern void rda_wdt_softreset(void);
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief System Reset
|
||||
\details Initiates a system reset request to reset the MCU.
|
||||
*/
|
||||
__NO_RETURN __STATIC_INLINE void __RDA5981_SystemReset(void)
|
||||
{
|
||||
|
||||
rda_ccfg_ckrst () ;
|
||||
__DSB(); /* Ensure all outstanding memory accesses included
|
||||
buffered write are completed before reset */
|
||||
SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
||||
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
|
||||
SCB_AIRCR_VECTRESET_Msk ); /* Keep priority group unchanged */
|
||||
__DSB(); /* Ensure completion of memory access */
|
||||
|
||||
for(;;) /* wait until reset */
|
||||
{
|
||||
__NOP();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
|
||||
#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
|
||||
#define NVIC_EnableIRQ __NVIC_EnableIRQ
|
||||
#define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ
|
||||
#define NVIC_DisableIRQ __NVIC_DisableIRQ
|
||||
#define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ
|
||||
#define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ
|
||||
#define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ
|
||||
#define NVIC_GetActive __NVIC_GetActive
|
||||
#define NVIC_SetPriority __NVIC_SetPriority
|
||||
#define NVIC_GetPriority __NVIC_GetPriority
|
||||
#define NVIC_SystemReset __RDA5981_SystemReset
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,527 @@
|
|||
/******************************************************************************
|
||||
* @file RDA5991H.h
|
||||
* @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File for
|
||||
* RDA RDA5991H Device Series
|
||||
* @version: V1.09
|
||||
* @date: 07. June 2018
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2009 ARM Limited. All rights reserved.
|
||||
*
|
||||
* @par
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* @par
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef __RDA5991H_H__
|
||||
#define __RDA5991H_H__
|
||||
|
||||
/*
|
||||
* ==========================================================================
|
||||
* ---------- Interrupt Number Definition -----------------------------------
|
||||
* ==========================================================================
|
||||
*/
|
||||
|
||||
typedef enum IRQn
|
||||
{
|
||||
/****** Cortex-M4 Processor Exceptions Numbers ***************************************************/
|
||||
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
|
||||
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */
|
||||
BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */
|
||||
UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */
|
||||
SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */
|
||||
DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */
|
||||
PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */
|
||||
SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */
|
||||
|
||||
/****** RDA5991H Specific Interrupt Numbers ******************************************************/
|
||||
SPIFLASH_IRQn = 0, /*!< SPI Flash Interrupt */
|
||||
PTA_IRQn = 1, /*!< PTA Interrupt */
|
||||
SDIO_IRQn = 2, /*!< SDIO Interrupt */
|
||||
USBDMA_IRQn = 3, /*!< USBDMA Interrupt */
|
||||
USB_IRQn = 4, /*!< USB Interrupt */
|
||||
GPIO_IRQn = 5, /*!< GPIO Interrupt */
|
||||
TIMER_IRQn = 6, /*!< Timer Interrupt */
|
||||
UART0_IRQn = 7, /*!< UART0 Interrupt */
|
||||
MACHW_IRQn = 8, /*!< MAC Hardware Interrupt */
|
||||
UART1_IRQn = 9, /*!< UART1 Interrupt */
|
||||
AHBDMA_IRQn = 10, /*!< AHBDMA Interrupt */
|
||||
PSRAM_IRQn = 11, /*!< PSRAM Interrupt */
|
||||
SDMMC_IRQn = 12, /*!< SDMMC Interrupt */
|
||||
EXIF_IRQn = 13, /*!< EXIF Interrupt */
|
||||
I2C_IRQn = 14 /*!< I2C Interrupt */
|
||||
} IRQn_Type;
|
||||
|
||||
|
||||
/*
|
||||
* ==========================================================================
|
||||
* ----------- Processor and Core Peripheral Section ------------------------
|
||||
* ==========================================================================
|
||||
*/
|
||||
|
||||
/* Configuration of the Cortex-M4 Processor and Core Peripherals */
|
||||
#define __MPU_PRESENT 1 /*!< MPU present or not */
|
||||
#define __NVIC_PRIO_BITS 5 /*!< Number of Bits used for Priority Levels */
|
||||
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
|
||||
#define __FPU_PRESENT 1 /*!< FPU present */
|
||||
|
||||
|
||||
#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */
|
||||
#include "system_RDA5991H.h" /* System Header */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* Device Specific Peripheral registers structures */
|
||||
/******************************************************************************/
|
||||
|
||||
#if defined ( __CC_ARM )
|
||||
#pragma anon_unions
|
||||
#endif
|
||||
|
||||
/*------------- System Control Unit (SCU) ------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CLKGATE0; /* 0x00 : Clock Gating 0 */
|
||||
__IO uint32_t PWRCTRL; /* 0x04 : Power Control */
|
||||
__IO uint32_t CLKGATE1; /* 0x08 : Clock Gating 1 */
|
||||
__IO uint32_t CLKGATE2; /* 0x0C : Clock Gating 2 */
|
||||
__IO uint32_t RESETCTRL; /* 0x10 : Power Control */
|
||||
__IO uint32_t CLKGATE3; /* 0x14 : Clock Gating 3 */
|
||||
__IO uint32_t CORECFG; /* 0x18 : Core Config */
|
||||
__IO uint32_t CPUCFG; /* 0x1C : CPU Config */
|
||||
__IO uint32_t FTMRINITVAL; /* 0x20 : Free Timer Initial Value */
|
||||
__IO uint32_t FTMRTS; /* 0x24 : Free Timer Timestamp */
|
||||
__IO uint32_t CLKGATEBP; /* 0x28 : Clock Gating Bypass */
|
||||
uint32_t RESERVED0[2];
|
||||
__IO uint32_t PWMCFG; /* 0x34 : PWM Config */
|
||||
__IO uint32_t FUN0WAKEVAL; /* 0x38 : SDIO Func0 Wake Val */
|
||||
__IO uint32_t FUN1WAKEVAL; /* 0x3C : SDIO Func1 Wake Val */
|
||||
__IO uint32_t BOOTJUMPADDR; /* 0x40 : Boot Jump Addr */
|
||||
__IO uint32_t SDIOINTVAL; /* 0x44 : SDIO Int Val */
|
||||
__IO uint32_t I2SCLKDIV; /* 0x48 : I2S Clock Divider */
|
||||
__IO uint32_t BOOTJUMPADDRCFG; /* 0x4C : Boot Jump Addr Config */
|
||||
__IO uint32_t FTMRPREVAL; /* 0x50 : Free Timer Prescale Init Val*/
|
||||
__IO uint32_t PWROPENCFG; /* 0x54 : Power Open Config */
|
||||
__IO uint32_t PWRCLOSECFG; /* 0x58 : Power Close Config */
|
||||
} RDA_SCU_TypeDef;
|
||||
|
||||
/*------------- Timer0 (TIM0) ------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t LDCNT; /* 0x00 : Timer Load Count Register */
|
||||
__I uint32_t CVAL; /* 0x04 : Current Timer Value Register*/
|
||||
__IO uint32_t TCTRL; /* 0x08 : Timer Control Register */
|
||||
__I uint32_t INTCLR; /* 0x0C : Interrupt Clear Register */
|
||||
} RDA_TIM0_TypeDef;
|
||||
|
||||
/*------------- Timer1 (TIM1) ------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t TCTRL; /* 0x00 : Timer Control Register */
|
||||
uint32_t RESERVED0[2];
|
||||
__IO uint32_t LDCNT; /* 0x0C : Timer Load Count Register */
|
||||
__I uint32_t CVAL; /* 0x10 : Current Timer Value Register*/
|
||||
uint32_t RESERVED1;
|
||||
__I uint32_t INTCLR; /* 0x18 : Interrupt Clear Register */
|
||||
} RDA_TIM1_TypeDef;
|
||||
|
||||
/*------------- Timer Interrupt Status (TIMINTST) ----------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__I uint32_t INTST; /* 0x00 : Timer Int Stat Register */
|
||||
} RDA_TIMINTST_TypeDef;
|
||||
|
||||
/*------------- General Purpose Input/Output (GPIO) --------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CTRL; /* 0x00 : GPIO Control */
|
||||
uint32_t RESERVED0;
|
||||
__IO uint32_t DOUT; /* 0x08 : GPIO Data Output */
|
||||
__IO uint32_t DIN; /* 0x0C : GPIO Data Input */
|
||||
__IO uint32_t DIR; /* 0x10 : GPIO Direction */
|
||||
__IO uint32_t SLEW0; /* 0x14 : GPIO Slew Config 0 */
|
||||
__IO uint32_t SLEWIOMUX; /* 0x18 : GPIO IOMUX Slew Config */
|
||||
__IO uint32_t INTCTRL; /* 0x1C : GPIO Interrupt Control */
|
||||
__IO uint32_t IFCTRL; /* 0x20 : Interface Control */
|
||||
__IO uint32_t SLEW1; /* 0x24 : GPIO Slew Config 1 */
|
||||
__IO uint32_t REVID; /* 0x28 : ASIC Reversion ID */
|
||||
__IO uint32_t LPOSEL; /* 0x2C : LPO Select */
|
||||
uint32_t RESERVED1;
|
||||
__IO uint32_t INTSEL; /* 0x34 : GPIO Interrupt Select */
|
||||
uint32_t RESERVED2;
|
||||
__IO uint32_t SDIOCFG; /* 0x3C : SDIO Config */
|
||||
__IO uint32_t MEMCFG; /* 0x40 : Memory Config */
|
||||
__IO uint32_t IOMUXCTRL[8]; /* 0x44 - 0x60 : IOMUX Control */
|
||||
__IO uint32_t PCCTRL; /* 0x64 : Pulse Counter Control */
|
||||
} RDA_GPIO_TypeDef;
|
||||
|
||||
/*------------- Inter-Integrated Circuit 0 (I2C0) ----------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CR0; /* 0x00 : Control Register 0 */
|
||||
__I uint32_t SR; /* 0x04 : Status Register */
|
||||
__IO uint32_t DR; /* 0x08 : TX/RX Data Register */
|
||||
__O uint32_t CMD; /* 0x0C : Command Register */
|
||||
__O uint32_t ICR; /* 0x10 : Interrupt Clear Register */
|
||||
__IO uint32_t CR1; /* 0x14 : Control Register 1 */
|
||||
} RDA_I2C0_TypeDef;
|
||||
|
||||
/*------------- Pulse Width Modulator (PWM) ----------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t PWTCFG; /* 0x00 : PWT Config Register */
|
||||
__IO uint32_t LPGCFG; /* 0x04 : LPG Config Register */
|
||||
__IO uint32_t PWL0CFG; /* 0x08 : PWL0 Config Register */
|
||||
__IO uint32_t PWL1CFG; /* 0x0C : PWL1 Config Register */
|
||||
__IO uint32_t CLKR; /* 0x10 : Clock Config Register */
|
||||
} RDA_PWM_TypeDef;
|
||||
|
||||
/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/
|
||||
typedef struct
|
||||
{
|
||||
union {
|
||||
__I uint32_t RBR; /* 0x00 : UART Receive buffer register */
|
||||
__O uint32_t THR; /* 0x00 : UART Transmit holding register */
|
||||
__IO uint32_t DLL; /* 0x00 : UART Divisor latch(low) */
|
||||
};
|
||||
union {
|
||||
__IO uint32_t DLH; /* 0x04 : UART Divisor latch(high) */
|
||||
__IO uint32_t IER; /* 0x04 : UART Interrupt enable register */
|
||||
};
|
||||
union {
|
||||
__I uint32_t IIR; /* 0x08 : UART Interrupt id register */
|
||||
__O uint32_t FCR; /* 0x08 : UART Fifo control register */
|
||||
};
|
||||
__IO uint32_t LCR; /* 0x0C : UART Line control register */
|
||||
__IO uint32_t MCR; /* 0x10 : UART Moderm control register */
|
||||
__I uint32_t LSR; /* 0x14 : UART Line status register */
|
||||
__I uint32_t MSR; /* 0x18 : UART Moderm status register */
|
||||
__IO uint32_t SCR; /* 0x1C : UART Scratchpad register */
|
||||
__I uint32_t FSR; /* 0x20 : UART FIFO status register */
|
||||
__IO uint32_t FRR; /* 0x24 : UART FIFO tx/rx trigger resiger */
|
||||
__IO uint32_t DL2; /* 0x28 : UART Baud rate adjust register */
|
||||
__I uint32_t RESERVED0[4];
|
||||
__I uint32_t BAUD; /* 0x3C : UART Auto baud counter */
|
||||
__I uint32_t DL_SLOW; /* 0x40 : UART Divisor Adjust when slow clk */
|
||||
__I uint32_t DL_FAST; /* 0x44 : UART Divisor Adjust when fast clk */
|
||||
} RDA_UART_TypeDef;
|
||||
|
||||
/*------------- Serial Peripheral Interface (SPI) ----------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CFG;
|
||||
__IO uint32_t D0CMD;
|
||||
__IO uint32_t D1CMD;
|
||||
} RDA_SPI_TypeDef;
|
||||
|
||||
/*------------- Integrated Interchip Sound (I2S) -----------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CFG;
|
||||
__IO uint32_t DOUTWR;
|
||||
__I uint32_t DINRD;
|
||||
} RDA_I2S_TypeDef;
|
||||
|
||||
/*------------- External Interface (EXIF) ------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
RDA_SPI_TypeDef SPI0; /* 0x00 - 0x08 : SPI0 registers group */
|
||||
RDA_I2S_TypeDef I2S; /* 0x0C - 0x14 : I2S registers group */
|
||||
__IO uint32_t MISCSTCFG; /* 0x18 : Misc status config register */
|
||||
__IO uint32_t SPI1CTRL; /* 0x1C : SPI1 Control register */
|
||||
uint32_t RESERVED0[4];
|
||||
__IO uint32_t MISCINTCFG; /* 0x30 : Misc int config register */
|
||||
__IO uint32_t MBB2W; /* 0x34 : BT to WiFi mailbox register */
|
||||
__IO uint32_t MBW2B; /* 0x38 : WiFi to BT mailbox register */
|
||||
__IO uint32_t MISCCFG; /* 0x3C : Misc configure register */
|
||||
__IO uint32_t PWM0CFG; /* 0x40 : PWM0 configure register */
|
||||
__IO uint32_t PWM1CFG; /* 0x44 : PWM1 configure register */
|
||||
__IO uint32_t PWM2CFG; /* 0x48 : PWM2 configure register */
|
||||
__IO uint32_t PWM3CFG; /* 0x4C : PWM3 configure register */
|
||||
} RDA_EXIF_TypeDef;
|
||||
|
||||
/*------------- Watchdog Timer (WDT) -----------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t WDTCFG;
|
||||
} RDA_WDT_TypeDef;
|
||||
|
||||
/*------------- Pin Configure (PINCFG) ---------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
union {
|
||||
__IO uint32_t IOMUXCTRL[8];
|
||||
struct {
|
||||
__IO uint32_t MUX0;
|
||||
__IO uint32_t MUX1;
|
||||
__IO uint32_t MODE0;
|
||||
__IO uint32_t MODE1;
|
||||
__IO uint32_t MUX2;
|
||||
__IO uint32_t MUX3;
|
||||
__IO uint32_t MODE2;
|
||||
__IO uint32_t MODE3;
|
||||
};
|
||||
};
|
||||
} RDA_PINCFG_TypeDef;
|
||||
|
||||
/*------------- AHB Direct Memory Access (DMA) -------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t dma_ctrl; /* 0x00 : DMA ctrl */
|
||||
__IO uint32_t dma_src; /* 0x04 : DMA src */
|
||||
__IO uint32_t dma_dst; /* 0x08 : DMA dst */
|
||||
__IO uint32_t dma_len; /* 0x0c : DMA len */
|
||||
__IO uint32_t crc_gen; /* 0x10 : CRC gen */
|
||||
__IO uint32_t dma_func_ctrl; /* 0x14 : DMA func ctrl */
|
||||
__IO uint32_t aes_key0; /* 0x18 : AES key 0 */
|
||||
__IO uint32_t aes_key1; /* 0x1c : AES key 1 */
|
||||
__IO uint32_t aes_key2; /* 0x20 : AES key 2 */
|
||||
__IO uint32_t aes_key3; /* 0x24 : AES key 2 */
|
||||
__IO uint32_t aes_iv0; /* 0x28 : AES iv 0 */
|
||||
__IO uint32_t aes_iv1; /* 0x2c : AES iv 1 */
|
||||
__IO uint32_t aes_iv2; /* 0x30 : AES iv 2 */
|
||||
__IO uint32_t aes_iv3; /* 0x34 : AES iv 2 */
|
||||
__IO uint32_t aes_mode; /* 0x38 : AES mode */
|
||||
__IO uint32_t cios_ctrl; /* 0x3c : cios ctrl */
|
||||
__IO uint32_t cios_reg0; /* 0x40 : cios reg 0 */
|
||||
__IO uint32_t crc_init_val; /* 0x44 : CRC init val */
|
||||
__IO uint32_t crc_out_xorval; /* 0x48 : CRC out xorval */
|
||||
__I uint32_t crc_out_val; /* 0x4c : CRC out val */
|
||||
uint32_t RESERVED0[12];
|
||||
__IO uint32_t dma_int_out; /* 0x80 : DMA int out */
|
||||
__IO uint32_t dma_int_mask; /* 0x84 : DMA int mask */
|
||||
uint32_t RESERVED1[478];
|
||||
__IO uint32_t cios_data_base; /* 0x800 : CIOS data base */
|
||||
} RDA_DMACFG_TypeDef;
|
||||
|
||||
/*------------- Random Number Generator (RNG) --------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t TCTRL; /* 0x00 : TRNG ctrl */
|
||||
__IO uint32_t PCTRL; /* 0x04 : PRNG ctrl */
|
||||
__IO uint32_t PSEED; /* 0x08 : PRNG seed */
|
||||
__IO uint32_t PTMRINIT; /* 0x0C : PRNG timer init */
|
||||
__I uint32_t PTMR; /* 0x10 : PRNG timer */
|
||||
__I uint32_t TD0; /* 0x14 : TRNG data 0 */
|
||||
__I uint32_t TD0MSK; /* 0x18 : TRNG data 0 mask */
|
||||
__I uint32_t TD1; /* 0x1C : TRNG data 1 */
|
||||
__I uint32_t TD1MSK; /* 0x20 : TRNG data 1 mask */
|
||||
__I uint32_t PD; /* 0x24 : PRNG data */
|
||||
__I uint32_t THC; /* 0x28 : TRNG h/c value */
|
||||
} RDA_RNG_TypeDef;
|
||||
|
||||
/*------------- Universal Serial Bus (USB) -------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
struct {
|
||||
__IO uint8_t FUNC_ADDR; /* 0x00: Function Address */
|
||||
__IO uint8_t POWER; /* 0x01: Power */
|
||||
__IO uint16_t INTRTX; /* 0x02-0x03: IntrTx */
|
||||
};
|
||||
struct {
|
||||
__IO uint16_t INTRRX; /* 0x04-0x05: IntrRx */
|
||||
__IO uint16_t INTRTXEN; /* 0x06-0x07: IntrTx Enable */
|
||||
};
|
||||
struct {
|
||||
__IO uint16_t INTRRXEN; /* 0x08-0x09: IntrRx Enable */
|
||||
__IO uint8_t INTR; /* 0x0a: Interrupt */
|
||||
__IO uint8_t INTREN; /* 0x0b: Intr Enable */
|
||||
};
|
||||
struct {
|
||||
__IO uint16_t FRAMENUM; /* 0x0c-0x0d: Frame Number */
|
||||
__IO uint8_t EPIDX; /* 0x0e: Endpoint Index */
|
||||
__IO uint8_t TESTMODE; /* 0x0f: Test Mode */
|
||||
};
|
||||
struct {
|
||||
__IO uint16_t TXMAXPKTSIZE; /* 0x10-0x11: Tx Max Packet Size */
|
||||
union {
|
||||
__IO uint16_t CSR0; /* 0x12-0x13: CSR0 */
|
||||
__IO uint16_t TXCSR; /* 0x12-0x13: CSR0 */
|
||||
};
|
||||
};
|
||||
struct {
|
||||
__IO uint16_t RXMAXPKTSIZE; /* 0x14-0x15: Rx Max Packet Size */
|
||||
__IO uint16_t RXCSR; /* 0x16-0x17: Rx CSR */
|
||||
};
|
||||
struct {
|
||||
union {
|
||||
__IO uint16_t RXCOUNT0; /* 0x18-0x19: Rx Counter of EP0 */
|
||||
__IO uint16_t RXCOUNT; /* 0x18-0x19: Rx Counter of Rx EP */
|
||||
};
|
||||
#if 0
|
||||
uint16_t RESERVED0; /* 0x1a-0x1b: reserved */
|
||||
#else
|
||||
/* host mode only */
|
||||
__IO uint8_t TXTYPE; /* 0x1a: TxType */
|
||||
__IO uint8_t TXINTERVAL; /* 0x1B: TxInterval */
|
||||
|
||||
#endif
|
||||
};
|
||||
struct {
|
||||
__IO uint8_t RXTYPE; /* 0x1c: rxtype */
|
||||
__IO uint8_t RXINTERVAL; /* 0x1d: rxInterval */
|
||||
uint8_t RESERVED1[1]; /* 0x1e: reserved */
|
||||
union {
|
||||
__IO uint8_t CONFIGDATA; /* 0x1f: Data of Core Configuration */
|
||||
__IO uint8_t FIFOSIZE; /* 0x1f: Size of Selected TX/RX Fifo */
|
||||
};
|
||||
};
|
||||
__IO uint32_t FIFOs[16]; /* 0x20-0x5F: fifos for Endpoint */
|
||||
struct {
|
||||
__IO uint8_t DEVCTL; /* 0x60: OTG device control */
|
||||
uint8_t RESERVED2; /* 0x61: unused */
|
||||
__IO uint8_t TXFIFOSZ; /* 0x62: Tx Endpoint FIFO Size */
|
||||
__IO uint8_t RXFIFOSZ; /* 0x63: Rx Endpoint FIFO Size */
|
||||
};
|
||||
struct {
|
||||
__IO uint16_t TXFIFOADDR; /* 0x64-0x65: Tx Endpoint FIFO Address */
|
||||
__IO uint16_t RXFIFOADDR; /* 0x66-0x67: Rx Endpoint FIFO Address */
|
||||
};
|
||||
union {
|
||||
__IO uint32_t VCONTROL; /* 0x68-0x6b: UTMI+PHY Vendor Register */
|
||||
__IO uint32_t VSTATUS; /* 0x68-0x6b: UTMI+PHY Vendor Register */
|
||||
};
|
||||
struct {
|
||||
__IO uint16_t HWVERSION; /* 0x6c-0x6d: Hardware Version Number Register */
|
||||
uint16_t RESERVED3; /* 0x6e-0x6f: Unused */
|
||||
};
|
||||
__IO uint8_t ULPIREG[8]; /* 0x70-0x77: ulpi register, not used */
|
||||
struct {
|
||||
__IO uint8_t EPINFO; /* 0x78: numbers of tx/rx ep */
|
||||
__IO uint8_t RAMINFO; /* 0x79: width of RAM and number of DMA channels */
|
||||
__IO uint8_t LINKINFO; /* 0x7a: delays to be applied */
|
||||
__IO uint8_t VPLEN; /* 0x7b: Duration of the VBus pulsing charge */
|
||||
};
|
||||
struct {
|
||||
__IO uint8_t HSEOF; /* 0x7c: Timer buffer available on HS transaction */
|
||||
__IO uint8_t FSEOF; /* 0x7d: Timer buffer available on HS transaction */
|
||||
__IO uint8_t LSEOF; /* 0x7e: Timer buffer available on HS transaction */
|
||||
uint8_t RESERVED4; /* 0x7f: unused */
|
||||
};
|
||||
uint32_t RESERVED5[3]; /* 0x80-0x8b: unused */
|
||||
__IO uint32_t FIFO_CTRL; /* 0x8c: FIFO Control */
|
||||
__IO uint32_t ANAREG2; /* 0x90-0x93 */
|
||||
uint32_t RESERVED6[91]; /* 0x94-0x1ff: unused */
|
||||
struct {
|
||||
__IO uint8_t DMAINTR; /* 0x200: DMA Interrrupt */
|
||||
__IO uint8_t RESERVED7[3]; /* 0x201-0x203: unused; */
|
||||
};
|
||||
__IO uint32_t DMACTRL0; /* 0x204: channel 0 */
|
||||
__IO uint32_t DMAADDR0; /* 0x208: AHB Memory Address channel 0 */
|
||||
__IO uint32_t COUNT0; /* 0x20c: DMA Counter for channel 0 */
|
||||
|
||||
uint32_t RESERVED8; /* 0x210-0x213: unused */
|
||||
__IO uint32_t DMACTRL1; /* 0x214: channel 1 */
|
||||
__IO uint32_t DMAADDR1; /* 0x218: AHB Memory Address channel 1 */
|
||||
__IO uint32_t COUNT1; /* 0x21c: DMA Counter for channel 1 */
|
||||
uint8_t RESERVED9[224]; /* 0x220 - 0x2FF: unused */
|
||||
__IO uint32_t PKCNT0; /* 0X300: packet count epnum 0 */
|
||||
__IO uint32_t PKCNT1; /* 0X304: packet count epnum 1 */
|
||||
__IO uint32_t PKCNT2; /* 0X308:packet count epnum 1 */
|
||||
}RDA_USB_TypeDef;
|
||||
|
||||
#if defined ( __CC_ARM )
|
||||
#pragma no_anon_unions
|
||||
#endif
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* Peripheral memory map */
|
||||
/******************************************************************************/
|
||||
//#define RDA_ICACHE_DISABLE
|
||||
#define RDA_PARTITION_INDEX 0
|
||||
|
||||
/* Base addresses */
|
||||
#define RDA_ROM_BASE (0x00000000UL)
|
||||
#define RDA_IRAM_BASE (0x00100000UL)
|
||||
#define RDA_DRAM_BASE (0x00180000UL)
|
||||
#define RDA_PSRAM_BASE (0x10000000UL)
|
||||
#define RDA_FLASH_BASE (0x14000000UL)
|
||||
#define RDA_ICACHE_BASE (0x18000000UL)
|
||||
#if (0 == RDA_PARTITION_INDEX)
|
||||
#define RDA_PADDR_OFST (0x00001000UL)
|
||||
#elif (1 == RDA_PARTITION_INDEX)
|
||||
#define RDA_PADDR_OFST (0x0007E000UL)
|
||||
#else
|
||||
#error "Not supported"
|
||||
#endif
|
||||
#if defined(RDA_ICACHE_DISABLE)
|
||||
#define RDA_CODE_BASE (RDA_FLASH_BASE + RDA_PADDR_OFST)
|
||||
#else /* RDA_ICACHE_DISABLE */
|
||||
#define RDA_CODE_BASE (RDA_ICACHE_BASE + RDA_PADDR_OFST)
|
||||
#endif /* RDA_ICACHE_DISABLE */
|
||||
#define RDA_PER_BASE (0x40000000UL)
|
||||
#define RDA_AHB0_BASE (0x40000000UL)
|
||||
#define RDA_APB_BASE (RDA_AHB0_BASE)
|
||||
#define RDA_AHB1_BASE (0x40100000UL)
|
||||
#define RDA_PERBTBND_BASE (0x42000000UL)
|
||||
#define RDA_CM4_BASE (0xE0000000UL)
|
||||
|
||||
/* APB peripherals */
|
||||
#define RDA_SCU_BASE (RDA_APB_BASE + 0x00000)
|
||||
#define RDA_GPIO_BASE (RDA_APB_BASE + 0x01000)
|
||||
#define RDA_TIM0_BASE (RDA_APB_BASE + 0x02000)
|
||||
#define RDA_TIM1_BASE (RDA_APB_BASE + 0x02008)
|
||||
#define RDA_TIMINTST_BASE (RDA_APB_BASE + 0x02010)
|
||||
#define RDA_I2C0_BASE (RDA_APB_BASE + 0x03000)
|
||||
|
||||
/* AHB0 peripherals */
|
||||
#define RDA_PWM_BASE (RDA_AHB0_BASE + 0x04000)
|
||||
#define RDA_PSRAMCFG_BASE (RDA_AHB0_BASE + 0x05000)
|
||||
#define RDA_SDMMC_BASE (RDA_AHB0_BASE + 0x06000)
|
||||
#define RDA_I2C_BASE (RDA_AHB0_BASE + 0x10000)
|
||||
#define RDA_TRAP_BASE (RDA_AHB0_BASE + 0x11000)
|
||||
#define RDA_UART0_BASE (RDA_AHB0_BASE + 0x12000)
|
||||
#define RDA_EXIF_BASE (RDA_AHB0_BASE + 0x13000)
|
||||
#define RDA_PA_BASE (RDA_AHB0_BASE + 0x20000)
|
||||
#define RDA_CE_BASE (RDA_AHB0_BASE + 0x22000)
|
||||
#define RDA_MON_BASE (RDA_AHB0_BASE + 0x24000)
|
||||
#define RDA_SDIO_BASE (RDA_AHB0_BASE + 0x30000)
|
||||
#define RDA_USB_BASE (RDA_AHB0_BASE + 0x31000)
|
||||
|
||||
/* AHB1 peripherals */
|
||||
#define RDA_MEMC_BASE (RDA_AHB1_BASE + 0x00000)
|
||||
#define RDA_UART1_BASE (RDA_AHB1_BASE + 0x80000)
|
||||
#define RDA_DMACFG_BASE (RDA_AHB1_BASE + 0x81000)
|
||||
#define RDA_RNG_BASE (RDA_AHB1_BASE + 0x81100)
|
||||
|
||||
/* EXIF peripherals */
|
||||
#define RDA_SPI0_BASE (RDA_EXIF_BASE + 0x00000)
|
||||
#define RDA_I2S_BASE (RDA_EXIF_BASE + 0x0000C)
|
||||
|
||||
/* MISC peripherals */
|
||||
#define RDA_WDT_BASE (RDA_SCU_BASE + 0x0000C)
|
||||
#define RDA_PINCFG_BASE (RDA_GPIO_BASE + 0x00044)
|
||||
|
||||
/******************************************************************************/
|
||||
/* Peripheral declaration */
|
||||
/******************************************************************************/
|
||||
#define RDA_SCU ((RDA_SCU_TypeDef *) RDA_SCU_BASE )
|
||||
#define RDA_GPIO ((RDA_GPIO_TypeDef *) RDA_GPIO_BASE )
|
||||
#define RDA_TIM0 ((RDA_TIM0_TypeDef *) RDA_TIM0_BASE )
|
||||
#define RDA_TIM1 ((RDA_TIM1_TypeDef *) RDA_TIM1_BASE )
|
||||
#define RDA_TIMINTST ((RDA_TIMINTST_TypeDef *) RDA_TIMINTST_BASE )
|
||||
#define RDA_I2C0 ((RDA_I2C0_TypeDef *) RDA_I2C0_BASE )
|
||||
#define RDA_PWM ((RDA_PWM_TypeDef *) RDA_PWM_BASE )
|
||||
#define RDA_UART0 ((RDA_UART_TypeDef *) RDA_UART0_BASE )
|
||||
#define RDA_UART1 ((RDA_UART_TypeDef *) RDA_UART1_BASE )
|
||||
#define RDA_SPI0 ((RDA_SPI_TypeDef *) RDA_SPI0_BASE )
|
||||
#define RDA_I2S ((RDA_I2S_TypeDef *) RDA_I2S_BASE )
|
||||
#define RDA_EXIF ((RDA_EXIF_TypeDef *) RDA_EXIF_BASE )
|
||||
#define RDA_WDT ((RDA_WDT_TypeDef *) RDA_WDT_BASE )
|
||||
#define RDA_PINCFG ((RDA_PINCFG_TypeDef *) RDA_PINCFG_BASE )
|
||||
#define RDA_DMACFG ((RDA_DMACFG_TypeDef *) RDA_DMACFG_BASE )
|
||||
#define RDA_RNG ((RDA_RNG_TypeDef *) RDA_RNG_BASE )
|
||||
#define RDA_USB ((RDA_USB_TypeDef *) RDA_USB_BASE )
|
||||
|
||||
#endif /* __RDA5991H_H__ */
|
|
@ -0,0 +1,57 @@
|
|||
#! armcc -E
|
||||
|
||||
//#define RDA_ICACHE_DISABLE
|
||||
#define RDA_PARTITION_INDEX 0
|
||||
|
||||
#define RDA_ROM_BASE (0x00000000)
|
||||
#define RDA_IRAM_BASE (0x00100000)
|
||||
#define RDA_IRAM_SIZE (0x00020000)
|
||||
#define RDA_DRAM_BASE (0x00180000)
|
||||
#define RDA_DRAM_SIZE (0x00028000)
|
||||
#define RDA_PSRAM_BASE (0x10000000)
|
||||
#define RDA_FLASH_BASE (0x14000000)
|
||||
#define RDA_ICACHE_BASE (0x18000000)
|
||||
#if (0 == RDA_PARTITION_INDEX)
|
||||
#define RDA_PADDR_OFST (0x00001000)
|
||||
#elif (1 == RDA_PARTITION_INDEX)
|
||||
#define RDA_PADDR_OFST (0x001F5000)
|
||||
#else
|
||||
#error "Not supported"
|
||||
#endif
|
||||
#if defined(RDA_ICACHE_DISABLE)
|
||||
#define RDA_CODE_BASE (RDA_FLASH_BASE + RDA_PADDR_OFST)
|
||||
#else /* RDA_ICACHE_DISABLE */
|
||||
#define RDA_CODE_BASE (RDA_ICACHE_BASE + RDA_PADDR_OFST)
|
||||
#endif /* RDA_ICACHE_DISABLE */
|
||||
#define RDA_CODE_SIZE (0x001F4000)
|
||||
#define RDA_AHB1_BASE (0x40100000)
|
||||
#define RDA_MEMC_BASE (RDA_AHB1_BASE + 0x00000)
|
||||
|
||||
; max code size: RDA_CODE_SIZE
|
||||
LR_IROM1 RDA_CODE_BASE RDA_CODE_SIZE { ; load region size_region
|
||||
ER_IROM0 RDA_CODE_BASE RDA_CODE_SIZE { ; load address = execution address
|
||||
*.o (RESET, +First)
|
||||
*(InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
; 8_byte_aligned(31 vect * 4 bytes) = 8_byte_aligned(0x7C) = 0x80
|
||||
ER_IRAMVEC RDA_IRAM_BASE EMPTY 0x80 { ; Reserved for vectors
|
||||
}
|
||||
; IRAM Size: Total(128KB) - Vector(128B) - Stack(2KB)
|
||||
RW_IRAM1 AlignExpr(+0, 8) (0x20000 - 0x80 - 0x800) {
|
||||
.ANY (+RW +ZI)
|
||||
}
|
||||
ARM_LIB_STACK AlignExpr(+0, 8) EMPTY (RDA_IRAM_BASE + RDA_IRAM_SIZE - AlignExpr(ImageLimit(RW_IRAM1), 8)) {
|
||||
}
|
||||
ARM_LIB_HEAP RDA_DRAM_BASE EMPTY RDA_DRAM_SIZE {
|
||||
}
|
||||
RW_IRAM2 RDA_MEMC_BASE 0x18C00 { ; RW data, MACLIB_RAM
|
||||
.ANY (SECTIONRESERVED1)
|
||||
}
|
||||
RW_IRAM3 (RDA_MEMC_BASE + 0x18C00) 0x0C00 { ; RW data, AES_RAM
|
||||
.ANY (AHB1SMEM0)
|
||||
}
|
||||
RW_IRAM4 (RDA_MEMC_BASE + 0x19800) 0x6800 { ; RW data, WLAN RAM
|
||||
.ANY (AHB1SMEM1)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,180 @@
|
|||
;/*****************************************************************************
|
||||
; * @file: startup_RDA5991H.s
|
||||
; * @purpose: CMSIS Cortex-M4 Core Device Startup File
|
||||
; * for the RDA RDA5991H Device Series
|
||||
; * @version: V1.02, modified for mbed
|
||||
; * @date: 07. June 2018
|
||||
; *------- <<< Use Configuration Wizard in Context Menu >>> ------------------
|
||||
; *
|
||||
; * Copyright (C) 2009 ARM Limited. All rights reserved.
|
||||
; * ARM Limited (ARM) is supplying this software for use with Cortex-M3
|
||||
; * processor based microcontrollers. This file can be freely distributed
|
||||
; * within development tools that are supporting such ARM based processors.
|
||||
; *
|
||||
; * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
; *
|
||||
; *****************************************************************************/
|
||||
|
||||
PRESERVE8
|
||||
THUMB
|
||||
|
||||
; Vector Table Mapped to Address 0 at Reset
|
||||
|
||||
AREA RESET, DATA, READONLY
|
||||
IMPORT |Image$$ARM_LIB_STACK$$ZI$$Limit| [WEAK]
|
||||
EXPORT __Vectors
|
||||
|
||||
__Vectors DCD |Image$$ARM_LIB_STACK$$ZI$$Limit| ; Top of Stack
|
||||
DCD Reset_Handler ; Reset Handler
|
||||
DCD NMI_Handler ; NMI Handler
|
||||
DCD HardFault_Handler ; Hard Fault Handler
|
||||
DCD MemManage_Handler ; MPU Fault Handler
|
||||
DCD BusFault_Handler ; Bus Fault Handler
|
||||
DCD UsageFault_Handler ; Usage Fault Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD SVC_Handler ; SVCall Handler
|
||||
DCD DebugMon_Handler ; Debug Monitor Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD PendSV_Handler ; PendSV Handler
|
||||
DCD SysTick_Handler ; SysTick Handler
|
||||
|
||||
; External Interrupts
|
||||
DCD SPIFLASH_IRQHandler ; 16: SPI Flash
|
||||
DCD PTA_IRQHandler ; 17: PTA
|
||||
DCD SDIO_IRQHandler ; 18: SDIO
|
||||
DCD USBDMA_IRQHandler ; 19: USB DMA
|
||||
DCD USB_IRQHandler ; 20: USB
|
||||
DCD GPIO_IRQHandler ; 21: GPIO
|
||||
DCD TIMER0_IRQHandler ; 22: Timer0
|
||||
DCD UART0_IRQHandler ; 23: UART0
|
||||
DCD MACHW_IRQHandler ; 24: MAC Hardware
|
||||
DCD UART1_IRQHandler ; 25: UART1
|
||||
DCD AHBDMA_IRQHandler ; 26: AHB DMA
|
||||
DCD PSRAM_IRQHandler ; 27: PSRAM
|
||||
DCD SDMMC_IRQHandler ; 28: SDMMC
|
||||
DCD EXIF_IRQHandler ; 29: EXIF
|
||||
DCD I2C_IRQHandler ; 30: I2C
|
||||
|
||||
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
|
||||
|
||||
; Reset Handler
|
||||
|
||||
Reset_Handler PROC
|
||||
EXPORT Reset_Handler [WEAK]
|
||||
IMPORT rda_ccfg_boot
|
||||
IMPORT SystemInit
|
||||
IMPORT __main
|
||||
LDR R0, =|Image$$ARM_LIB_STACK$$ZI$$Limit|
|
||||
MSR MSP, R0
|
||||
LDR R0, =rda_ccfg_boot
|
||||
BLX R0
|
||||
CMP R0, #0x01
|
||||
BNE Soft_Reset
|
||||
LDR R0, =SystemInit
|
||||
BLX R0
|
||||
LDR R0, =__main
|
||||
BX R0
|
||||
ENDP
|
||||
|
||||
; Soft Reset
|
||||
|
||||
Soft_Reset PROC
|
||||
MOV R1, #0x04
|
||||
LDR R0, [R1]
|
||||
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
|
||||
MemManage_Handler\
|
||||
PROC
|
||||
EXPORT MemManage_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
BusFault_Handler\
|
||||
PROC
|
||||
EXPORT BusFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
UsageFault_Handler\
|
||||
PROC
|
||||
EXPORT UsageFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
SVC_Handler PROC
|
||||
EXPORT SVC_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
DebugMon_Handler\
|
||||
PROC
|
||||
EXPORT DebugMon_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 SPIFLASH_IRQHandler [WEAK]
|
||||
EXPORT PTA_IRQHandler [WEAK]
|
||||
EXPORT SDIO_IRQHandler [WEAK]
|
||||
EXPORT USBDMA_IRQHandler [WEAK]
|
||||
EXPORT USB_IRQHandler [WEAK]
|
||||
EXPORT GPIO_IRQHandler [WEAK]
|
||||
EXPORT TIMER0_IRQHandler [WEAK]
|
||||
EXPORT UART0_IRQHandler [WEAK]
|
||||
EXPORT MACHW_IRQHandler [WEAK]
|
||||
EXPORT UART1_IRQHandler [WEAK]
|
||||
EXPORT AHBDMA_IRQHandler [WEAK]
|
||||
EXPORT PSRAM_IRQHandler [WEAK]
|
||||
EXPORT SDMMC_IRQHandler [WEAK]
|
||||
EXPORT EXIF_IRQHandler [WEAK]
|
||||
EXPORT I2C_IRQHandler [WEAK]
|
||||
|
||||
SPIFLASH_IRQHandler
|
||||
PTA_IRQHandler
|
||||
SDIO_IRQHandler
|
||||
USBDMA_IRQHandler
|
||||
USB_IRQHandler
|
||||
GPIO_IRQHandler
|
||||
TIMER0_IRQHandler
|
||||
UART0_IRQHandler
|
||||
MACHW_IRQHandler
|
||||
UART1_IRQHandler
|
||||
AHBDMA_IRQHandler
|
||||
PSRAM_IRQHandler
|
||||
SDMMC_IRQHandler
|
||||
EXIF_IRQHandler
|
||||
I2C_IRQHandler
|
||||
|
||||
B .
|
||||
|
||||
ENDP
|
||||
|
||||
ALIGN
|
||||
END
|
|
@ -0,0 +1,36 @@
|
|||
/* mbed Microcontroller Library - stackheap
|
||||
* Copyright (C) 2009-2018 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
|
||||
|
||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||
#include <arm_compat.h>
|
||||
#endif
|
||||
|
||||
#include <rt_misc.h>
|
||||
#include <stdint.h>
|
||||
|
||||
extern char Image$$ARM_LIB_HEAP$$ZI$$Base[];
|
||||
extern char Image$$ARM_LIB_HEAP$$ZI$$Length[];
|
||||
|
||||
extern __value_in_regs struct __initial_stackheap _mbed_user_setup_stackheap(uint32_t R0, uint32_t R1, uint32_t R2, uint32_t R3)
|
||||
{
|
||||
uint32_t hp_base = (uint32_t)Image$$ARM_LIB_HEAP$$ZI$$Base;
|
||||
uint32_t hp_limit = (uint32_t)Image$$ARM_LIB_HEAP$$ZI$$Length + hp_base;
|
||||
struct __initial_stackheap r;
|
||||
|
||||
hp_base = (hp_base + 7) & ~0x7; // ensure hp_base is 8-byte aligned
|
||||
r.heap_base = hp_base;
|
||||
r.heap_limit = hp_limit;
|
||||
return r;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,192 @@
|
|||
/* Linker script for mbed RDA5981C */
|
||||
|
||||
/* Linker script to configure memory regions. */
|
||||
MEMORY
|
||||
{
|
||||
/* If ICache is enable, use virtual flash base address */
|
||||
/* Use partition index: 0 */
|
||||
FLASH (rx) : ORIGIN = 0x18001000, LENGTH = 2000K
|
||||
/* Use partition index: 1 */
|
||||
/* FLASH (rx) : ORIGIN = 0x181F5000, LENGTH = 2000K */
|
||||
|
||||
/* If ICache is disable, use real flash base address. Depends on macro: RDA_ICACHE_DISABLE */
|
||||
/* Use partition index: 0 */
|
||||
/* FLASH (rx) : ORIGIN = 0x14001000, LENGTH = 2000K */
|
||||
/* Use partition index: 1 */
|
||||
/* FLASH (rx) : ORIGIN = 0x141F5000, LENGTH = 2000K */
|
||||
|
||||
IRAM (rwx) : ORIGIN = 0x00100080, LENGTH = (128K - 0x80)
|
||||
DRAM (rwx) : ORIGIN = 0x00180000, LENGTH = 160K
|
||||
MACLIB_RAM(rwx) : ORIGIN = 0x40100000, LENGTH = 99K
|
||||
AES_RAM(rwx) : ORIGIN = 0x40118C00, LENGTH = 1K
|
||||
WLAN_RAM(rwx) : ORIGIN = 0x40119000, LENGTH = 28K
|
||||
}
|
||||
|
||||
/* Linker script to place sections and symbol values. Should be used together
|
||||
* with other linker script that defines memory regions FLASH and RAM.
|
||||
* It references following symbols, which must be defined in code:
|
||||
* Reset_Handler : Entry of reset handler
|
||||
*
|
||||
* It defines following symbols, which code can use without definition:
|
||||
* __exidx_start
|
||||
* __exidx_end
|
||||
* __etext
|
||||
* __data_start__
|
||||
* __preinit_array_start
|
||||
* __preinit_array_end
|
||||
* __init_array_start
|
||||
* __init_array_end
|
||||
* __fini_array_start
|
||||
* __fini_array_end
|
||||
* __data_end__
|
||||
* __bss_start__
|
||||
* __bss_end__
|
||||
* __end__
|
||||
* end
|
||||
* __HeapLimit
|
||||
* __StackLimit
|
||||
* __StackTop
|
||||
* __stack
|
||||
*/
|
||||
ENTRY(Reset_Handler)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
{
|
||||
KEEP(*(.isr_vector))
|
||||
*(.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*)
|
||||
|
||||
KEEP(*(.eh_frame*))
|
||||
} > FLASH
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > FLASH
|
||||
|
||||
__exidx_start = .;
|
||||
.ARM.exidx :
|
||||
{
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
} > FLASH
|
||||
__exidx_end = .;
|
||||
|
||||
__etext = .;
|
||||
|
||||
.data : AT (__etext)
|
||||
{
|
||||
__data_start__ = .;
|
||||
Image$$RW_IRAM1$$Base = .;
|
||||
*(vtable)
|
||||
*(.data*)
|
||||
|
||||
. = ALIGN(4);
|
||||
/* preinit data */
|
||||
PROVIDE (__preinit_array_start = .);
|
||||
KEEP(*(.preinit_array))
|
||||
PROVIDE (__preinit_array_end = .);
|
||||
|
||||
. = ALIGN(4);
|
||||
/* init data */
|
||||
PROVIDE (__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE (__init_array_end = .);
|
||||
|
||||
|
||||
. = ALIGN(4);
|
||||
/* finit data */
|
||||
PROVIDE (__fini_array_start = .);
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
KEEP(*(.fini_array))
|
||||
PROVIDE (__fini_array_end = .);
|
||||
|
||||
. = ALIGN(4);
|
||||
/* All data end */
|
||||
__data_end__ = .;
|
||||
|
||||
} > IRAM
|
||||
|
||||
|
||||
.bss :
|
||||
{
|
||||
__bss_start__ = .;
|
||||
*(.bss*)
|
||||
*(COMMON)
|
||||
__bss_end__ = .;
|
||||
Image$$RW_IRAM1$$ZI$$Limit = . ;
|
||||
} > IRAM
|
||||
|
||||
/* .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 :
|
||||
{
|
||||
*(.stack)
|
||||
} > IRAM
|
||||
|
||||
/* Set stack top to end of IRAM, and stack limit move down by
|
||||
* size of stack_dummy section */
|
||||
__StackTop = ORIGIN(IRAM) + LENGTH(IRAM);
|
||||
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
|
||||
PROVIDE(__stack = __StackTop);
|
||||
|
||||
/* Check if data + stack exceeds RAM limit */
|
||||
ASSERT(__StackLimit >= __bss_end__, "region IRAM overflowed with stack")
|
||||
|
||||
|
||||
.heap :
|
||||
{
|
||||
__end__ = .;
|
||||
end = __end__;
|
||||
*(.heap*)
|
||||
__HeapLimit = .;
|
||||
} > DRAM
|
||||
PROVIDE(__sbrk_start = ADDR(.heap));
|
||||
PROVIDE(__krbs_start = ADDR(.heap) + SIZEOF(.heap));
|
||||
|
||||
/* Code can explicitly ask for data to be
|
||||
placed in these higher RAM banks where
|
||||
they will be left uninitialized.
|
||||
*/
|
||||
.SECTIONRESERVED1 (NOLOAD):
|
||||
{
|
||||
Image$$RW_IRAM2$$Base = . ;
|
||||
*(SECTIONRESERVED1)
|
||||
Image$$RW_IRAM2$$ZI$$Limit = .;
|
||||
} > MACLIB_RAM
|
||||
|
||||
.AHB1SMEM0 (NOLOAD):
|
||||
{
|
||||
Image$$RW_IRAM3$$Base = . ;
|
||||
*(AHB1SMEM0)
|
||||
Image$$RW_IRAM3$$ZI$$Limit = .;
|
||||
} > AES_RAM
|
||||
|
||||
.AHB1SMEM1 (NOLOAD):
|
||||
{
|
||||
Image$$RW_IRAM4$$Base = . ;
|
||||
*(AHB1SMEM1)
|
||||
Image$$RW_IRAM4$$ZI$$Limit = .;
|
||||
} > WLAN_RAM
|
||||
}
|
|
@ -0,0 +1,196 @@
|
|||
/* File: startup_ARMCM4.s
|
||||
* Purpose: startup file for Cortex-M3/M4 devices. Should use with
|
||||
* GNU Tools for ARM Embedded Processors
|
||||
* Version: V1.1
|
||||
* Date: 17 June 2018
|
||||
*
|
||||
* Copyright (C) 2011 ARM Limited. All rights reserved.
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M3/M4
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*/
|
||||
.syntax unified
|
||||
.arch armv7-m
|
||||
|
||||
/* Memory Model
|
||||
The HEAP starts at the end of the DATA section and grows upward.
|
||||
|
||||
The STACK starts at the end of the RAM and grows downward.
|
||||
|
||||
The HEAP and stack STACK are only checked at compile time:
|
||||
(DATA_SIZE + HEAP_SIZE + STACK_SIZE) < RAM_SIZE
|
||||
|
||||
This is just a check for the bare minimum for the Heap+Stack area before
|
||||
aborting compilation, it is not the run time limit:
|
||||
Heap_Size + Stack_Size = 0x80 + 0x80 = 0x100
|
||||
*/
|
||||
.section .stack
|
||||
.align 3
|
||||
#ifdef __STACK_SIZE
|
||||
.equ Stack_Size, __STACK_SIZE
|
||||
#else
|
||||
.equ Stack_Size, 0x800
|
||||
#endif
|
||||
.globl __StackTop
|
||||
.globl __StackLimit
|
||||
__StackLimit:
|
||||
.space Stack_Size
|
||||
.size __StackLimit, . - __StackLimit
|
||||
__StackTop:
|
||||
.size __StackTop, . - __StackTop
|
||||
|
||||
.section .heap
|
||||
.align 3
|
||||
#ifdef __HEAP_SIZE
|
||||
.equ Heap_Size, __HEAP_SIZE
|
||||
#else
|
||||
.equ Heap_Size, 0x28000
|
||||
#endif
|
||||
.globl __HeapBase
|
||||
.globl __HeapLimit
|
||||
__HeapBase:
|
||||
.space Heap_Size
|
||||
.size __HeapBase, . - __HeapBase
|
||||
__HeapLimit:
|
||||
.size __HeapLimit, . - __HeapLimit
|
||||
|
||||
.section .isr_vector
|
||||
.align 2
|
||||
.globl __isr_vector
|
||||
__isr_vector:
|
||||
.long __StackTop /* Top of Stack */
|
||||
.long Reset_Handler /* Reset Handler */
|
||||
.long NMI_Handler /* NMI Handler */
|
||||
.long HardFault_Handler /* Hard Fault Handler */
|
||||
.long MemManage_Handler /* MPU Fault Handler */
|
||||
.long BusFault_Handler /* Bus Fault Handler */
|
||||
.long UsageFault_Handler /* Usage Fault Handler */
|
||||
.long 0 /* Reserved */
|
||||
.long 0 /* Reserved */
|
||||
.long 0 /* Reserved */
|
||||
.long 0 /* Reserved */
|
||||
.long SVC_Handler /* SVCall Handler */
|
||||
.long DebugMon_Handler /* Debug Monitor Handler */
|
||||
.long 0 /* Reserved */
|
||||
.long PendSV_Handler /* PendSV Handler */
|
||||
.long SysTick_Handler /* SysTick Handler */
|
||||
|
||||
/* External interrupts */
|
||||
.long SPIFLASH_IRQHandler /* 16: SPI Flash */
|
||||
.long PTA_IRQHandler /* 17: PTA */
|
||||
.long SDIO_IRQHandler /* 18: SDIO */
|
||||
.long USBDMA_IRQHandler /* 19: USB DMA */
|
||||
.long USB_IRQHandler /* 20: USB */
|
||||
.long GPIO_IRQHandler /* 21: GPIO */
|
||||
.long TIMER0_IRQHandler /* 22: Timer0 */
|
||||
.long UART0_IRQHandler /* 23: UART0 */
|
||||
.long MACHW_IRQHandler /* 24: MAC Hardware */
|
||||
.long UART1_IRQHandler /* 25: UART1 */
|
||||
.long AHBDMA_IRQHandler /* 26: AHB DMA */
|
||||
.long PSRAM_IRQHandler /* 27: PSRAM */
|
||||
.long SDMMC_IRQHandler /* 28: SDMMC */
|
||||
.long EXIF_IRQHandler /* 29: EXIF */
|
||||
.long I2C_IRQHandler /* 30: I2C */
|
||||
|
||||
|
||||
.size __isr_vector, . - __isr_vector
|
||||
|
||||
.text
|
||||
.thumb
|
||||
.thumb_func
|
||||
.align 2
|
||||
.globl Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
/* Loop to copy data from read only memory to RAM. The ranges
|
||||
* of copy from/to are specified by following symbols evaluated in
|
||||
* linker script.
|
||||
* _etext: End of code section, i.e., begin of data sections to copy from.
|
||||
* __data_start__/__data_end__: RAM address range that data should be
|
||||
* copied to. Both must be aligned to 4 bytes boundary. */
|
||||
|
||||
ldr r0, =__StackTop
|
||||
msr msp, r0
|
||||
|
||||
ldr r0, =rda_ccfg_boot
|
||||
blx r0
|
||||
cmp r0, #0x01
|
||||
bne Soft_Reset
|
||||
|
||||
ldr r1, =__etext
|
||||
ldr r2, =__data_start__
|
||||
ldr r3, =__data_end__
|
||||
|
||||
.Lflash_to_ram_loop:
|
||||
cmp r2, r3
|
||||
ittt lt
|
||||
ldrlt r0, [r1], #4
|
||||
strlt r0, [r2], #4
|
||||
blt .Lflash_to_ram_loop
|
||||
|
||||
ldr r0, =SystemInit
|
||||
blx r0
|
||||
ldr r0, =_start
|
||||
bx r0
|
||||
|
||||
Soft_Reset:
|
||||
mov r1, #0x04
|
||||
ldr r0, [r1]
|
||||
bx r0
|
||||
|
||||
.pool
|
||||
.size Reset_Handler, . - Reset_Handler
|
||||
|
||||
.text
|
||||
/* Macro to define default handlers. Default handler
|
||||
* will be weak symbol and just dead loops. They can be
|
||||
* overwritten by other handlers */
|
||||
.macro def_default_handler handler_name
|
||||
.align 1
|
||||
.thumb_func
|
||||
.weak \handler_name
|
||||
.type \handler_name, %function
|
||||
\handler_name :
|
||||
b .
|
||||
.size \handler_name, . - \handler_name
|
||||
.endm
|
||||
|
||||
def_default_handler NMI_Handler
|
||||
def_default_handler HardFault_Handler
|
||||
def_default_handler MemManage_Handler
|
||||
def_default_handler BusFault_Handler
|
||||
def_default_handler UsageFault_Handler
|
||||
def_default_handler SVC_Handler
|
||||
def_default_handler DebugMon_Handler
|
||||
def_default_handler PendSV_Handler
|
||||
def_default_handler SysTick_Handler
|
||||
def_default_handler Default_Handler
|
||||
|
||||
.macro def_irq_default_handler handler_name
|
||||
.weak \handler_name
|
||||
.set \handler_name, Default_Handler
|
||||
.endm
|
||||
|
||||
def_irq_default_handler SPIFLASH_IRQHandler
|
||||
def_irq_default_handler PTA_IRQHandler
|
||||
def_irq_default_handler SDIO_IRQHandler
|
||||
def_irq_default_handler USBDMA_IRQHandler
|
||||
def_irq_default_handler USB_IRQHandler
|
||||
def_irq_default_handler GPIO_IRQHandler
|
||||
def_irq_default_handler TIMER0_IRQHandler
|
||||
def_irq_default_handler UART0_IRQHandler
|
||||
def_irq_default_handler MACHW_IRQHandler
|
||||
def_irq_default_handler UART1_IRQHandler
|
||||
def_irq_default_handler AHBDMA_IRQHandler
|
||||
def_irq_default_handler PSRAM_IRQHandler
|
||||
def_irq_default_handler SDMMC_IRQHandler
|
||||
def_irq_default_handler EXIF_IRQHandler
|
||||
def_irq_default_handler I2C_IRQHandler
|
||||
|
||||
.end
|
|
@ -0,0 +1,37 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2009-2018 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.
|
||||
*/
|
||||
|
||||
#if defined(TWO_RAM_REGIONS)
|
||||
#include <stdint.h>
|
||||
#include <errno.h>
|
||||
|
||||
extern uint32_t __sbrk_start;
|
||||
extern uint32_t __krbs_start;
|
||||
|
||||
/* Overide _sbrk() to support two region model */
|
||||
void *__wrap__sbrk(int incr)
|
||||
{
|
||||
static uint32_t heap_ind = (uint32_t)(&__sbrk_start);
|
||||
uint32_t heap_ind_pre = heap_ind;
|
||||
uint32_t heap_ind_new = (heap_ind_pre + incr + 0x07) & ~0x07;
|
||||
if (heap_ind_new > (uint32_t)(&__krbs_start)) {
|
||||
errno = ENOMEM;
|
||||
return (void *)(-1);
|
||||
}
|
||||
heap_ind = heap_ind_new;
|
||||
return (void *) heap_ind_pre;
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,64 @@
|
|||
/* Linker file for the IAR Compiler for ARM */
|
||||
/* Specials */
|
||||
define symbol RDA_ICACHE_DISABLE = 0;
|
||||
define symbol RDA_PARTITION_INDEX = 0;
|
||||
/* Memory Regions */
|
||||
define symbol RDA_IRAM_BASE = 0x00100000;
|
||||
define symbol RDA_IRAM_END = 0x0011FFFF;
|
||||
define symbol RDA_DRAM_BASE = 0x00180000;
|
||||
define symbol RDA_DRAM_END = 0x001A7FFF;
|
||||
define symbol RDA_FLASH_BASE = 0x14000000;
|
||||
define symbol RDA_ICACHE_BASE = 0x18000000;
|
||||
if (0 == RDA_PARTITION_INDEX) {
|
||||
define symbol RDA_PADDR_OFST = 0x00001000;
|
||||
} else {
|
||||
define symbol RDA_PADDR_OFST = 0x001F5000;
|
||||
}
|
||||
if (1 == RDA_ICACHE_DISABLE) {
|
||||
define symbol RDA_CODE_BASE = RDA_FLASH_BASE + RDA_PADDR_OFST;
|
||||
} else {
|
||||
define symbol RDA_CODE_BASE = RDA_ICACHE_BASE + RDA_PADDR_OFST;
|
||||
}
|
||||
define symbol RDA_CODE_END = RDA_CODE_BASE + 0x1F3FFF;
|
||||
define symbol RDA_AHB1_BASE = 0x40100000;
|
||||
define symbol RDA_MEMC_BASE = RDA_AHB1_BASE + 0x00000;
|
||||
define symbol RDA_MEMC_END = RDA_AHB1_BASE + 0x1FFFF;
|
||||
|
||||
define symbol INTVEC_BASE = RDA_CODE_BASE;
|
||||
define symbol INTVEC_RAM_BASE = RDA_IRAM_BASE;
|
||||
define symbol I_DATA_BASE = RDA_IRAM_BASE + 0x80;
|
||||
define symbol I_DATA_END = RDA_IRAM_END;
|
||||
define symbol D_DATA_BASE = RDA_DRAM_BASE;
|
||||
define symbol D_DATA_END = RDA_DRAM_END;
|
||||
define symbol AES_BASE = RDA_MEMC_BASE + 0x18C00;
|
||||
define symbol AES_END = RDA_MEMC_BASE + 0x197FF;
|
||||
define symbol WLAN_BASE = RDA_MEMC_BASE + 0x19800;
|
||||
define symbol WLAN_END = RDA_MEMC_END;
|
||||
|
||||
/* Stack Size & Heap Size*/
|
||||
define symbol CSTACK_SIZE = 0x00400;
|
||||
define symbol HEAP_SIZE = RDA_DRAM_END - RDA_DRAM_BASE + 1;
|
||||
|
||||
/*Memory regions*/
|
||||
define memory mem with size = 4G;
|
||||
define region ROM_REGION = mem:[from RDA_CODE_BASE to RDA_CODE_END];
|
||||
define region IRAM_REGION = mem:[from I_DATA_BASE to I_DATA_END];
|
||||
define region DRAM_REGION = mem:[from D_DATA_BASE to D_DATA_END];
|
||||
define region AES_REGION = mem:[from AES_BASE to AES_END];
|
||||
define region WLAN_REGION = mem:[from WLAN_BASE to WLAN_END];
|
||||
|
||||
define block CSTACK with alignment = 8, size = CSTACK_SIZE { };
|
||||
define block HEAP with alignment = 8, size = HEAP_SIZE { };
|
||||
define block RW { readwrite };
|
||||
define block ZI { zi };
|
||||
|
||||
initialize by copy { readwrite };
|
||||
do not initialize { section .noinit };
|
||||
|
||||
place at address mem:INTVEC_BASE { readonly section .intvec };
|
||||
|
||||
place in ROM_REGION { readonly };
|
||||
place in IRAM_REGION { block RW, block ZI, block CSTACK};
|
||||
place in DRAM_REGION { block HEAP};
|
||||
place in AES_REGION { section AHB1SMEM0 };
|
||||
place in WLAN_REGION { section AHB1SMEM1 };
|
|
@ -0,0 +1,221 @@
|
|||
;/*****************************************************************************
|
||||
; * @file: startup_RDA5991H.s
|
||||
; * @purpose: CMSIS Cortex-M4 Core Device Startup File
|
||||
; * for the RDA5981x Device Series
|
||||
; * @version: V1.00
|
||||
; * @date: 09. June 2018
|
||||
; *----------------------------------------------------------------------------
|
||||
; *
|
||||
; * Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
; *
|
||||
; * ARM Limited (ARM) is supplying this software for use with Cortex-Mx
|
||||
; * processor based microcontrollers. This file can be freely distributed
|
||||
; * within development tools that are supporting such ARM based processors.
|
||||
; *
|
||||
; * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
; *
|
||||
; ******************************************************************************/
|
||||
|
||||
|
||||
MODULE ?cstartup
|
||||
|
||||
;; Forward declaration of sections.
|
||||
SECTION CSTACK:DATA:NOROOT(3)
|
||||
|
||||
SECTION .intvec:CODE:NOROOT(2)
|
||||
|
||||
EXTERN __iar_program_start
|
||||
EXTERN SystemInit
|
||||
EXTERN rda_ccfg_boot
|
||||
PUBLIC __vector_table
|
||||
PUBLIC __vector_table_0x1c
|
||||
PUBLIC __Vectors
|
||||
PUBLIC __Vectors_End
|
||||
PUBLIC __Vectors_Size
|
||||
|
||||
DATA
|
||||
|
||||
__vector_table
|
||||
DCD sfe(CSTACK)
|
||||
DCD Reset_Handler
|
||||
|
||||
DCD NMI_Handler
|
||||
DCD HardFault_Handler
|
||||
DCD MemManage_Handler
|
||||
DCD BusFault_Handler
|
||||
DCD UsageFault_Handler
|
||||
__vector_table_0x1c
|
||||
DCD 0
|
||||
DCD 0
|
||||
DCD 0
|
||||
DCD 0
|
||||
DCD SVC_Handler
|
||||
DCD DebugMon_Handler
|
||||
DCD 0
|
||||
DCD PendSV_Handler
|
||||
DCD SysTick_Handler
|
||||
|
||||
; External Interrupts
|
||||
DCD SPIFLASH_IRQHandler
|
||||
DCD PTA_IRQHandler
|
||||
DCD SDIO_IRQHandler
|
||||
DCD USBDMA_IRQHandler
|
||||
DCD USB_IRQHandler
|
||||
DCD GPIO_IRQHandler
|
||||
DCD TIMER0_IRQHandler
|
||||
DCD UART0_IRQHandler
|
||||
DCD MACHW_IRQHandler
|
||||
DCD UART1_IRQHandler
|
||||
DCD AHBDMA_IRQHandler
|
||||
DCD PSRAM_IRQHandler
|
||||
DCD SDMMC_IRQHandler
|
||||
DCD EXIF_IRQHandler
|
||||
DCD I2C_IRQHandler
|
||||
__Vectors_End
|
||||
__Vectors EQU __vector_table
|
||||
__Vectors_Size EQU __Vectors_End - __Vectors
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;
|
||||
;; Default interrupt handlers.
|
||||
;;
|
||||
THUMB
|
||||
|
||||
PUBWEAK Reset_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(2)
|
||||
Reset_Handler
|
||||
LDR R0, =sfe(CSTACK)
|
||||
MSR MSP, R0
|
||||
LDR R0, =rda_ccfg_boot
|
||||
BLX R0
|
||||
LDR R0, =SystemInit
|
||||
BLX R0
|
||||
LDR R0, =__iar_program_start
|
||||
BX R0
|
||||
|
||||
PUBWEAK NMI_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
NMI_Handler
|
||||
B NMI_Handler
|
||||
|
||||
PUBWEAK HardFault_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
HardFault_Handler
|
||||
B HardFault_Handler
|
||||
|
||||
PUBWEAK MemManage_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
MemManage_Handler
|
||||
B MemManage_Handler
|
||||
|
||||
PUBWEAK BusFault_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
BusFault_Handler
|
||||
B BusFault_Handler
|
||||
|
||||
PUBWEAK UsageFault_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
UsageFault_Handler
|
||||
B UsageFault_Handler
|
||||
|
||||
PUBWEAK SVC_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
SVC_Handler
|
||||
B SVC_Handler
|
||||
|
||||
PUBWEAK DebugMon_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
DebugMon_Handler
|
||||
B DebugMon_Handler
|
||||
|
||||
PUBWEAK PendSV_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
PendSV_Handler
|
||||
B PendSV_Handler
|
||||
|
||||
PUBWEAK SysTick_Handler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
SysTick_Handler
|
||||
B SysTick_Handler
|
||||
|
||||
PUBWEAK SPIFLASH_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
SPIFLASH_IRQHandler
|
||||
B SPIFLASH_IRQHandler
|
||||
|
||||
PUBWEAK PTA_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
PTA_IRQHandler
|
||||
B PTA_IRQHandler
|
||||
|
||||
PUBWEAK SDIO_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
SDIO_IRQHandler
|
||||
B SDIO_IRQHandler
|
||||
|
||||
PUBWEAK USBDMA_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
USBDMA_IRQHandler
|
||||
B USBDMA_IRQHandler
|
||||
|
||||
PUBWEAK USB_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
USB_IRQHandler
|
||||
B USB_IRQHandler
|
||||
|
||||
PUBWEAK GPIO_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
GPIO_IRQHandler
|
||||
B GPIO_IRQHandler
|
||||
|
||||
PUBWEAK TIMER0_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
TIMER0_IRQHandler
|
||||
B TIMER0_IRQHandler
|
||||
|
||||
PUBWEAK UART0_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
UART0_IRQHandler
|
||||
B UART0_IRQHandler
|
||||
|
||||
PUBWEAK MACHW_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
MACHW_IRQHandler
|
||||
B MACHW_IRQHandler
|
||||
|
||||
PUBWEAK UART1_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
UART1_IRQHandler
|
||||
B UART1_IRQHandler
|
||||
|
||||
PUBWEAK AHBDMA_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
AHBDMA_IRQHandler
|
||||
B AHBDMA_IRQHandler
|
||||
|
||||
PUBWEAK PSRAM_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
PSRAM_IRQHandler
|
||||
B PSRAM_IRQHandler
|
||||
|
||||
PUBWEAK SDMMC_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
SDMMC_IRQHandler
|
||||
B SDMMC_IRQHandler
|
||||
|
||||
PUBWEAK EXIF_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
EXIF_IRQHandler
|
||||
B EXIF_IRQHandler
|
||||
|
||||
PUBWEAK I2C_IRQHandler
|
||||
SECTION .text:CODE:NOROOT:REORDER(1)
|
||||
I2C_IRQHandler
|
||||
B I2C_IRQHandler
|
||||
|
||||
END
|
|
@ -0,0 +1,13 @@
|
|||
/* mbed Microcontroller Library - CMSIS
|
||||
* Copyright (C) 2009-2018 ARM Limited. All rights reserved.
|
||||
*
|
||||
* A generic CMSIS include header
|
||||
*/
|
||||
|
||||
#ifndef MBED_CMSIS_H
|
||||
#define MBED_CMSIS_H
|
||||
|
||||
#include "RDA5991H.h"
|
||||
#include "cmsis_nvic.h"
|
||||
|
||||
#endif
|
|
@ -0,0 +1,40 @@
|
|||
/* mbed Microcontroller Library
|
||||
* CMSIS-style functionality to support dynamic vectors
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2018 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.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef MBED_CMSIS_NVIC_H
|
||||
#define MBED_CMSIS_NVIC_H
|
||||
|
||||
#include "cmsis.h"
|
||||
|
||||
#define NVIC_NUM_VECTORS (16 + 15)
|
||||
#define NVIC_RAM_VECTOR_ADDRESS (RDA_IRAM_BASE)
|
||||
|
||||
#endif
|
|
@ -0,0 +1,188 @@
|
|||
/**************************************************************************//**
|
||||
* @file system_RDA5991H.c
|
||||
* @brief CMSIS Cortex-M4 Device System Source File for
|
||||
* RDA RDA5991H Device Series
|
||||
* @version V1.11
|
||||
* @date 12. June 2018
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2009-2016 ARM Limited. All rights reserved.
|
||||
*
|
||||
* @par
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* @par
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
#include "RDA5991H.h"
|
||||
|
||||
|
||||
/** @addtogroup RDA5991H_System
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*
|
||||
//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
|
||||
*/
|
||||
|
||||
/*--------------------- Clock Configuration ----------------------------------
|
||||
//
|
||||
// <e> Clock Configuration
|
||||
// <h> Clock Gating Control 0 Register (CLKGATE0)
|
||||
// <o1.0> DEEPSLEEP: Deep sleep mode enable
|
||||
// <o1.15> EXIF: EXIF clock gating enable
|
||||
// </h>
|
||||
//
|
||||
// <h> Clock Gating Control 1 Register (CLKGATE1)
|
||||
// <o2.0> GPIO: GPIO clock gating enable
|
||||
// <o2.1> I2S: I2S clock gating enable
|
||||
// <o2.2> PWM: PWM clock gating enable
|
||||
// <o2.3> TIMER: APB Timer clock gating enable
|
||||
// <o2.4> PSRAM_PCLK: PSRAM PCLK clock gating enable
|
||||
// <o2.5> SDMMC: SDMMC clock gating enable
|
||||
// <o2.6> I2C: I2C clock gating enable
|
||||
// <o2.4> PSRAM_HCLK: PSRAM HCLK clock gating enable
|
||||
// </h>
|
||||
//
|
||||
// <h> Clock Gating Control 2 Register (CLKGATE2)
|
||||
// <o3.16> I2SIN: I2SIN clock gating enable
|
||||
// <o3.17> I2SOUT: I2SOUT clock gating enable
|
||||
// <o3.18> GSPI: General SPI clock gating enable
|
||||
// <o3.19> RFSPI: RF SPI clock gating enable
|
||||
// <o3.31> SLOWFLASH: Slow flash clock gating enable
|
||||
// </h>
|
||||
//
|
||||
// <h> Clock Gating Control 3 Register (CLKGATE3)
|
||||
// <o4.30> DOZEMODE: Doze mode enable
|
||||
// <o4.31> CLKMODE: Clock mode enable
|
||||
// </h>
|
||||
//
|
||||
// <h> Clock Core Configure Register (CORECFG)
|
||||
// <o5.11> HCLK: HCLK config
|
||||
// <o5.12..13> CPUCLK: CPU Clock config
|
||||
// </h>
|
||||
//
|
||||
// </e>
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/** @addtogroup RDA5991H_System_Defines RDA5991H System Defines
|
||||
@{
|
||||
*/
|
||||
|
||||
/*
|
||||
//-------- <<< end of configuration section >>> ------------------------------
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
DEFINES
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
Define clocks
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define RDA_SYS_CLK_FREQUENCY_40M ( 40000000UL)
|
||||
#define RDA_SYS_CLK_FREQUENCY_80M ( 80000000UL)
|
||||
#define RDA_SYS_CLK_FREQUENCY_160M (160000000UL)
|
||||
#define RDA_BUS_CLK_FREQUENCY_40M ( 40000000UL)
|
||||
#define RDA_BUS_CLK_FREQUENCY_80M ( 80000000UL)
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/** @addtogroup RDA5991H_System_Public_Variables RDA5991H System Public Variables
|
||||
@{
|
||||
*/
|
||||
/*----------------------------------------------------------------------------
|
||||
Clock Variable definitions
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint32_t SystemCoreClock = RDA_SYS_CLK_FREQUENCY_160M; /*!< System Clock Frequency (Core Clock)*/
|
||||
uint32_t AHBBusClock = RDA_BUS_CLK_FREQUENCY_80M; /*!< AHB Bus Clock Frequency (Bus Clock)*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/** @addtogroup RDA5991H_System_Public_Functions RDA5991H System Public Functions
|
||||
@{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Update SystemCoreClock variable
|
||||
*
|
||||
* @param none
|
||||
* @return none
|
||||
*
|
||||
* @brief Updates the SystemCoreClock with current core Clock
|
||||
* retrieved from cpu registers.
|
||||
*/
|
||||
void SystemCoreClockUpdate (void) /* Get Core/Bus Clock Frequency */
|
||||
{
|
||||
uint32_t val = RDA_SCU->CORECFG;
|
||||
/* Determine clock frequency according to SCU core config register values */
|
||||
switch ((val >> 12) & 0x03UL) {
|
||||
case 0:
|
||||
SystemCoreClock = RDA_SYS_CLK_FREQUENCY_40M;
|
||||
break;
|
||||
case 1:
|
||||
SystemCoreClock = RDA_SYS_CLK_FREQUENCY_80M;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
SystemCoreClock = RDA_SYS_CLK_FREQUENCY_160M;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Determine clock frequency according to SCU core config register values */
|
||||
switch ((val >> 11) & 0x01UL) {
|
||||
case 0:
|
||||
AHBBusClock = RDA_BUS_CLK_FREQUENCY_40M;
|
||||
break;
|
||||
case 1:
|
||||
AHBBusClock = RDA_BUS_CLK_FREQUENCY_80M;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the system
|
||||
*
|
||||
* @param none
|
||||
* @return none
|
||||
*
|
||||
* @brief Setup the microcontroller system.
|
||||
* Initialize the System.
|
||||
*/
|
||||
void SystemInit (void)
|
||||
{
|
||||
#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
|
||||
SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access */
|
||||
#endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */
|
||||
SCB->VTOR = RDA_CODE_BASE; /* vector table in flash */
|
||||
NVIC_SetPriorityGrouping(0x06); /* 1 bit for pre-emption pri */
|
||||
|
||||
__enable_irq();
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
|
@ -0,0 +1,61 @@
|
|||
/******************************************************************************
|
||||
* @file: system_RDA5991H.h
|
||||
* @purpose: CMSIS Cortex-M4 Device Peripheral Access Layer Header File
|
||||
* for the RDA RDA5991H Device Series
|
||||
* @version: V1.02
|
||||
* @date: 07. June 2018
|
||||
*----------------------------------------------------------------------------
|
||||
*
|
||||
* Copyright (C) 2009 ARM Limited. All rights reserved.
|
||||
*
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M3
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef __SYSTEM_RDA5991H_H
|
||||
#define __SYSTEM_RDA5991H_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */
|
||||
extern uint32_t AHBBusClock; /*!< AHB Bus Clock Frequency (Bus 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);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __SYSTEM_RDA5991H_H */
|
|
@ -0,0 +1,80 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2018 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.
|
||||
*/
|
||||
|
||||
#include "flash_api.h"
|
||||
#include "flash_data.h"
|
||||
#include "mbed_critical.h"
|
||||
|
||||
// This file is automagically generated
|
||||
|
||||
// This is a flash algo binary blob. It is PIC (position independent code) that should be stored in RAM
|
||||
static uint32_t FLASH_ALGO[] = {
|
||||
0x4df0e92d, 0x4180f04f, 0x68082400, 0xea322203, 0xbf1c62d0, 0x50c0f040, 0x49cc6008, 0xf0106808,
|
||||
0xd1100f40, 0x00c0f040, 0x03086008, 0x68486088, 0x0001f040, 0x20006048, 0x28081c40, 0x6848d3fc,
|
||||
0x0f01f010, 0x4dc2d1fb, 0x0835f04f, 0x8000f8c5, 0x1c402000, 0xd3fc2808, 0xf01068e8, 0xd1fb0f01,
|
||||
0xf0106928, 0xd17b0f02, 0x6c704eba, 0x007cf420, 0x1010f440, 0x68b06470, 0x2040f440, 0x209f60b0,
|
||||
0x20006028, 0x28081c40, 0x68e8d3fc, 0x0f01f010, 0x6928d1fb, 0x69286929, 0x2102b2ca, 0xf04f2705,
|
||||
0xf04f0a00, 0x2a400b01, 0xb2c0d123, 0xd9202815, 0xf36f6868, 0xf4402010, 0x60687080, 0xf00060a9,
|
||||
0x2031f92b, 0x20006028, 0x28081c40, 0x68e8d3fc, 0x0f01f010, 0x602fd1fb, 0x1c402000, 0xd3fc2808,
|
||||
0xf01068e8, 0xd1fb0f01, 0xf0106928, 0xd1f20f01, 0x6868e021, 0x2010f36f, 0x7000f440, 0xf8c56068,
|
||||
0x60a9a008, 0xf908f000, 0xb000f8c5, 0x1c402000, 0xd3fc2808, 0xf01068e8, 0xd1fb0f01, 0x2000602f,
|
||||
0x28081c40, 0x68e8d3fc, 0x0f01f010, 0x6928d1fb, 0x0f01f010, 0x4a88d1f2, 0x444a2100, 0x8000f8c5,
|
||||
0x1c402000, 0xd3fc2808, 0xf01068e8, 0xd1fb0f01, 0x1c496928, 0x6f80f5b1, 0x2401d303, 0xa000f882,
|
||||
0xf010e00d, 0xd0e90f02, 0x6968b94c, 0x0001f040, 0x6c706168, 0x00d8f440, 0xf8826470, 0x4620b000,
|
||||
0x8df0e8bd, 0x47702000, 0x47702000, 0xf000b510, 0x496ff8c3, 0x60082060, 0x1c402000, 0xd3fc2808,
|
||||
0xf01068c8, 0xd1fb0f01, 0x600a2205, 0x1c402000, 0xd3fc2808, 0xf01068c8, 0xd1fb0f01, 0xf0106908,
|
||||
0xd1f20f01, 0x68484961, 0x0001f040, 0x20006048, 0x28081c40, 0x6848d3fc, 0x0001f010, 0xbd10d1fb,
|
||||
0x4604b510, 0xf898f000, 0x20204959, 0x2004ea40, 0x20006008, 0x28081c40, 0x68c8d3fc, 0x0f01f010,
|
||||
0x2205d1fb, 0x2000600a, 0x28081c40, 0x68c8d3fc, 0x0f01f010, 0x6908d1fb, 0x0f01f010, 0x494bd1f2,
|
||||
0xf0406848, 0x60480001, 0x1c402000, 0xd3fc2808, 0xf0106848, 0xd1fb0001, 0xe92dbd10, 0xf02005f0,
|
||||
0x4845437c, 0x78004448, 0xbf142800, 0x24022432, 0x2c11ea5f, 0x68684d3e, 0x2010f36f, 0x3080f440,
|
||||
0xf04f6068, 0xbf1c0100, 0x26052706, 0xf04fd042, 0x20000800, 0xa000f812, 0xa008f8c5, 0x28041c40,
|
||||
0x1d12dbf8, 0x0801f108, 0x0f40f1b8, 0x602fdbf1, 0x1c402000, 0xd3fc2808, 0xf01068e8, 0xd1fb0f01,
|
||||
0x2000602e, 0x28081c40, 0x68e8d3fc, 0x0f01f010, 0x6928d1fb, 0x0f02f010, 0xea44d0f2, 0x60282003,
|
||||
0xf5032000, 0x1c407380, 0xd3fc2808, 0xf01068e8, 0xd1fb0f01, 0x2000602e, 0x28081c40, 0x68e8d3fc,
|
||||
0x0f01f010, 0x6928d1fb, 0x0f01f010, 0x1c49d1f2, 0xd3bc4561, 0x68484915, 0x0001f040, 0x20006048,
|
||||
0x28081c40, 0x6848d3fc, 0x0001f010, 0xe8bdd1fb, 0x477005f0, 0x47704408, 0x2006490d, 0x20006008,
|
||||
0x28081c40, 0x68c8d3fc, 0x0f01f010, 0x2205d1fb, 0x2000600a, 0x28081c40, 0x68c8d3fc, 0x0f01f010,
|
||||
0x6908d1fb, 0x0f02f010, 0x4770d0f2, 0x40014000, 0x17fff000, 0x40001000, 0x00000004, 0x00000000,
|
||||
0x00000000
|
||||
};
|
||||
|
||||
static const flash_algo_t flash_algo_config = {
|
||||
.init = 0x1,
|
||||
.uninit = 0x185,
|
||||
.erase_sector = 0x1e1,
|
||||
.program_page = 0x23b,
|
||||
.static_base = 0x35c,
|
||||
.algo_blob = FLASH_ALGO
|
||||
};
|
||||
|
||||
static const sector_info_t sectors_info[] = {
|
||||
{0x18000000, 0x1000},
|
||||
};
|
||||
|
||||
static const flash_target_config_t flash_target_config = {
|
||||
.page_size = 0x100,
|
||||
.flash_start = 0x18000000,
|
||||
.flash_size = 0x100000,
|
||||
.sectors = sectors_info,
|
||||
.sector_info_count = sizeof(sectors_info) / sizeof(sector_info_t)
|
||||
};
|
||||
|
||||
void flash_set_target_config(flash_t *obj)
|
||||
{
|
||||
obj->flash_algo = &flash_algo_config;
|
||||
obj->target_config = &flash_target_config;
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include "mbed_assert.h"
|
||||
#include "gpio_api.h"
|
||||
#include "pinmap.h"
|
||||
#include "rda_ccfg_api.h"
|
||||
|
||||
#define GPIO_PIN_NUM 28
|
||||
|
||||
static const PinMap PinMap_GPIO[] = {
|
||||
{PB_0, (GPIO_0 | 0), 0},
|
||||
{PB_1, (GPIO_0 | 1), 0},
|
||||
{PB_2, (GPIO_0 | 2), 0},
|
||||
{PB_3, (GPIO_0 | 3), 0},
|
||||
{PB_4, (GPIO_0 | 4), 0},
|
||||
{PB_5, (GPIO_0 | 5), 0},
|
||||
{PB_6, (GPIO_0 | 6), 0},
|
||||
{PB_7, (GPIO_0 | 7), 0},
|
||||
{PB_8, (GPIO_0 | 8), 0},
|
||||
{PB_9, (GPIO_0 | 9), 0},
|
||||
{PA_8, (GPIO_0 | 10), 0},
|
||||
{PA_9, (GPIO_0 | 11), 0},
|
||||
{PC_0, (GPIO_0 | 12), 1},
|
||||
{PC_1, (GPIO_0 | 13), 1},
|
||||
{PC_2, (GPIO_0 | 14), 0},
|
||||
{PC_3, (GPIO_0 | 15), 0},
|
||||
{PC_4, (GPIO_0 | 16), 0},
|
||||
{PC_5, (GPIO_0 | 17), 0},
|
||||
{PC_6, (GPIO_0 | 18), 0},
|
||||
{PC_7, (GPIO_0 | 19), 0},
|
||||
{PC_8, (GPIO_0 | 20), 0},
|
||||
{PC_9, (GPIO_0 | 21), 0},
|
||||
{PD_0, (GPIO_0 | 22), 0},
|
||||
{PD_1, (GPIO_0 | 23), 0},
|
||||
{PD_2, (GPIO_0 | 24), 0},
|
||||
{PD_3, (GPIO_0 | 25), 0},
|
||||
{PA_0, (GPIO_0 | 26), 1},
|
||||
{PA_1, (GPIO_0 | 27), 1},
|
||||
{PA_2, (GPIO_0 | 14), 1},
|
||||
{PA_3, (GPIO_0 | 15), 1},
|
||||
{PA_4, (GPIO_0 | 16), 1},
|
||||
{PA_5, (GPIO_0 | 17), 1},
|
||||
{PA_6, (GPIO_0 | 18), 1},
|
||||
{PA_7, (GPIO_0 | 19), 1},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
#define PER_BITBAND_ADDR(reg, bit) (uint32_t *)(RDA_PERBTBND_BASE + (((uint32_t)(reg)-RDA_PER_BASE)<<5U) + (((uint32_t)(bit))<<2U))
|
||||
|
||||
PinName gpio_pinname(int pin_n)
|
||||
{
|
||||
MBED_ASSERT(pin_n < GPIO_PIN_NUM);
|
||||
return PinMap_GPIO[pin_n].pin;
|
||||
}
|
||||
|
||||
uint32_t gpio_set(PinName pin)
|
||||
{
|
||||
MBED_ASSERT(pin != (PinName)NC);
|
||||
uint32_t func = 0;
|
||||
uint32_t idx = 0;
|
||||
|
||||
func = pinmap_function(pin, PinMap_GPIO);
|
||||
idx = pinmap_peripheral(pin, PinMap_GPIO) & 0x001F;
|
||||
pin_function(pin, func);
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
void gpio_init(gpio_t *obj, PinName pin)
|
||||
{
|
||||
uint32_t gpio_idx = 0;
|
||||
|
||||
obj->pin = pin;
|
||||
if (pin == (PinName)NC)
|
||||
return;
|
||||
|
||||
gpio_idx = gpio_set(pin);
|
||||
|
||||
if ((6U <= gpio_idx) && (9U >= gpio_idx)) {
|
||||
rda_ccfg_gp((unsigned char)gpio_idx, 0x01U);
|
||||
}
|
||||
|
||||
obj->reg_out = PER_BITBAND_ADDR(&RDA_GPIO->DOUT, gpio_idx);
|
||||
obj->reg_in = PER_BITBAND_ADDR(&RDA_GPIO->DIN, gpio_idx);
|
||||
obj->reg_dir = PER_BITBAND_ADDR(&RDA_GPIO->DIR, gpio_idx);
|
||||
}
|
||||
|
||||
void gpio_mode(gpio_t *obj, PinMode mode)
|
||||
{
|
||||
pin_mode(obj->pin, mode);
|
||||
}
|
||||
|
||||
void gpio_dir(gpio_t *obj, PinDirection direction)
|
||||
{
|
||||
uint32_t dir = 0x00UL;
|
||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
||||
if (PIN_INPUT == direction) {
|
||||
dir = 0x01UL;
|
||||
}
|
||||
if (rda_ccfg_hwver() >= 5) {
|
||||
uint32_t gpio_idx = pinmap_peripheral(obj->pin, PinMap_GPIO) & 0x001F;
|
||||
/* Since U05, for gpio 2/3/8/14/15/16/17/20/21, 1'b1 means output */
|
||||
if (0x00UL != (0x0033C10CUL & (0x01UL << gpio_idx))) {
|
||||
dir ^= 0x01UL;
|
||||
}
|
||||
}
|
||||
*obj->reg_dir = dir;
|
||||
}
|
|
@ -0,0 +1,195 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include <stddef.h>
|
||||
|
||||
#include "gpio_irq_api.h"
|
||||
#include "mbed_error.h"
|
||||
#include "cmsis.h"
|
||||
|
||||
#if DEVICE_INTERRUPTIN
|
||||
#if defined(GPIO_IRQ_DEBUG)
|
||||
#include "mbed_interface.h"
|
||||
#endif /* GPIO_IRQ_DEBUG */
|
||||
|
||||
#define GPIO_PINNUM 28
|
||||
#define NONE (uint32_t)NC
|
||||
#define GPIO_INT_CTRL_REG (RDA_GPIO->INTCTRL)
|
||||
#define GPIO_INT_SEL_REG (RDA_GPIO->INTSEL)
|
||||
#define GPIO_DATA_IN_REG (RDA_GPIO->DIN)
|
||||
|
||||
typedef enum {
|
||||
GPIO_IRQ_CH0,
|
||||
GPIO_IRQ_CH1,
|
||||
CHANNEL_NUM
|
||||
} GPIO_IRQ_IDX_T;
|
||||
|
||||
static uint32_t channel_ids[CHANNEL_NUM] = {0};
|
||||
static uint32_t channel_pinidxs[CHANNEL_NUM] = {0};
|
||||
static uint8_t channel_bothedge_flag[CHANNEL_NUM] = {0};
|
||||
static gpio_irq_handler irq_handler[CHANNEL_NUM] = {NULL};
|
||||
|
||||
#if defined(GPIO_IRQ_DEBUG)
|
||||
static uint32_t exception_cntr;
|
||||
#endif /* GPIO_IRQ_DEBUG */
|
||||
|
||||
static GPIO_IRQ_IDX_T gpio_irq_ava_chidx(void)
|
||||
{
|
||||
GPIO_IRQ_IDX_T ret;
|
||||
for (ret = GPIO_IRQ_CH0; ret < CHANNEL_NUM; ret++) {
|
||||
if (0 == channel_ids[ret])
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static uint32_t gpio_irq_pinidx(PinName pin)
|
||||
{
|
||||
uint8_t idx;
|
||||
const uint32_t pinmap_gpio_irq[GPIO_PINNUM] = {
|
||||
/* GPIO 0 ~ 13 */
|
||||
PB_0, PB_1, PB_2, PB_3, PB_4, PB_5, PB_6, PB_7, PB_8, PB_9, PA_8, PA_9, PC_0, PC_1,
|
||||
/* GPIO 14 ~ 21, Not support interrupt */
|
||||
NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
|
||||
/* GPIO 22 ~ 27 */
|
||||
PD_0, PD_1, PD_2, PD_3, PA_0, PA_1
|
||||
};
|
||||
|
||||
for (idx = 0; idx < GPIO_PINNUM; idx++) {
|
||||
if (pinmap_gpio_irq[idx] == NONE) {
|
||||
continue;
|
||||
} else if (pinmap_gpio_irq[idx] == (uint32_t)pin) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (GPIO_PINNUM == idx) {
|
||||
error("The pin cannot generate interrupt");
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
static void handle_interrupt_in(void)
|
||||
{
|
||||
/* Read current interrupt register */
|
||||
uint32_t int_ctrl = GPIO_INT_CTRL_REG;
|
||||
uint32_t din_val = GPIO_DATA_IN_REG;
|
||||
uint32_t idx;
|
||||
|
||||
if (int_ctrl & (0x01UL << 16)) {
|
||||
GPIO_INT_CTRL_REG |= (0x01UL << 16);
|
||||
while (GPIO_INT_CTRL_REG & (0x01UL << 16));
|
||||
}
|
||||
for (idx = GPIO_IRQ_CH0; idx < CHANNEL_NUM; idx++) {
|
||||
if (int_ctrl & (0x01UL << (21 + idx))) {
|
||||
gpio_irq_event flagRiseFall_1, flagRiseFall_2;
|
||||
GPIO_INT_CTRL_REG |= (0x01UL << (17 + idx)); // clear int flag
|
||||
flagRiseFall_1 = (int_ctrl & (0x01UL << (2 + idx))) ? IRQ_RISE : IRQ_FALL;
|
||||
flagRiseFall_2 = (din_val & (0x01UL << channel_pinidxs[idx])) ? IRQ_RISE : IRQ_FALL;
|
||||
if (flagRiseFall_1 == flagRiseFall_2) {
|
||||
if (channel_bothedge_flag[idx]) {
|
||||
GPIO_INT_CTRL_REG ^= (0x01UL << (2 + idx));
|
||||
}
|
||||
irq_handler[idx](channel_ids[idx], flagRiseFall_1);
|
||||
#if defined(GPIO_IRQ_DEBUG)
|
||||
exception_cntr = 0;
|
||||
#endif /* GPIO_IRQ_DEBUG */
|
||||
}
|
||||
#if defined(GPIO_IRQ_DEBUG)
|
||||
else {
|
||||
exception_cntr++;
|
||||
if (exception_cntr >= 2) {
|
||||
exception_cntr = 0;
|
||||
mbed_error_printf("invalid gpio irq: %d,%d\r\n", (int)flagRiseFall_1, (int)flagRiseFall_2);
|
||||
}
|
||||
}
|
||||
#endif /* GPIO_IRQ_DEBUG */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
|
||||
{
|
||||
uint32_t regval;
|
||||
|
||||
if (pin == NC) return -1;
|
||||
|
||||
obj->ch = (uint16_t)gpio_irq_ava_chidx();
|
||||
MBED_ASSERT(CHANNEL_NUM != obj->ch);
|
||||
|
||||
irq_handler[obj->ch] = handler;
|
||||
|
||||
channel_ids[obj->ch] = id;
|
||||
channel_pinidxs[obj->ch] = gpio_irq_pinidx(pin);
|
||||
|
||||
regval = RDA_GPIO->INTSEL & ~(0x3FFUL << 10);
|
||||
RDA_GPIO->INTSEL = regval | (0x3FFUL << 10);
|
||||
|
||||
NVIC_SetVector(GPIO_IRQn, (uint32_t)handle_interrupt_in);
|
||||
NVIC_SetPriority(GPIO_IRQn, 0x1FUL);
|
||||
NVIC_EnableIRQ(GPIO_IRQn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 reg_val;
|
||||
uint16_t intEn;
|
||||
MBED_ASSERT(1 >= obj->ch);
|
||||
|
||||
if (IRQ_RISE == event) {
|
||||
obj->flagR = (uint8_t)enable;
|
||||
} else {
|
||||
obj->flagF = (uint8_t)enable;
|
||||
}
|
||||
if (obj->flagR && obj->flagF)
|
||||
channel_bothedge_flag[obj->ch] = 1U;
|
||||
else
|
||||
channel_bothedge_flag[obj->ch] = 0U;
|
||||
if (obj->flagR || obj->flagF)
|
||||
intEn = 1;
|
||||
else
|
||||
intEn = 0;
|
||||
|
||||
if (0 == intEn) {
|
||||
GPIO_INT_CTRL_REG &= ~(0x01UL << (6 + obj->ch));
|
||||
} else {
|
||||
/* Set interrupt select reg */
|
||||
reg_val = GPIO_INT_SEL_REG & ~(0x1FUL << (5 * obj->ch));
|
||||
GPIO_INT_SEL_REG = reg_val | ((0x1FUL & ((channel_pinidxs[obj->ch] >= 22) ? (channel_pinidxs[obj->ch] - 8) : channel_pinidxs[obj->ch])) << (5 * obj->ch));
|
||||
|
||||
/* Set interrupt control reg */
|
||||
reg_val = GPIO_INT_CTRL_REG & ~(0x01UL << (2 + obj->ch));
|
||||
GPIO_INT_CTRL_REG = reg_val | (((0U == channel_bothedge_flag[obj->ch]) && (1U == obj->flagR)) ? (0x01UL << (2 + obj->ch)) : (0x00UL))
|
||||
| (0x01UL << (6 + obj->ch));
|
||||
}
|
||||
}
|
||||
|
||||
void gpio_irq_enable(gpio_irq_t *obj)
|
||||
{
|
||||
NVIC_EnableIRQ(GPIO_IRQn);
|
||||
}
|
||||
|
||||
void gpio_irq_disable(gpio_irq_t *obj)
|
||||
{
|
||||
NVIC_DisableIRQ(GPIO_IRQn);
|
||||
}
|
||||
|
||||
#endif /* DEVICE_INTERRUPTIN */
|
|
@ -0,0 +1,53 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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;
|
||||
__IO uint32_t *reg_out;
|
||||
__I uint32_t *reg_in;
|
||||
__IO uint32_t *reg_dir;
|
||||
} gpio_t;
|
||||
|
||||
static inline void gpio_write(gpio_t *obj, int value)
|
||||
{
|
||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
||||
*obj->reg_out = ((value) ? 1 : 0);
|
||||
}
|
||||
|
||||
static inline int gpio_read(gpio_t *obj)
|
||||
{
|
||||
MBED_ASSERT(obj->pin != (PinName)NC);
|
||||
return ((*obj->reg_in) ? 1 : 0);
|
||||
}
|
||||
|
||||
static inline int gpio_is_connected(const gpio_t *obj)
|
||||
{
|
||||
return obj->pin != (PinName)NC;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,49 @@
|
|||
Permissive Binary License
|
||||
|
||||
Version 1.0, September 2018
|
||||
|
||||
Redistribution. Redistribution and use in binary form, without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1) Redistributions must reproduce the above copyright notice and the
|
||||
following disclaimer in the documentation and/or other materials
|
||||
provided with the distribution.
|
||||
|
||||
2) Unless to the extent explicitly permitted by law, no reverse
|
||||
engineering, decompilation, or disassembly of this software is
|
||||
permitted.
|
||||
|
||||
3) Redistribution as part of a software development kit must include the
|
||||
accompanying file named “DEPENDENCIES” and any dependencies listed in
|
||||
that file.
|
||||
|
||||
4) Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
Limited patent license. The copyright holders (and contributors) grant a
|
||||
worldwide, non-exclusive, no-charge, royalty-free patent license to
|
||||
make, have made, use, offer to sell, sell, import, and otherwise
|
||||
transfer this software, where such license applies only to those patent
|
||||
claims licensable by the copyright holders (and contributors) that are
|
||||
necessarily infringed by this software. This patent license shall not
|
||||
apply to any combinations that include this software. No hardware is
|
||||
licensed hereunder.
|
||||
|
||||
If you institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the software
|
||||
itself infringes your patent(s), then your rights granted under this
|
||||
license shall terminate as of the date such litigation is filed.
|
||||
|
||||
DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
CONTRIBUTORS "AS IS." 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
|
||||
HOLDERS 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.
|
|
@ -0,0 +1,7 @@
|
|||
This directory tree contains binaries build from RDA SDK modified for Mbed OS and released under Permissive Binary License.
|
||||
|
||||
libhal files in the subfolders are generated with toolchains:
|
||||
|
||||
Arm Compiler 5 - version 5.06u1
|
||||
GNU Arm Embedded - version 6.3.1
|
||||
IAR EWARM - version 7.80.2
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,27 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include "cmsis.h"
|
||||
#include "mbed_error.h"
|
||||
#include "rda_ccfg_api.h"
|
||||
|
||||
extern void sleep_cal_lpo(unsigned int calms);
|
||||
|
||||
/* This function is called after RAM initialization and before main. */
|
||||
void mbed_sdk_init(void)
|
||||
{
|
||||
/* Update the SystemCoreClock variable. */
|
||||
SystemCoreClockUpdate();
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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_OBJECTS_H
|
||||
#define MBED_OBJECTS_H
|
||||
|
||||
#include "cmsis.h"
|
||||
#include "PortNames.h"
|
||||
#include "PeripheralNames.h"
|
||||
#include "PinNames.h"
|
||||
#include "gpio_object.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct gpio_irq_s {
|
||||
uint16_t ch;
|
||||
uint8_t flagR;
|
||||
uint8_t flagF;
|
||||
};
|
||||
|
||||
struct port_s {
|
||||
PortName port;
|
||||
uint32_t mask;
|
||||
__IO uint32_t *reg_out;
|
||||
__I uint32_t *reg_in;
|
||||
__IO uint32_t *reg_dir;
|
||||
};
|
||||
|
||||
struct pwmout_s {
|
||||
uint32_t channel;
|
||||
uint32_t *base_clk_ptr;
|
||||
uint32_t period_ticks;
|
||||
uint32_t pulsewidth_ticks;
|
||||
uint32_t period_ticks_max;
|
||||
uint32_t period_ticks_min;
|
||||
PinName pin;
|
||||
__IO uint32_t *CFGR;
|
||||
};
|
||||
|
||||
struct serial_s {
|
||||
RDA_UART_TypeDef *uart;
|
||||
int index;
|
||||
};
|
||||
|
||||
struct i2s_s {
|
||||
RDA_I2S_TypeDef *i2s;
|
||||
};
|
||||
|
||||
struct wdt_s {
|
||||
RDA_WDT_TypeDef *wdt;
|
||||
};
|
||||
|
||||
struct analogin_s {
|
||||
ADCName adc;
|
||||
};
|
||||
|
||||
struct gpadc_s {
|
||||
GPADCName ch;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
#if 0
|
||||
struct dac_s {
|
||||
DACName dac;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct i2c_s {
|
||||
RDA_I2C0_TypeDef *i2c;
|
||||
};
|
||||
|
||||
struct spi_s {
|
||||
RDA_SPI_TypeDef *spi;
|
||||
uint8_t bit_ofst[2];
|
||||
};
|
||||
|
||||
struct trng_s {
|
||||
uint8_t dma_clk_flag;
|
||||
uint8_t byte_idx;
|
||||
uint32_t trng_data0;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,62 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include "mbed_assert.h"
|
||||
#include "pinmap.h"
|
||||
#include "mbed_error.h"
|
||||
#include "rda_ccfg_api.h"
|
||||
|
||||
void pin_function(PinName pin, int function)
|
||||
{
|
||||
int index = pin >> PORT_SHIFT;
|
||||
int raw_ofst = pin & 0x00FF;
|
||||
int offset;
|
||||
|
||||
MBED_ASSERT(pin != (PinName)NC);
|
||||
|
||||
switch (index) {
|
||||
case 1:
|
||||
if ((8 == raw_ofst) && (rda_ccfg_hwver() >= 5)) {
|
||||
function ^= 0x01;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (1 < raw_ofst) {
|
||||
offset = raw_ofst << 1;
|
||||
RDA_PINCFG->MODE2 &= ~(0x03UL << offset);
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (2 > raw_ofst) {
|
||||
offset = (raw_ofst << 1) + 20;
|
||||
RDA_PINCFG->MODE2 &= ~(0x03UL << offset);
|
||||
} else {
|
||||
offset = (raw_ofst << 1) - 4;
|
||||
RDA_PINCFG->MODE3 &= ~(0x03UL << offset);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
offset = raw_ofst * 3;
|
||||
RDA_PINCFG->IOMUXCTRL[index] &= ~(0x07UL << offset);
|
||||
RDA_PINCFG->IOMUXCTRL[index] |= ((function & 0x07UL) << offset);
|
||||
}
|
||||
|
||||
void pin_mode(PinName pin, PinMode mode)
|
||||
{
|
||||
MBED_ASSERT(pin != (PinName)NC);
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include "port_api.h"
|
||||
#include "pinmap.h"
|
||||
#include "gpio_api.h"
|
||||
|
||||
extern PinName gpio_pinname(int pin_n);
|
||||
|
||||
PinName port_pin(PortName port, int pin_n)
|
||||
{
|
||||
return (PinName)((port << PORT_SHIFT) | pin_n);
|
||||
}
|
||||
|
||||
void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
obj->port = port;
|
||||
obj->mask = mask;
|
||||
|
||||
obj->reg_out = &RDA_GPIO->DOUT;
|
||||
obj->reg_in = &RDA_GPIO->DIN;
|
||||
obj->reg_dir = &RDA_GPIO->DIR;
|
||||
|
||||
// The mode is set per pin: reuse gpio logic
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (obj->mask & (1 << i)) {
|
||||
// For RDA5991H, port0,1,4,5 is about IOMUX, not GPIO number, cannot use port_pin here
|
||||
//gpio_set(port_pin(obj->port, i));
|
||||
gpio_set(gpio_pinname(i));
|
||||
}
|
||||
}
|
||||
|
||||
port_dir(obj, dir);
|
||||
}
|
||||
|
||||
void port_mode(port_t *obj, PinMode mode)
|
||||
{
|
||||
uint32_t i;
|
||||
// The mode is set per pin: reuse pinmap logic
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (obj->mask & (1 <<i )) {
|
||||
pin_mode(port_pin(obj->port, i), mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void port_write(port_t *obj, int value)
|
||||
{
|
||||
*obj->reg_out = (*obj->reg_out & ~obj->mask) | (value & obj->mask);
|
||||
}
|
||||
|
||||
int port_read(port_t *obj)
|
||||
{
|
||||
return (*obj->reg_in & obj->mask);
|
||||
}
|
|
@ -0,0 +1,394 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#if DEVICE_PWMOUT
|
||||
#include "mbed_assert.h"
|
||||
#include "pwmout_api.h"
|
||||
#include "gpio_api.h"
|
||||
#include "cmsis.h"
|
||||
#include "pinmap.h"
|
||||
#include "mbed_interface.h"
|
||||
|
||||
#define PWM_CLK_SRC_20MHZ (20000000)
|
||||
#define PWM_CLK_SRC_32KHZ (32768)
|
||||
#define PWM_CLK_IDX_NUM (3)
|
||||
|
||||
#define PWM_CLKGATE_REG (RDA_SCU->CLKGATE1)
|
||||
#define PWM_CLKSRC_REG (RDA_SCU->PWMCFG)
|
||||
#define PWM_CLKDIV_REG (RDA_PWM->CLKR)
|
||||
#define EXIF_PWM_EN_REG (RDA_EXIF->MISCCFG)
|
||||
|
||||
/* PORT ID, PWM ID, Pin function */
|
||||
static const PinMap PinMap_PWM[] = {
|
||||
{PA_0, PWM_6, 4},
|
||||
{PA_1, PWM_3, 4},
|
||||
{PB_0, PWM_2, 4},
|
||||
{PB_1, PWM_7, 4},
|
||||
{PB_2, PWM_5, 4},
|
||||
{PB_3, PWM_4, 4},
|
||||
{PB_8, PWM_0, 4},
|
||||
{PC_1, PWM_1, 5},
|
||||
{PD_0, PWM_0, 4},
|
||||
{PD_1, PWM_1, 4},
|
||||
{PD_2, PWM_2, 4},
|
||||
{PD_3, PWM_3, 4},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
__IO uint32_t *PWM_MATCH[] = {
|
||||
&(RDA_EXIF->PWM0CFG),
|
||||
&(RDA_EXIF->PWM1CFG),
|
||||
&(RDA_EXIF->PWM2CFG),
|
||||
&(RDA_EXIF->PWM3CFG),
|
||||
&( RDA_PWM->PWTCFG ),
|
||||
&( RDA_PWM->LPGCFG ),
|
||||
&( RDA_PWM->PWL0CFG),
|
||||
&( RDA_PWM->PWL1CFG)
|
||||
};
|
||||
|
||||
static uint32_t BaseClk_PWM[PWM_CLK_IDX_NUM] = {0UL};
|
||||
|
||||
static uint8_t is_pwmout_started(pwmout_t* obj);
|
||||
static void pwmout_start(pwmout_t* obj);
|
||||
static void pwmout_stop(pwmout_t* obj);
|
||||
static void pwmout_update_cfgreg(pwmout_t* obj);
|
||||
|
||||
void pwmout_clk_set(pwmout_t *obj, int src, int div)
|
||||
{
|
||||
uint32_t reg_val = 0UL;
|
||||
uint32_t clk_idx = 0UL, clk_hz = PWM_CLK_SRC_32KHZ >> 1;
|
||||
PWMName pwm = (PWMName)(obj->channel);
|
||||
uint32_t divider = (uint32_t)div;
|
||||
|
||||
MBED_ASSERT(PWM_7 >= pwm);
|
||||
if (PWM_5 == pwm) {
|
||||
clk_idx = 1;
|
||||
} else if (PWM_6 <= pwm) {
|
||||
clk_idx = 2;
|
||||
}
|
||||
if (divider > 0x80UL) { // max divider is 128
|
||||
divider = 0x80UL;
|
||||
}
|
||||
reg_val = PWM_CLKSRC_REG & ~((0x00FFUL << (clk_idx * 8)) | (0x01UL << (24 + clk_idx)));
|
||||
if (src) {
|
||||
reg_val |= (0x01UL << (7 + (clk_idx * 8)));
|
||||
clk_hz = PWM_CLK_SRC_20MHZ >> 1;
|
||||
}
|
||||
if (divider) {
|
||||
reg_val |= ((divider - 0x01UL) << (clk_idx * 8));
|
||||
BaseClk_PWM[clk_idx] = clk_hz / divider;
|
||||
} else {
|
||||
BaseClk_PWM[clk_idx] = clk_hz;
|
||||
}
|
||||
PWM_CLKSRC_REG = reg_val | (0x01UL << (24 + clk_idx));
|
||||
}
|
||||
|
||||
void pwmout_init(pwmout_t* obj, PinName pin)
|
||||
{
|
||||
/* determine the channel */
|
||||
PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
|
||||
MBED_ASSERT(pwm != (PWMName)NC);
|
||||
|
||||
obj->channel = pwm;
|
||||
obj->CFGR = PWM_MATCH[pwm];
|
||||
obj->pin = pin;
|
||||
|
||||
/* Enable PWM Clock-gating */
|
||||
PWM_CLKGATE_REG |= (0x01UL << 2);
|
||||
|
||||
/* Init PWM clock source and divider */
|
||||
if (PWM_4 >= pwm) {
|
||||
/* default to 20MHz / 2 */
|
||||
pwmout_clk_set(obj, 1, 0);
|
||||
if (PWM_4 == pwm) {
|
||||
obj->period_ticks_max = 0x1FF8UL;
|
||||
obj->period_ticks_min = 0x0008UL;
|
||||
} else {
|
||||
obj->period_ticks_max = 0x20000UL;
|
||||
obj->period_ticks_min = 0x00002UL;
|
||||
}
|
||||
obj->base_clk_ptr = &(BaseClk_PWM[0]);
|
||||
} else if (PWM_5 == pwm) {
|
||||
/* default to 32KHz / 2 */
|
||||
pwmout_clk_set(obj, 0, 0);
|
||||
obj->period_ticks_max = 0x7000UL;
|
||||
obj->period_ticks_min = 0x0800UL;
|
||||
obj->base_clk_ptr = &(BaseClk_PWM[1]);
|
||||
} else {
|
||||
/* default to 20MHz / 2 */
|
||||
pwmout_clk_set(obj, 1, 0);
|
||||
//do not need to div
|
||||
obj->period_ticks_max = 0x0FFUL; // TBD
|
||||
obj->period_ticks_min = 0x001UL;
|
||||
obj->base_clk_ptr = &(BaseClk_PWM[2]);
|
||||
}
|
||||
|
||||
// default to half of max period
|
||||
if (PWM_5 >= pwm) {
|
||||
pwmout_period_us(obj, (obj->period_ticks_max * 1e6) / (*(obj->base_clk_ptr)) / 2);
|
||||
}
|
||||
//PWM6 PWM7 has no period
|
||||
pwmout_write (obj, 0.5f);
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_PWM);
|
||||
}
|
||||
|
||||
void pwmout_free(pwmout_t* obj)
|
||||
{
|
||||
/* Disable PWM Clock-gating */
|
||||
PWM_CLKGATE_REG &= ~(0x01UL << 2);
|
||||
}
|
||||
|
||||
void pwmout_write(pwmout_t* obj, float value)
|
||||
{
|
||||
uint32_t ticks;
|
||||
|
||||
/* Check if already started */
|
||||
if (is_pwmout_started(obj))
|
||||
pwmout_stop(obj);
|
||||
|
||||
if (value < 0.0f) {
|
||||
value = 0.0;
|
||||
} else if (value > 1.0f) {
|
||||
value = 1.0;
|
||||
}
|
||||
|
||||
/* Set channel match to percentage */
|
||||
if (PWM_5 >= (PWMName)obj->channel) {
|
||||
ticks = (uint32_t)((float)(obj->period_ticks) * value);
|
||||
}
|
||||
else if (PWM_6 <= (PWMName)obj->channel) {
|
||||
obj->period_ticks = 0xFF;
|
||||
ticks = (uint32_t)((float)(obj->period_ticks) * value);
|
||||
}
|
||||
if (0 == ticks) {
|
||||
obj->pulsewidth_ticks = 0;
|
||||
} else {
|
||||
/* Update Hw reg */
|
||||
if (ticks != obj->pulsewidth_ticks) {
|
||||
obj->pulsewidth_ticks = ticks;
|
||||
pwmout_update_cfgreg(obj);
|
||||
}
|
||||
}
|
||||
/* Start PWM module */
|
||||
pwmout_start(obj);
|
||||
}
|
||||
|
||||
float pwmout_read(pwmout_t* obj)
|
||||
{
|
||||
float v = (float)(obj->pulsewidth_ticks) / (float)(obj->period_ticks);
|
||||
return (v > 1.0f) ? (1.0f) : (v);
|
||||
}
|
||||
|
||||
void pwmout_period(pwmout_t* obj, float seconds)
|
||||
{
|
||||
pwmout_period_us(obj, seconds * 1000000.0f);
|
||||
}
|
||||
|
||||
void pwmout_period_ms(pwmout_t* obj, int ms)
|
||||
{
|
||||
pwmout_period_us(obj, ms * 1000);
|
||||
}
|
||||
|
||||
/* Set the PWM period, keeping the duty cycle the same. */
|
||||
void pwmout_period_us(pwmout_t* obj, int us)
|
||||
{
|
||||
uint32_t ticks;
|
||||
MBED_ASSERT(PWM_5 >= (PWMName)(obj->channel));
|
||||
|
||||
/* Check if already started */
|
||||
if (is_pwmout_started(obj))
|
||||
pwmout_stop(obj);
|
||||
|
||||
/* Calculate number of ticks */
|
||||
ticks = (uint64_t)(*(obj->base_clk_ptr)) * us / 1000000;
|
||||
|
||||
if (ticks != obj->period_ticks) {
|
||||
float duty_ratio;
|
||||
|
||||
/* Preserve the duty ratio */
|
||||
if (0 == obj->period_ticks)
|
||||
duty_ratio = 0.5f;
|
||||
else
|
||||
duty_ratio = (float)obj->pulsewidth_ticks / (float)obj->period_ticks;
|
||||
obj->period_ticks = ticks;
|
||||
obj->pulsewidth_ticks = (uint32_t)(ticks * duty_ratio);
|
||||
MBED_ASSERT(obj->period_ticks >= obj->pulsewidth_ticks);
|
||||
|
||||
pwmout_update_cfgreg(obj);
|
||||
}
|
||||
|
||||
/* Start PWM module */
|
||||
pwmout_start(obj);
|
||||
}
|
||||
|
||||
void pwmout_pulsewidth(pwmout_t* obj, float seconds)
|
||||
{
|
||||
pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
|
||||
}
|
||||
|
||||
void pwmout_pulsewidth_ms(pwmout_t* obj, int ms)
|
||||
{
|
||||
pwmout_pulsewidth_us(obj, ms * 1000);
|
||||
}
|
||||
|
||||
/* Set the PWM pulsewidth, keeping the period the same. */
|
||||
void pwmout_pulsewidth_us(pwmout_t* obj, int us)
|
||||
{
|
||||
uint32_t ticks;
|
||||
|
||||
MBED_ASSERT(PWM_7 >= (PWMName)(obj->channel));
|
||||
|
||||
/* Check if already started */
|
||||
if (is_pwmout_started(obj))
|
||||
pwmout_stop(obj);
|
||||
|
||||
/* Calculate number of ticks */
|
||||
ticks = (uint64_t)(*(obj->base_clk_ptr)) * us / 1000000;
|
||||
|
||||
if (ticks != obj->pulsewidth_ticks) {
|
||||
obj->pulsewidth_ticks = ticks;
|
||||
MBED_ASSERT(obj->period_ticks >= obj->pulsewidth_ticks);
|
||||
|
||||
pwmout_update_cfgreg(obj);
|
||||
}
|
||||
|
||||
/* Start PWM module */
|
||||
pwmout_start(obj);
|
||||
}
|
||||
|
||||
static uint8_t is_pwmout_started(pwmout_t* obj)
|
||||
{
|
||||
uint8_t retVal = 0;
|
||||
uint32_t reg_val;
|
||||
|
||||
MBED_ASSERT(PWM_7 >= (PWMName)(obj->channel));
|
||||
|
||||
if (PWM_3 >= (PWMName)obj->channel) {
|
||||
reg_val = (EXIF_PWM_EN_REG >> 8) & 0x0FUL;
|
||||
if (reg_val & (0x01UL << obj->channel))
|
||||
retVal = 1;
|
||||
} else if (PWM_4 == (PWMName)obj->channel) {
|
||||
if (*(obj->CFGR) & (0x01UL << 1))
|
||||
retVal = 1;
|
||||
} else if (PWM_5 == (PWMName)obj->channel) {
|
||||
retVal = 1;
|
||||
} else {
|
||||
if (*(obj->CFGR) & (0x01UL << 16))
|
||||
retVal = 1;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
static void pwmout_start(pwmout_t* obj)
|
||||
{
|
||||
MBED_ASSERT(PWM_7 >= (PWMName)(obj->channel));
|
||||
|
||||
if (obj->period_ticks == obj->pulsewidth_ticks) {
|
||||
gpio_t gpio;
|
||||
gpio_init_out(&gpio, obj->pin);
|
||||
gpio_write(&gpio, 1);
|
||||
//mbed_error_printf("100\n");
|
||||
} else if (0 == obj->pulsewidth_ticks) {
|
||||
gpio_t gpio;
|
||||
gpio_init_out(&gpio, obj->pin);
|
||||
gpio_write(&gpio, 0);
|
||||
//mbed_error_printf("0\n");
|
||||
} else {
|
||||
pinmap_pinout(obj->pin, PinMap_PWM);
|
||||
}
|
||||
|
||||
if (PWM_3 >= (PWMName)obj->channel) {
|
||||
EXIF_PWM_EN_REG |= (0x01UL << (8 + obj->channel));
|
||||
} else if (PWM_4 == (PWMName)obj->channel) {
|
||||
*(obj->CFGR) |= 0x01UL;
|
||||
} else if (PWM_5 == (PWMName)obj->channel) {
|
||||
/* Nothing to be done */
|
||||
} else {
|
||||
*(obj->CFGR) |= (0x01UL << 16);
|
||||
}
|
||||
}
|
||||
|
||||
static void pwmout_stop(pwmout_t* obj)
|
||||
{
|
||||
MBED_ASSERT(PWM_7 >= (PWMName)(obj->channel));
|
||||
|
||||
if (obj->period_ticks == obj->pulsewidth_ticks) {
|
||||
gpio_t gpio;
|
||||
gpio_init_out(&gpio, obj->pin);
|
||||
gpio_write(&gpio, 0);
|
||||
}
|
||||
|
||||
if (PWM_3 >= (PWMName)obj->channel) {
|
||||
EXIF_PWM_EN_REG &= ~(0x01UL << (8 + obj->channel));
|
||||
} else if (PWM_4 == (PWMName)(obj->channel)) {
|
||||
*(obj->CFGR) &= ~0x01UL;
|
||||
} else if (PWM_5 == (PWMName)(obj->channel)) {
|
||||
/* Nothing to be done */
|
||||
} else {
|
||||
*(obj->CFGR) &= ~(0x01UL << 16);
|
||||
}
|
||||
}
|
||||
|
||||
static void pwmout_update_cfgreg(pwmout_t* obj)
|
||||
{
|
||||
int err_code = 0;
|
||||
if (obj->pulsewidth_ticks < obj->period_ticks_min) {
|
||||
obj->pulsewidth_ticks = obj->period_ticks_min;
|
||||
err_code = 1; // too small duty
|
||||
if (obj->period_ticks < obj->period_ticks_min) {
|
||||
obj->period_ticks = obj->period_ticks_min;
|
||||
err_code = 2; // too small duty & period
|
||||
}
|
||||
}
|
||||
if (obj->period_ticks > obj->period_ticks_max) {
|
||||
obj->period_ticks = obj->period_ticks_max;
|
||||
err_code = 3; // too large period
|
||||
if (obj->pulsewidth_ticks > obj->period_ticks_max) {
|
||||
obj->pulsewidth_ticks = obj->period_ticks_max;
|
||||
err_code = 4; // too large period & duty
|
||||
}
|
||||
}
|
||||
if (0 != err_code) {
|
||||
mbed_error_printf("PwmCfgErr:%d\r\n",err_code);
|
||||
}
|
||||
if (PWM_3 >= (PWMName)(obj->channel)) {
|
||||
if (obj->period_ticks == obj->pulsewidth_ticks) {
|
||||
*(obj->CFGR) = ((obj->pulsewidth_ticks - 1) << 16);
|
||||
} else {
|
||||
*(obj->CFGR) = ((obj->period_ticks - obj->pulsewidth_ticks - 1) & 0xFFFFUL) |
|
||||
((obj->pulsewidth_ticks - 1) << 16);
|
||||
}
|
||||
} else if (PWM_4 == (PWMName)(obj->channel)) {
|
||||
*(obj->CFGR) = ((obj->pulsewidth_ticks & ~0x07UL) << ( 4 - 3)) |
|
||||
((obj->period_ticks & ~0x07UL) << (16 - 3));
|
||||
} else if (PWM_5 == (PWMName)(obj->channel)) {
|
||||
/* TBD */
|
||||
uint32_t reg_val = *(obj->CFGR) & ~(0xFUL << 4) & ~(0x7UL << 16);
|
||||
uint32_t lpg_field_ontime = (0x01UL << 4) & (0xFUL << 4); // to be confirm
|
||||
uint32_t lpg_field_period = (obj->period_ticks << 4) & (0x7UL << 16);
|
||||
*(obj->CFGR) = reg_val | lpg_field_ontime | lpg_field_period;
|
||||
} else if (PWM_6 == (PWMName)(obj->channel)) {
|
||||
uint32_t reg_val = *(obj->CFGR) & ~(0xFF);
|
||||
*(obj->CFGR) = reg_val | (obj->pulsewidth_ticks);//1~254
|
||||
} else{
|
||||
//PWM_7
|
||||
uint32_t reg_val = *(obj->CFGR) & ~(0xFF);
|
||||
*(obj->CFGR) = reg_val | (obj->pulsewidth_ticks);//1~254
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,44 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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 RDA_CCFG_API_H
|
||||
#define RDA_CCFG_API_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void rda_ccfg_aontmr(void);
|
||||
void rda_ccfg_gp6(unsigned short cfg);
|
||||
void rda_ccfg_gp7(unsigned short cfg);
|
||||
void rda_ccfg_gp(unsigned char gp, unsigned short cfg);
|
||||
void rda_ccfg_ckrst(void);
|
||||
void rda_ccfg_perrst(void);
|
||||
void rda_ccfg_adc_init(void);
|
||||
void rda_ccfg_adc_gp(unsigned char gp, unsigned short cfg);
|
||||
void rda_ccfg_adc_oenb(unsigned char ch, unsigned short cfg);
|
||||
unsigned short rda_ccfg_adc_read(unsigned char ch);
|
||||
void rda_ccfg_adc_free(void);
|
||||
int rda_ccfg_abort_flag(void);
|
||||
void rda_ccfg_wdt_en(void);
|
||||
int rda_ccfg_hwver(void);
|
||||
|
||||
/**@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,40 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include "us_ticker_api.h"
|
||||
|
||||
#define rTIMER_INTSTATE (RDA_TIMINTST->INTST)
|
||||
#define RDA_TIMER_IRQn (TIMER_IRQn)
|
||||
#define TIMER0_CONTROL_ENABLE (0x01)
|
||||
|
||||
extern uint32_t us_ticker_soft_int_flag;
|
||||
extern void us_ticker_irq_callback();
|
||||
|
||||
static void rda_timer_isr(void)
|
||||
{
|
||||
uint32_t int_status = rTIMER_INTSTATE & 0x000FUL;
|
||||
|
||||
if ((int_status == 0x05) ||((int_status == 0) && (us_ticker_soft_int_flag == 1))){
|
||||
us_ticker_irq_callback();
|
||||
us_ticker_irq_handler();
|
||||
}
|
||||
}
|
||||
|
||||
void rda_timer_irq_set(void)
|
||||
{
|
||||
NVIC_SetVector(RDA_TIMER_IRQn, (uint32_t)rda_timer_isr);
|
||||
NVIC_SetPriority(RDA_TIMER_IRQn, 0x1FUL);
|
||||
NVIC_EnableIRQ(RDA_TIMER_IRQn);
|
||||
}
|
|
@ -0,0 +1,403 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
// math.h required for floating point operations for baud rate calculation
|
||||
#include "mbed_assert.h"
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "serial_api.h"
|
||||
#include "cmsis.h"
|
||||
#include "pinmap.h"
|
||||
#include "gpio_api.h"
|
||||
|
||||
/******************************************************************************
|
||||
* INITIALIZATION
|
||||
******************************************************************************/
|
||||
#define UART_NUM 2
|
||||
|
||||
#define UART_CLKGATE_REG (RDA_SCU->CLKGATE0)
|
||||
|
||||
#define UART1_CLKEN_MASK (0x01UL << 21)
|
||||
#define RXFIFO_EMPTY_MASK (0x01UL << 0)
|
||||
#define TXFIFO_FULL_MASK (0x01UL << 19)
|
||||
#define AFCE_MASK (0x01UL << 5)
|
||||
|
||||
static const PinMap PinMap_UART_TX[] = {
|
||||
{PA_1, UART_0, 0},
|
||||
{PB_2, UART_1, 5},
|
||||
{PD_3, UART_1, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_UART_RX[] = {
|
||||
{PA_0, UART_0, 0},
|
||||
{PB_1, UART_1, 5},
|
||||
{PD_2, UART_1, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_UART_RTS[] = {
|
||||
{PD_1, UART_1, 2},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_UART_CTS[] = {
|
||||
{PD_0, UART_1, 2},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static uart_irq_handler irq_handler[UART_NUM];
|
||||
|
||||
int stdio_uart_inited = 0;
|
||||
serial_t stdio_uart;
|
||||
|
||||
struct serial_global_data_s {
|
||||
uint32_t serial_irq_id;
|
||||
gpio_t sw_rts, sw_cts;
|
||||
uint8_t count, rx_irq_set_flow, rx_irq_set_api;
|
||||
};
|
||||
|
||||
static struct serial_global_data_s uart_data[UART_NUM];
|
||||
|
||||
void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||
{
|
||||
int is_stdio_uart = 0;
|
||||
|
||||
// determine the UART to use
|
||||
UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
|
||||
UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
|
||||
UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
|
||||
MBED_ASSERT((int)uart != NC);
|
||||
|
||||
switch (uart) {
|
||||
case UART_0:
|
||||
obj->index = 0;
|
||||
break;
|
||||
case UART_1:
|
||||
obj->index = 1;
|
||||
/* Enable clock-gating */
|
||||
UART_CLKGATE_REG |= UART1_CLKEN_MASK;
|
||||
break;
|
||||
}
|
||||
|
||||
obj->uart = (RDA_UART_TypeDef *)uart;
|
||||
|
||||
// enable fifos and default rx trigger level
|
||||
obj->uart->FCR = 0 << 0 //FIFO Enable - 0 = Disables, 1 = Enabled
|
||||
| 0 << 1 // Rx Fifo Reset
|
||||
| 0 << 2 // Tx Fifo Reset
|
||||
| 0 << 6; // Rx irq trigger level - 0 = 1 char, 1 = 4 chars, 2 = 8 chars, 3 = 14 chars
|
||||
|
||||
// disable irqs
|
||||
obj->uart->IER = 0 << 0 // Rx Data available irq enable
|
||||
| 0 << 1 // Tx Fifo empty irq enable
|
||||
| 0 << 2; // Rx Line Status irq enable
|
||||
|
||||
obj->uart->MCR = 1 << 8; //select clock
|
||||
obj->uart->FRR = 0x2001; //tx_trigger = 0x10, rx_trigger = 0x01
|
||||
|
||||
serial_format(obj, 8, ParityNone, 1);
|
||||
|
||||
// pinout the chosen uart
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
// set rx/tx pins in PullUp mode
|
||||
if (tx != NC) {
|
||||
pin_mode(tx, PullUp);
|
||||
}
|
||||
if (rx != NC) {
|
||||
pin_mode(rx, PullUp);
|
||||
}
|
||||
|
||||
if ((rx != NC) && (tx != NC)) {
|
||||
obj->uart->FCR |= 1 << 0; //enable fifo
|
||||
}
|
||||
|
||||
uart_data[obj->index].sw_rts.pin = NC;
|
||||
uart_data[obj->index].sw_cts.pin = NC;
|
||||
serial_set_flow_control(obj, FlowControlNone, NC, NC);
|
||||
|
||||
is_stdio_uart = (uart == STDIO_UART) ? (1) : (0);
|
||||
|
||||
if (is_stdio_uart) {
|
||||
stdio_uart_inited = 1;
|
||||
memcpy(&stdio_uart, obj, sizeof(serial_t));
|
||||
}
|
||||
serial_clear(obj);
|
||||
}
|
||||
|
||||
void serial_free(serial_t *obj)
|
||||
{
|
||||
uart_data[obj->index].serial_irq_id = 0;
|
||||
}
|
||||
|
||||
// serial_baud
|
||||
// set the baud rate, taking in to account the current SystemFrequency
|
||||
void serial_baud(serial_t *obj, int baudrate)
|
||||
{
|
||||
MBED_ASSERT((int)obj->uart <= UART_1);
|
||||
|
||||
uint32_t baud_divisor;
|
||||
uint32_t baud_mod;
|
||||
|
||||
baud_divisor = (AHBBusClock / baudrate) >> 4;
|
||||
baud_mod = (AHBBusClock / baudrate) & 0x0F;
|
||||
|
||||
obj->uart->LCR |= (1 << 7); //enable load devisor register
|
||||
|
||||
obj->uart->DLL = (baud_divisor >> 0) & 0xFF;
|
||||
obj->uart->DLH = (baud_divisor >> 8) & 0xFF;
|
||||
obj->uart->DL2 = (baud_mod>>1) + ((baud_mod - (baud_mod>>1))<<4);
|
||||
|
||||
obj->uart->LCR &= ~(1 << 7);// after loading, disable load devisor register
|
||||
|
||||
}
|
||||
|
||||
void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
|
||||
{
|
||||
MBED_ASSERT((stop_bits == 1) || (stop_bits == 2)); // 0: 1 stop bits, 1: 2 stop bits
|
||||
MBED_ASSERT((data_bits > 4) && (data_bits < 9)); // 0: 5 data bits ... 3: 8 data bits
|
||||
MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven) ||
|
||||
(parity == ParityForced1) || (parity == ParityForced0));
|
||||
|
||||
stop_bits -= 1;
|
||||
data_bits -= 5;
|
||||
|
||||
int parity_enable, parity_select;
|
||||
switch (parity) {
|
||||
case ParityNone:
|
||||
parity_enable = 0;
|
||||
parity_select = 0;
|
||||
break;
|
||||
case ParityOdd:
|
||||
parity_enable = 1;
|
||||
parity_select = 0;
|
||||
break;
|
||||
case ParityEven:
|
||||
parity_enable = 1;
|
||||
parity_select = 1;
|
||||
break;
|
||||
case ParityForced1:
|
||||
parity_enable = 1;
|
||||
parity_select = 2;
|
||||
break;
|
||||
case ParityForced0:
|
||||
parity_enable = 1;
|
||||
parity_select = 3;
|
||||
break;
|
||||
default:
|
||||
parity_enable = 0;
|
||||
parity_select = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
obj->uart->LCR = (obj->uart->LCR) &
|
||||
((~0x3FUL) |
|
||||
(data_bits << 0) |
|
||||
(stop_bits << 2) |
|
||||
(parity_enable << 3) |
|
||||
(parity_select << 4));
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* INTERRUPTS HANDLING
|
||||
******************************************************************************/
|
||||
static inline void uart_irq(uint32_t iir, uint32_t index, RDA_UART_TypeDef *puart)
|
||||
{
|
||||
SerialIrq irq_type;
|
||||
switch (iir) {
|
||||
case 0x02UL: irq_type = TxIrq; break;
|
||||
case 0x04UL: irq_type = RxIrq; break;
|
||||
case 0x00UL: iir = puart->MSR;
|
||||
default: return;
|
||||
}
|
||||
|
||||
if ((RxIrq == irq_type) && ((NC != uart_data[index].sw_rts.pin) && ((puart->MCR & AFCE_MASK) == 0x00UL))) {
|
||||
gpio_write(&uart_data[index].sw_rts, 1);
|
||||
// Disable interrupt if it wasn't enabled by other part of the application
|
||||
if (!uart_data[index].rx_irq_set_api)
|
||||
puart->IER &= ~(1 << RxIrq);
|
||||
}
|
||||
|
||||
if (uart_data[index].serial_irq_id != 0)
|
||||
if ((irq_type != RxIrq) || (uart_data[index].rx_irq_set_api))
|
||||
(irq_handler[index])(uart_data[index].serial_irq_id, irq_type);
|
||||
}
|
||||
|
||||
void uart0_irq(void)
|
||||
{
|
||||
uart_irq((RDA_UART0->IIR & 0x0FUL), 0, (RDA_UART_TypeDef*)RDA_UART0);
|
||||
}
|
||||
|
||||
void uart1_irq(void)
|
||||
{
|
||||
uart_irq((RDA_UART1->IIR & 0x0FUL), 1, (RDA_UART_TypeDef*)RDA_UART1);
|
||||
}
|
||||
|
||||
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
||||
{
|
||||
irq_handler[obj->index] = handler;
|
||||
uart_data[obj->index].serial_irq_id = id;
|
||||
}
|
||||
|
||||
static void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable)
|
||||
{
|
||||
IRQn_Type irq_n = (IRQn_Type)0;
|
||||
uint32_t vector = 0;
|
||||
switch ((int)obj->uart) {
|
||||
case UART_0:
|
||||
irq_n=UART0_IRQn;
|
||||
vector = (uint32_t)&uart0_irq;
|
||||
break;
|
||||
case UART_1:
|
||||
irq_n=UART1_IRQn;
|
||||
vector = (uint32_t)&uart1_irq;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (enable) {
|
||||
obj->uart->IER |= 1 << irq;
|
||||
NVIC_SetVector(irq_n, vector);
|
||||
NVIC_SetPriority(irq_n, 0x1FUL);
|
||||
NVIC_EnableIRQ(irq_n);
|
||||
}
|
||||
else if ((TxIrq == irq) ||
|
||||
(uart_data[obj->index].rx_irq_set_api + uart_data[obj->index].rx_irq_set_flow == 0)) { // disable
|
||||
int all_disabled = 0;
|
||||
SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
|
||||
obj->uart->IER &= ~(1 << irq);
|
||||
all_disabled = (obj->uart->IER & (1 << other_irq)) == 0;
|
||||
if (all_disabled)
|
||||
NVIC_DisableIRQ(irq_n);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
||||
{
|
||||
if (RxIrq == irq)
|
||||
uart_data[obj->index].rx_irq_set_api = enable;
|
||||
serial_irq_set_internal(obj, irq, enable);
|
||||
}
|
||||
|
||||
static void serial_flow_irq_set(serial_t *obj, uint32_t enable)
|
||||
{
|
||||
uart_data[obj->index].rx_irq_set_flow = enable;
|
||||
serial_irq_set_internal(obj, RxIrq, enable);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* READ/WRITE
|
||||
******************************************************************************/
|
||||
int serial_getc(serial_t *obj)
|
||||
{
|
||||
int data = 0;
|
||||
while (!serial_readable(obj));
|
||||
data = (int)(obj->uart->RBR & 0x00FFUL);
|
||||
|
||||
if (((obj->uart->MCR & AFCE_MASK) == 0x00UL) && (NC != uart_data[obj->index].sw_rts.pin)) { //enable flow control rx
|
||||
gpio_write(&uart_data[obj->index].sw_rts, 0);
|
||||
obj->uart->IER |= 1 << RxIrq;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
void serial_putc(serial_t *obj, int c)
|
||||
{
|
||||
while (serial_writable(obj));
|
||||
obj->uart->THR = c;
|
||||
}
|
||||
|
||||
int serial_readable(serial_t *obj)
|
||||
{
|
||||
return (obj->uart->LSR & RXFIFO_EMPTY_MASK);
|
||||
}
|
||||
|
||||
int serial_writable(serial_t *obj)
|
||||
{
|
||||
int isWritable = 1;
|
||||
if (obj->index == 0) {
|
||||
return (obj->uart->FSR & TXFIFO_FULL_MASK); // uart0 not have flow control
|
||||
} else {
|
||||
if (((obj->uart->MCR & AFCE_MASK) == 0x00UL) && (NC != uart_data[obj->index].sw_cts.pin)) //If flow control: writable if CTS low + UART done
|
||||
isWritable = (gpio_read(&uart_data[obj->index].sw_cts) == 0) && (obj->uart->FSR & TXFIFO_FULL_MASK);
|
||||
else
|
||||
isWritable = (obj->uart->FSR & TXFIFO_FULL_MASK);
|
||||
return isWritable;
|
||||
}
|
||||
}
|
||||
|
||||
void serial_clear(serial_t *obj)
|
||||
{
|
||||
obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled
|
||||
| 1 << 1 // rx FIFO reset
|
||||
| 1 << 2; // tx FIFO reset
|
||||
}
|
||||
|
||||
void serial_pinout_tx(PinName tx)
|
||||
{
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
}
|
||||
|
||||
void serial_break_set(serial_t *obj)
|
||||
{
|
||||
obj->uart->LCR |= (1 << 6);
|
||||
}
|
||||
|
||||
void serial_break_clear(serial_t *obj)
|
||||
{
|
||||
obj->uart->LCR &= ~(1 << 6);
|
||||
}
|
||||
|
||||
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
|
||||
{
|
||||
// Only UART1 has hardware flow control on RDA5991H
|
||||
MBED_ASSERT((rxflow != UART0_RX) && (txflow != UART0_TX));
|
||||
|
||||
RDA_UART_TypeDef *uart1 = (uint32_t)obj->uart == (uint32_t)RDA_UART1 ? RDA_UART1 : NULL;
|
||||
int index = obj->index;
|
||||
|
||||
// First, disable flow control completely
|
||||
uart_data[index].sw_rts.pin = uart_data[index].sw_cts.pin = NC;
|
||||
serial_flow_irq_set(obj, 0);
|
||||
if (FlowControlNone == type) {
|
||||
RDA_GPIO->IFCTRL &= ~(0x01UL << 2); //disable flow control
|
||||
return;
|
||||
}
|
||||
|
||||
// Check type(s) of flow control to use
|
||||
UARTName uart_rts = (UARTName)pinmap_find_peripheral(rxflow, PinMap_UART_RTS);
|
||||
UARTName uart_cts = (UARTName)pinmap_find_peripheral(txflow, PinMap_UART_CTS);
|
||||
|
||||
if ((UART_1 == uart_cts) && (NULL != uart1)) {
|
||||
pinmap_pinout(txflow, PinMap_UART_CTS);
|
||||
gpio_init_in(&uart_data[index].sw_cts, txflow);
|
||||
}
|
||||
|
||||
if ((UART_1 == uart_rts) && (NULL != uart1)) {
|
||||
pinmap_pinout(rxflow, PinMap_UART_RTS);
|
||||
gpio_init_out(&uart_data[index].sw_rts, rxflow);
|
||||
serial_flow_irq_set(obj, 1);
|
||||
}
|
||||
|
||||
uart1->MCR = uart1->MCR | AFCE_MASK; //enable auto flow control, in this case we don't have to read and write sw_cts & sw_rts
|
||||
uart1->FRR = (0x3EUL << 0) | (0x3EUL << 9); //rts/cts fifo trigger
|
||||
RDA_GPIO->IFCTRL |= 0x01UL << 2; //enable flow control
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include "sleep_api.h"
|
||||
#include "cmsis.h"
|
||||
#include "mbed_interface.h"
|
||||
|
||||
#define DEFAULT_PD_BOOTJUMPADDR (0x18001004UL)
|
||||
|
||||
void hal_sleep(void)
|
||||
{
|
||||
|
||||
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
|
||||
// wait for interrupt
|
||||
__DSB();
|
||||
__WFI();
|
||||
}
|
||||
|
||||
/*
|
||||
* The mbed UNO_91H does not support the deepsleep mode
|
||||
* as a debugger is connected to it (the mbed interface).
|
||||
*
|
||||
* We treat a deepsleep() as a normal sleep().
|
||||
*/
|
||||
|
||||
void hal_deepsleep(void)
|
||||
{
|
||||
uint32_t regval, gpio_num = 4;
|
||||
/* Set pd write_en */
|
||||
RDA_SCU->PWRCTRL |= (0x01UL << 8);
|
||||
regval = RDA_SCU->PWRCTRL | (0x01UL << 3); // gpio wakeup en
|
||||
regval &= ~(0x0FUL << 9);
|
||||
regval |= (gpio_num << 9); // set gpio number
|
||||
RDA_SCU->PWRCTRL = regval & ~(0x01UL << 14); // posedge
|
||||
RDA_SCU->BOOTJUMPADDRCFG = DEFAULT_PD_BOOTJUMPADDR;
|
||||
/* Clr pd write_en */
|
||||
RDA_SCU->PWRCTRL &= ~(0x01UL << 8);
|
||||
osDelay(1);
|
||||
rda_ccfg_ckrst();
|
||||
osDelay(1);
|
||||
RDA_SCU->PWRCTRL |= (0x01UL << 25); // goto low-power mode
|
||||
}
|
|
@ -0,0 +1,285 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#if DEVICE_SPI
|
||||
#include "mbed_assert.h"
|
||||
#include <math.h>
|
||||
|
||||
#include "spi_api.h"
|
||||
#include "rda_ccfg_api.h"
|
||||
#include "cmsis.h"
|
||||
#include "pinmap.h"
|
||||
|
||||
/*------------- Wlan Monitor (WLANMON) ---------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t PHYSEL_3_0; /* 0x00 : PHY select register 0 - 3 */
|
||||
} RDA_WLANMON_TypeDef;
|
||||
|
||||
/*
|
||||
* Macros
|
||||
*/
|
||||
#define RDA_MON ((RDA_WLANMON_TypeDef *)RDA_MON_BASE)
|
||||
#define ENABLE_RDA_SPI_MODE 0
|
||||
|
||||
#define SPI_CLKGATE_REG (RDA_SCU->CLKGATE2)
|
||||
#define SPI_MODESEL_REG (RDA_GPIO->CTRL)
|
||||
#define SPI_PINSEL_REG0 (RDA_GPIO->MEMCFG)
|
||||
#define SPI_PINSEL_REG1 (RDA_MON->PHYSEL_3_0)
|
||||
#define SPI_PINSEL_REG2 (RDA_EXIF->MISCCFG)
|
||||
|
||||
/*
|
||||
* Global Variables
|
||||
*/
|
||||
static const PinMap PinMap_SPI_SCLK[] = {
|
||||
{PB_4, SPI_0, 4},
|
||||
{PD_0, SPI_0, 1},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_MOSI[] = {
|
||||
{PB_6, SPI_0, 3},
|
||||
{PC_0, SPI_0, 6},
|
||||
{PD_2, SPI_0, 1},
|
||||
{PB_3, SPI_0, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_MISO[] = {
|
||||
{PB_7, SPI_0, 3},
|
||||
{PC_1, SPI_0, 6},
|
||||
{PD_3, SPI_0, 1},
|
||||
{PB_8, SPI_0, 3},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_SSEL[] = {
|
||||
{PD_1, SPI_0, 1},
|
||||
{PB_5, SPI_0, 4},
|
||||
{PA_0, SPI_0, 3},
|
||||
{PA_1, SPI_0, 3},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
/*
|
||||
* Inline Functions
|
||||
*/
|
||||
static inline int spi_pin_cs_num(PinName ssel);
|
||||
static inline void spi_write(spi_t *obj, int value);
|
||||
static inline int spi_read(spi_t *obj);
|
||||
|
||||
/*
|
||||
* Functions
|
||||
*/
|
||||
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
|
||||
{
|
||||
uint32_t reg_val;
|
||||
|
||||
/* Determine the SPI to use */
|
||||
SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI);
|
||||
SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO);
|
||||
SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK);
|
||||
SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL);
|
||||
SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
|
||||
SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel);
|
||||
obj->spi = (RDA_SPI_TypeDef*)pinmap_merge(spi_data, spi_cntl);
|
||||
MBED_ASSERT((int)obj->spi != NC);
|
||||
|
||||
/* Enable power and clocking */
|
||||
SPI_CLKGATE_REG |= (0x01UL << 18);
|
||||
|
||||
/* Select 4-wire SPI mode */
|
||||
SPI_MODESEL_REG &= ~(0x01UL << 14);
|
||||
|
||||
/* Set Config Reg */
|
||||
reg_val = obj->spi->CFG;
|
||||
|
||||
#if ENABLE_RDA_SPI_MODE
|
||||
/* RDA SPI mode */
|
||||
reg_val |= (0x01UL << 2);
|
||||
#else /* ENABLE_RDA_SPI_MODE */
|
||||
/* Normal SPI mode */
|
||||
reg_val &= ~(0x01UL << 2);
|
||||
/* Set read flag */
|
||||
reg_val |= (0x01UL << 3);
|
||||
#endif /* ENABLE_RDA_SPI_MODE */
|
||||
|
||||
/* Set core cfg for mosi, miso */
|
||||
if (PB_6 == mosi) {
|
||||
rda_ccfg_gp(6U, 0x01U);
|
||||
}
|
||||
if (PB_7 == miso) {
|
||||
rda_ccfg_gp(7U, 0x01U);
|
||||
}
|
||||
|
||||
/* Config gpio/wlan_mon regs */
|
||||
if (PB_3 == mosi) {
|
||||
SPI_MODESEL_REG &= ~(0x0FUL);
|
||||
SPI_PINSEL_REG1 &= ~(0x3FUL << 24);
|
||||
SPI_PINSEL_REG2 &= ~(0x0FUL << 12);
|
||||
SPI_MODESEL_REG |= (0x0BUL);
|
||||
SPI_PINSEL_REG1 |= (0x02UL << 24);
|
||||
SPI_PINSEL_REG2 |= (0x01UL << 12);
|
||||
}
|
||||
if (PB_8 == miso) {
|
||||
SPI_PINSEL_REG0 &= ~(0x01UL << 11);
|
||||
}
|
||||
|
||||
/* Pin out the SPI pins */
|
||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||
pinmap_pinout(sclk, PinMap_SPI_SCLK);
|
||||
if (ssel != NC) {
|
||||
int cs_num = spi_pin_cs_num(ssel);
|
||||
reg_val &= ~(0x03UL << 23);
|
||||
reg_val |= (((uint32_t)cs_num & 0x03UL) << 23);
|
||||
pinmap_pinout(ssel, PinMap_SPI_SSEL);
|
||||
}
|
||||
obj->spi->CFG = reg_val;
|
||||
}
|
||||
|
||||
void spi_free(spi_t *obj)
|
||||
{
|
||||
/* Disable SPI clock gating */
|
||||
SPI_CLKGATE_REG &= ~(0x01UL << 18);
|
||||
}
|
||||
|
||||
void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||
{
|
||||
uint32_t polarity = (mode & 0x2) ? (0x01UL) : (0x00UL);
|
||||
uint32_t reg_val;
|
||||
|
||||
#if ENABLE_RDA_SPI_MODE
|
||||
MBED_ASSERT(((bits >= 4) && (bits <= 64)) && (mode >= 0 && mode <= 3));
|
||||
#else /* ENABLE_RDA_SPI_MODE */
|
||||
MBED_ASSERT(((bits >= 4) && (bits <= 32)) && (mode >= 0 && mode <= 3));
|
||||
#endif /* ENABLE_RDA_SPI_MODE */
|
||||
|
||||
/* Set number of frame bits and clock phase */
|
||||
reg_val = obj->spi->CFG & ~(0x7FUL << 16) & ~(0x01UL << 1);
|
||||
obj->spi->CFG = reg_val | ((uint32_t)bits << 16) | (polarity << 1);
|
||||
|
||||
#if ENABLE_RDA_SPI_MODE
|
||||
/* Set bit offset value */
|
||||
obj->bit_ofst[0] = 0;
|
||||
obj->bit_ofst[1] = 0;
|
||||
if (2 > (bits >> 5)) {
|
||||
obj->bit_ofst[bits >> 5] = (uint8_t)(32 - (bits & 0x1F));
|
||||
}
|
||||
#else /* ENABLE_RDA_SPI_MODE */
|
||||
obj->bit_ofst[0] = (uint8_t)(32 - bits);
|
||||
#endif /* ENABLE_RDA_SPI_MODE */
|
||||
}
|
||||
|
||||
void spi_frequency(spi_t *obj, int hz)
|
||||
{
|
||||
uint32_t clk_rate = ((AHBBusClock / (uint32_t)hz) >> 2) - 1U;
|
||||
uint32_t reg_val;
|
||||
|
||||
/* Check for valid frequency */
|
||||
MBED_ASSERT(clk_rate <= 0x3FUL);
|
||||
|
||||
/* Set clk rate field */
|
||||
reg_val = obj->spi->CFG & ~(0x3FUL << 4);
|
||||
obj->spi->CFG = reg_val | ((clk_rate & 0x3FUL) << 4);
|
||||
}
|
||||
|
||||
int spi_master_write(spi_t *obj, int value)
|
||||
{
|
||||
spi_write(obj, value);
|
||||
return spi_read(obj);
|
||||
}
|
||||
|
||||
int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, char write_fill)
|
||||
{
|
||||
int total = (tx_length > rx_length) ? tx_length : rx_length;
|
||||
|
||||
for (int i = 0; i < total; i++) {
|
||||
char out = (i < tx_length) ? tx_buffer[i] : write_fill;
|
||||
char in = spi_master_write(obj, out);
|
||||
if (i < rx_length) {
|
||||
rx_buffer[i] = in;
|
||||
}
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
int spi_busy(spi_t *obj)
|
||||
{
|
||||
return (obj->spi->CFG & (0x01UL << 31)) ? (1) : (0);
|
||||
}
|
||||
|
||||
static inline int spi_pin_cs_num(PinName ssel)
|
||||
{
|
||||
int idx = 0;
|
||||
while (PinMap_SPI_SSEL[idx].pin != NC) {
|
||||
if (PinMap_SPI_SSEL[idx].pin == ssel)
|
||||
return idx;
|
||||
idx++;
|
||||
}
|
||||
return (int)NC;
|
||||
}
|
||||
|
||||
static inline void spi_write(spi_t *obj, int value)
|
||||
{
|
||||
#if ENABLE_RDA_SPI_MODE
|
||||
/* Write data register */
|
||||
if (obj->bit_ofst[0] != 0) {
|
||||
obj->spi->D1CMD = (uint32_t)value << obj->bit_ofst[0];
|
||||
} else {
|
||||
obj->spi->D1CMD = (uint32_t)value;
|
||||
obj->spi->D0CMD = (uint32_t)value << obj->bit_ofst[1];
|
||||
}
|
||||
/* Set write bit & start bit */
|
||||
obj->spi->CFG = (obj->spi->CFG & ~(0x01UL << 3)) | 0x01UL;
|
||||
#else /* ENABLE_RDA_SPI_MODE */
|
||||
/* Write data reg */
|
||||
if (obj->bit_ofst[0] != 0) {
|
||||
obj->spi->D1CMD = ((uint32_t)value << obj->bit_ofst[0]) | (0xFFFFFFFFUL >> (32 - obj->bit_ofst[0]));
|
||||
} else {
|
||||
obj->spi->D1CMD = (uint32_t)value;
|
||||
obj->spi->D0CMD = 0xFFFFFFFFUL;
|
||||
}
|
||||
/* Set start bit */
|
||||
obj->spi->CFG |= 0x01UL;
|
||||
#endif /* ENABLE_RDA_SPI_MODE */
|
||||
__DSB();
|
||||
while (spi_busy(obj));
|
||||
}
|
||||
|
||||
static inline int spi_read(spi_t *obj)
|
||||
{
|
||||
uint32_t ret_val;
|
||||
|
||||
#if ENABLE_RDA_SPI_MODE
|
||||
/* Set read bit & start bit */
|
||||
obj->spi->CFG |= ((0x01UL << 3) | 0x01UL);
|
||||
__DSB();
|
||||
while (spi_busy(obj));
|
||||
/* Read data register */
|
||||
if (obj->bit_ofst[0] != 0) {
|
||||
ret_val = obj->spi->D0CMD & ((0x01UL << (32UL - obj->bit_ofst[0])) - 1UL);
|
||||
} else {
|
||||
ret_val = obj->spi->D0CMD;
|
||||
ret_val = obj->spi->D1CMD & ((0x01UL << (32UL - obj->bit_ofst[1])) - 1UL);
|
||||
}
|
||||
#else /* ENABLE_RDA_SPI_MODE */
|
||||
/* Read data register */
|
||||
ret_val = obj->spi->D0CMD & ((0x01UL << (32UL - obj->bit_ofst[0])) - 1UL);
|
||||
#endif /* ENABLE_RDA_SPI_MODE */
|
||||
return (int)ret_val;
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* Hardware entropy collector for the UNO_91H, using RDA's TRNG
|
||||
*
|
||||
* Copyright (C) 2006-2018, ARM Limited, All Rights Reserved
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#if defined(DEVICE_TRNG)
|
||||
|
||||
#include "cmsis.h"
|
||||
#include "trng_api.h"
|
||||
#include "us_ticker_api.h"
|
||||
|
||||
#define rRNG_CLKGATE (RDA_SCU->CLKGATE0)
|
||||
#define rRNG_CLKGEN (RDA_DMACFG->dma_func_ctrl)
|
||||
#define rTRNG_CTRL (RDA_RNG->TCTRL)
|
||||
#define rPRNG_DATA (RDA_RNG->PD)
|
||||
|
||||
static uint32_t trng_inited = 0;
|
||||
|
||||
/** trng_get_byte
|
||||
* @brief Get one byte of entropy from the RNG, assuming it is up and running.
|
||||
* @param obj TRNG obj
|
||||
* @param pointer to the hardware generated random byte.
|
||||
*/
|
||||
static void trng_get_byte(trng_t *obj, unsigned char *byte )
|
||||
{
|
||||
if (0U == obj->byte_idx) {
|
||||
uint32_t start_time = us_ticker_read();
|
||||
/* Delay for PRNG data ready, generate 4-byte per 32us */
|
||||
while ((us_ticker_read() - start_time) <= 32);
|
||||
}
|
||||
*byte = (unsigned char)((rPRNG_DATA >> (obj->byte_idx << 3)) & 0x00FFUL);
|
||||
obj->byte_idx++;
|
||||
obj->byte_idx &= 0x03U;
|
||||
}
|
||||
|
||||
void trng_init(trng_t *obj)
|
||||
{
|
||||
uint32_t regval, start_time = 0;
|
||||
volatile uint32_t count = 10;
|
||||
|
||||
if(trng_inited == 1)
|
||||
return;
|
||||
|
||||
obj->dma_clk_flag = (uint8_t)((rRNG_CLKGATE >> 18) & 0x01U);
|
||||
obj->byte_idx = 0;
|
||||
if (0x00U == obj->dma_clk_flag) {
|
||||
/* DMA Peripheral clock enable */
|
||||
rRNG_CLKGATE |= (0x01UL << 18);
|
||||
/* dealy after clk en */
|
||||
while(count--);
|
||||
}
|
||||
/* RNG Engine clock enable */
|
||||
rRNG_CLKGEN |= (0x01UL << 30);
|
||||
/* Set TRNG enable bit, once mode */
|
||||
regval = rTRNG_CTRL | ((0x01UL << 4) | (0xFFUL << 16));
|
||||
rTRNG_CTRL = regval & ~((0x01UL << 1) | (0x01UL << 2) | (0x01UL << 3));
|
||||
|
||||
/*Entropy data was mixed by TRNG seed and noise, so we add one 32us delay to
|
||||
ensure all 32 bits of seed is entropy when init and
|
||||
another delay to update noise data when get data.
|
||||
*/
|
||||
|
||||
/* Delay for TRNG seed ready */
|
||||
start_time = us_ticker_read();
|
||||
while ((us_ticker_read() - start_time) <= 32);
|
||||
|
||||
rTRNG_CTRL |= (0x01UL << 0);
|
||||
|
||||
trng_inited = 1;
|
||||
}
|
||||
|
||||
void trng_free(trng_t *obj)
|
||||
{
|
||||
if(trng_inited == 0)
|
||||
return;
|
||||
/* Clear TRNG enable bit */
|
||||
rTRNG_CTRL = 0x00UL;
|
||||
/* RNG Engine clock disable */
|
||||
rRNG_CLKGEN &= ~(0x01UL << 30);
|
||||
if (0x00U == obj->dma_clk_flag) {
|
||||
/* DMA Peripheral clock disable */
|
||||
rRNG_CLKGATE &= ~(0x01UL << 18);
|
||||
}
|
||||
trng_inited = 0;
|
||||
}
|
||||
|
||||
int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if(trng_inited != 1)
|
||||
return -1;
|
||||
|
||||
/* Get Random byte */
|
||||
for (uint32_t i = 0; i < length; i++) {
|
||||
trng_get_byte(obj, output + i);
|
||||
}
|
||||
|
||||
*output_length = length;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,237 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2018 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.
|
||||
*/
|
||||
#include "us_ticker_api.h"
|
||||
#include "rda_ccfg_api.h"
|
||||
#include "mbed_critical.h"
|
||||
|
||||
#define US_TICKER_TIMER (RDA_TIM0)
|
||||
#define rTIMER0_CURVAL (RDA_TIM0->CVAL)
|
||||
#define TIMER0_PRESCALE (8)
|
||||
#define TIMER0_SHIFTBITS (3)
|
||||
#define TIMER0_LDCNT_INIT_VAL (0xFFFFFFFF)
|
||||
#define TIMER0_MAX_COUNT (0x1FFFFFFF)
|
||||
|
||||
#define TIMER0_CONTROL_ENABLE (0x01)
|
||||
#define TIMER0_CONTROL_MODE (0x02)
|
||||
#define TIMER0_CONTROL_INT_MSK (0x04)
|
||||
|
||||
|
||||
volatile uint32_t us_ticker_clrInt = 0;
|
||||
|
||||
static uint32_t us_ticker_inited = 0;
|
||||
uint32_t us_ticker_soft_int_flag;
|
||||
static uint32_t us_ticker_timestamp;
|
||||
static uint32_t us_ticker_interruptCount;
|
||||
|
||||
extern void rda_timer_irq_set(void);
|
||||
|
||||
void us_ticker_init(void)
|
||||
{
|
||||
if (us_ticker_inited) {
|
||||
us_ticker_disable_interrupt();
|
||||
return;
|
||||
}
|
||||
|
||||
/* Enable apb timer clock */
|
||||
RDA_SCU->CLKGATE1 |= (0x01UL << 3);
|
||||
|
||||
/* Set timer mode */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_MODE);
|
||||
|
||||
/* Set period mode */
|
||||
RDA_GPIO->REVID |= (0x01UL << 25);
|
||||
|
||||
/* Set timer count */
|
||||
US_TICKER_TIMER->LDCNT = TIMER0_LDCNT_INIT_VAL;
|
||||
|
||||
/* Enable timer */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_ENABLE);
|
||||
|
||||
/* mask timer, disable an overflow int */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_INT_MSK);
|
||||
|
||||
rda_timer_irq_set();
|
||||
|
||||
/* Set us_ticker_inited true, after all settings done */
|
||||
us_ticker_inited = 1U;
|
||||
us_ticker_soft_int_flag = 0;
|
||||
us_ticker_timestamp = 0;
|
||||
us_ticker_interruptCount = TIMER0_MAX_COUNT;
|
||||
}
|
||||
|
||||
uint32_t us_ticker_read(void)
|
||||
{
|
||||
if (!us_ticker_inited) {
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
uint32_t tick_readout = 0 ;
|
||||
|
||||
core_util_critical_section_enter();
|
||||
uint32_t ticker = rTIMER0_CURVAL >> TIMER0_SHIFTBITS ;
|
||||
|
||||
if (us_ticker_interruptCount > ticker)
|
||||
tick_readout = (us_ticker_timestamp + us_ticker_interruptCount - ticker) % TIMER0_MAX_COUNT ;
|
||||
else
|
||||
tick_readout = (us_ticker_timestamp + TIMER0_MAX_COUNT + us_ticker_interruptCount - ticker) % TIMER0_MAX_COUNT ;
|
||||
core_util_critical_section_exit();
|
||||
|
||||
return tick_readout;
|
||||
}
|
||||
|
||||
void us_ticker_set_interrupt(timestamp_t timestamp)
|
||||
{
|
||||
if (!us_ticker_inited) {
|
||||
return ;
|
||||
}
|
||||
|
||||
uint32_t tmp_stamp = timestamp % TIMER0_MAX_COUNT ;
|
||||
|
||||
core_util_critical_section_enter();
|
||||
us_ticker_timestamp = us_ticker_read() ;
|
||||
us_ticker_interruptCount = (tmp_stamp > us_ticker_timestamp) ? (tmp_stamp - us_ticker_timestamp):(tmp_stamp + TIMER0_MAX_COUNT - us_ticker_timestamp) ;
|
||||
|
||||
/* Disable timer */
|
||||
US_TICKER_TIMER->TCTRL &= (~TIMER0_CONTROL_ENABLE);
|
||||
|
||||
US_TICKER_TIMER->LDCNT = us_ticker_interruptCount << TIMER0_SHIFTBITS ;
|
||||
|
||||
/* Enable timer */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_ENABLE);
|
||||
|
||||
/* Unmask timer, enable an overflow int */
|
||||
US_TICKER_TIMER->TCTRL &= (~(TIMER0_CONTROL_INT_MSK));
|
||||
core_util_critical_section_exit();
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
void us_ticker_fire_interrupt(void)
|
||||
{
|
||||
if (!us_ticker_inited) {
|
||||
return ;
|
||||
}
|
||||
|
||||
core_util_critical_section_enter();
|
||||
us_ticker_soft_int_flag = 1 ;
|
||||
NVIC_SetPendingIRQ(TIMER_IRQn);
|
||||
core_util_critical_section_exit();
|
||||
}
|
||||
|
||||
void us_ticker_disable_interrupt_help(void)
|
||||
{
|
||||
if (!us_ticker_inited) {
|
||||
return ;
|
||||
}
|
||||
|
||||
/* Mask timer, disable an overflow int */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_INT_MSK);
|
||||
}
|
||||
|
||||
void us_ticker_disable_interrupt(void)
|
||||
{
|
||||
if (!us_ticker_inited) {
|
||||
return ;
|
||||
}
|
||||
|
||||
core_util_critical_section_enter();
|
||||
/* Mask timer, disable an overflow int */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_INT_MSK);
|
||||
|
||||
us_ticker_timestamp = us_ticker_read();
|
||||
us_ticker_interruptCount = TIMER0_MAX_COUNT;
|
||||
|
||||
/* Disable timer */
|
||||
US_TICKER_TIMER->TCTRL &= (~TIMER0_CONTROL_ENABLE);
|
||||
|
||||
/* Set timer count */
|
||||
US_TICKER_TIMER->LDCNT = TIMER0_LDCNT_INIT_VAL;
|
||||
|
||||
/* Enable timer */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_ENABLE);
|
||||
|
||||
/* mask timer, disable an overflow int */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_INT_MSK);
|
||||
core_util_critical_section_exit();
|
||||
}
|
||||
|
||||
void us_ticker_clear_interrupt(void)
|
||||
{
|
||||
if (!us_ticker_inited) {
|
||||
return ;
|
||||
}
|
||||
|
||||
us_ticker_clrInt = US_TICKER_TIMER->INTCLR;
|
||||
}
|
||||
|
||||
const ticker_info_t* us_ticker_get_info()
|
||||
{
|
||||
static const ticker_info_t info =
|
||||
{
|
||||
5000000, // 5MHZ
|
||||
29 // 29 bit counter
|
||||
};
|
||||
return &info;
|
||||
}
|
||||
|
||||
void us_ticker_free(void)
|
||||
{
|
||||
if (!us_ticker_inited) {
|
||||
return ;
|
||||
}
|
||||
|
||||
core_util_critical_section_enter();
|
||||
us_ticker_disable_interrupt_help();
|
||||
us_ticker_clear_interrupt();
|
||||
|
||||
/* Disable timer */
|
||||
US_TICKER_TIMER->TCTRL &= (~TIMER0_CONTROL_ENABLE);
|
||||
|
||||
us_ticker_inited = 0;
|
||||
us_ticker_timestamp = 0 ;
|
||||
us_ticker_interruptCount = 0 ;
|
||||
core_util_critical_section_exit();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void us_ticker_irq_callback()
|
||||
{
|
||||
|
||||
us_ticker_clear_interrupt () ;
|
||||
|
||||
if (us_ticker_soft_int_flag == 1) {
|
||||
us_ticker_soft_int_flag = 0 ;
|
||||
return ;
|
||||
}
|
||||
|
||||
core_util_critical_section_enter();
|
||||
/* Check the flag firstly, because following hanlder can change it */
|
||||
us_ticker_disable_interrupt_help();
|
||||
|
||||
/* Disable timer */
|
||||
US_TICKER_TIMER->TCTRL &= (~TIMER0_CONTROL_ENABLE);
|
||||
|
||||
US_TICKER_TIMER->LDCNT = TIMER0_LDCNT_INIT_VAL ;
|
||||
|
||||
/* Enable timer */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_ENABLE);
|
||||
|
||||
/* mask timer, disable an overflow int */
|
||||
US_TICKER_TIMER->TCTRL |= (TIMER0_CONTROL_INT_MSK);
|
||||
|
||||
core_util_critical_section_exit();
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2016 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_MBED_RTX_H
|
||||
#define MBED_MBED_RTX_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef OS_TASKCNT
|
||||
#define OS_TASKCNT 14
|
||||
#endif
|
||||
#ifndef OS_MAINSTKSIZE
|
||||
#define OS_MAINSTKSIZE 256
|
||||
#endif
|
||||
#ifndef OS_CLOCK
|
||||
#define OS_CLOCK 160000000
|
||||
#endif
|
||||
|
||||
#if defined(__CC_ARM)
|
||||
extern uint32_t Image$$ARM_LIB_HEAP$$ZI$$Base[];
|
||||
extern uint32_t Image$$ARM_LIB_HEAP$$ZI$$Length[];
|
||||
extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Base[];
|
||||
extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Length[];
|
||||
#define HEAP_START ((unsigned char*) Image$$ARM_LIB_HEAP$$ZI$$Base)
|
||||
#define HEAP_SIZE ((uint32_t) Image$$ARM_LIB_HEAP$$ZI$$Length)
|
||||
#define ISR_STACK_START ((unsigned char*)Image$$ARM_LIB_STACK$$ZI$$Base)
|
||||
#define ISR_STACK_SIZE ((uint32_t)Image$$ARM_LIB_STACK$$ZI$$Length)
|
||||
#elif defined(__GNUC__)
|
||||
extern uint32_t __StackTop[];
|
||||
extern uint32_t __StackLimit[];
|
||||
extern uint32_t __end__[];
|
||||
extern uint32_t __HeapLimit[];
|
||||
#define HEAP_START ((unsigned char*)__end__)
|
||||
#define HEAP_SIZE ((uint32_t)((uint32_t)__HeapLimit - (uint32_t)HEAP_START))
|
||||
#define ISR_STACK_START ((unsigned char*)__StackLimit)
|
||||
#define ISR_STACK_SIZE ((uint32_t)((uint32_t)__StackTop - (uint32_t)__StackLimit))
|
||||
#elif defined(__ICCARM__)
|
||||
/* No region declarations needed */
|
||||
#else
|
||||
#error "no toolchain defined"
|
||||
#endif
|
||||
|
||||
#endif // MBED_MBED_RTX_H
|
|
@ -7398,5 +7398,19 @@
|
|||
"device_name": "TMPM3HQFDFG",
|
||||
"detect_code": ["7014"],
|
||||
"release_versions": ["5"]
|
||||
},
|
||||
"RDA5981X": {
|
||||
"inherits": ["Target"],
|
||||
"core": "Cortex-M4F",
|
||||
"public": true,
|
||||
"extra_labels": ["RDA", "UNO_91H", "FLASH_CMSIS_ALGO"],
|
||||
"supported_toolchains": ["ARM", "GCC_ARM", "IAR"],
|
||||
"macros": ["TWO_RAM_REGIONS", "CMSIS_NVIC_VIRTUAL", "CMSIS_NVIC_VIRTUAL_HEADER_FILE=\"RDA5981_nvic_virtual.h\""],
|
||||
"device_has": ["USTICKER", "PORTIN", "PORTOUT", "PORTINOUT", "INTERRUPTIN", "SERIAL", "STDIO_MESSAGES", "PWMOUT", "SPI", "SLEEP", "ANALOGIN", "FLASH", "TRNG"],
|
||||
"release_versions": ["2", "5"]
|
||||
},
|
||||
"UNO_91H": {
|
||||
"inherits": ["RDA5981X"],
|
||||
"detect_code": ["8001"]
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue