fix bumblebee irq entry aligment, fix eclic

This commit is contained in:
acevest
2020-01-09 20:18:18 +08:00
parent 5920066f21
commit bce32faac2
12 changed files with 113 additions and 41 deletions

View File

@@ -75,13 +75,13 @@ static void eclic_set_irq_level(uint32_t source, uint8_t level) {
return ;
}
uint8_t intctrl_val = eclic_get_intctrl(CLIC_INT_TMR);
uint8_t intctrl_val = eclic_get_intctrl(source);
intctrl_val <<= nlbits;
intctrl_val >>= nlbits;
intctrl_val |= (level << (8- nlbits));
eclic_set_intctrl(CLIC_INT_TMR, intctrl_val);
eclic_set_intctrl(source, intctrl_val);
}
static void eclic_set_irq_priority(uint32_t source, uint8_t priority) {
@@ -98,29 +98,34 @@ static void eclic_set_irq_priority(uint32_t source, uint8_t priority) {
pad >>= cicbits;
uint8_t intctrl_val = eclic_get_intctrl(CLIC_INT_TMR);
uint8_t intctrl_val = eclic_get_intctrl(source);
intctrl_val >>= (8 - nlbits);
intctrl_val <<= (8 - nlbits);
intctrl_val |= (priority << (8 - cicbits));
intctrl_val |= pad;
eclic_set_intctrl(CLIC_INT_TMR, intctrl_val);
eclic_set_intctrl(source, intctrl_val);
}
void rv32_exception_entry();
#define USE_DEFAULT_IRQ_ENTRY 1
__PORT__ void port_cpu_init() {
__ASM__ __VOLATILE__("csrw mtvec, %0"::"r"(rv32_exception_entry));
void rv32_exception_entry();
uint32_t entry = (uint32_t) rv32_exception_entry;
// 0x03 means use eclic
__ASM__ __VOLATILE__("csrw mtvec, %0"::"r"(entry | 0x03));
// MTVT2: 0x7EC
// set mtvt2.MTVT2EN = 0 needs to clear bit 0
// use mtvec as entry of irq and other trap
__ASM__ __VOLATILE__("csrc 0x7EC, 0x1");
eclic_enable_interrupt(CLIC_INT_TMR);
eclic_set_irq_level(CLIC_INT_TMR, 0);
}
__PORT__ void port_systick_priority_set(uint32_t priority) {
@@ -129,7 +134,7 @@ __PORT__ void port_systick_priority_set(uint32_t priority) {
__PORT__ void *port_get_irq_vector_table() {
void *base = 0;
unsigned int *base = 0;
// MTVT: 0x307
__ASM__ __VOLATILE__("csrr %0, 0x307":"=r"(base));

View File

@@ -15,15 +15,23 @@
* within TencentOS.
*---------------------------------------------------------------------------*/
.global eclic_mtip_handler
//.global eclic_mtip_handler
//.section .text
#if 0
.global irq_entry
.global trap_entry
.align 2
irq_entry:
nop
nop
nop
nop
j rv32_exception_entry
j irq_entry
.align 2
trap_entry:
j trap_entry
#endif

View File

@@ -159,15 +159,21 @@ void cpu_trap_entry(cpu_data_t cause, cpu_context_t *regs)
}
}
void eclic_mtip_handler();
void cpu_irq_entry(cpu_data_t irq)
{
void (*irq_handler)();
typedef void (*irq_handler_t)();
irq_handler = *((void (**)())(port_get_irq_vector_table() + irq*sizeof(cpu_addr_t)));
if((*irq_handler) == 0) {
irq_handler_t *irq_handler_base = port_get_irq_vector_table();
irq_handler_t irq_handler = irq_handler_base[irq];
if(irq_handler == 0) {
return;
}
(*irq_handler)();
}
@@ -175,27 +181,27 @@ __API__ uint32_t tos_cpu_clz(uint32_t val)
{
uint32_t nbr_lead_zeros = 0;
if (!(val & 0XFFFF0000)) {
if (!(val & 0xFFFF0000)) {
val <<= 16;
nbr_lead_zeros += 16;
}
if (!(val & 0XFF000000)) {
if (!(val & 0xFF000000)) {
val <<= 8;
nbr_lead_zeros += 8;
}
if (!(val & 0XF0000000)) {
if (!(val & 0xF0000000)) {
val <<= 4;
nbr_lead_zeros += 4;
}
if (!(val & 0XC0000000)) {
if (!(val & 0xC0000000)) {
val <<= 2;
nbr_lead_zeros += 2;
}
if (!(val & 0X80000000)) {
if (!(val & 0x80000000)) {
nbr_lead_zeros += 1;
}

View File

@@ -267,7 +267,7 @@ restore_context:
mret
.align 2
.align 6
.global rv32_exception_entry
rv32_exception_entry:
addi sp, sp, -128

View File

@@ -104,10 +104,10 @@ typedef enum
#define COMn 2U
#define EVAL_COM0 USART2
#define EVAL_COM0_CLK RCU_USART2
#define EVAL_COM0_TX_PIN GPIO_PIN_2
#define EVAL_COM0_RX_PIN GPIO_PIN_3
#define EVAL_COM0 USART0
#define EVAL_COM0_CLK RCU_USART0
#define EVAL_COM0_TX_PIN GPIO_PIN_9
#define EVAL_COM0_RX_PIN GPIO_PIN_10
#define EVAL_COM0_GPIO_PORT GPIOA
#define EVAL_COM0_GPIO_CLK RCU_GPIOA
@@ -123,7 +123,7 @@ typedef enum
#define EVAL_COM3_TX_PIN GPIO_PIN_10
#define EVAL_COM3_RX_PIN GPIO_PIN_11
#define EVAL_COM3_GPIO_PORT GPIOC
#define EVAL_COM3_GPIO_CLK RCU_GPIOC
#define EVAL_COM3_GPIO_CLK RCU_GPIOB
#define KEYn 3U

View File

@@ -11,7 +11,7 @@
#define USART2_GPIO_TX_PIN GPIO_PIN_10
#define USART2_GPIO_RX_PIN GPIO_PIN_11
#define USART2_GPIO_PORT GPIOC
#define USART2_GPIO_PORT GPIOB
void usart0_init(int baud);

View File

@@ -2,6 +2,10 @@
#include "usart.h"
void usart0_init(int baud)
{
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
eclic_irq_enable(USART0_IRQn, 1, 0);
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
@@ -25,10 +29,14 @@ void usart0_init(int baud)
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_enable(USART0);
usart_interrupt_enable(USART0, USART_INT_RBNE);
}
void usart1_init(int baud)
{
eclic_irq_enable(USART1_IRQn, 1, 0);
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
@@ -52,14 +60,19 @@ void usart1_init(int baud)
usart_receive_config(USART1, USART_RECEIVE_ENABLE);
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
usart_enable(USART1);
usart_interrupt_enable(USART1, USART_INT_RBNE);
}
void usart2_init(int baud)
{
eclic_irq_enable(USART2_IRQn, 1, 0);
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_GPIOB);
/* enable USART2 clock */
rcu_periph_clock_enable(RCU_USART2);
@@ -70,7 +83,7 @@ void usart2_init(int baud)
/* connect port to USART0_Rx */
gpio_init(USART2_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, USART2_GPIO_RX_PIN);
gpio_pin_remap_config(GPIO_USART2_FULL_REMAP,ENABLE);
//gpio_pin_remap_config(GPIO_USART2_FULL_REMAP,ENABLE);
/* USART1 configure */
usart_deinit(USART2);
@@ -83,6 +96,9 @@ void usart2_init(int baud)
usart_receive_config(USART2, USART_RECEIVE_ENABLE);
usart_transmit_config(USART2, USART_TRANSMIT_ENABLE);
usart_enable(USART2);
usart_interrupt_enable(USART2, USART_INT_RBNE);
}

View File

@@ -187,7 +187,7 @@
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile.134450266" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile" useByScannerDiscovery="false" valueType="stringList">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/link.lds}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/GD32VF103_Firmware_Library/RISCV/env_Eclipse/GD32VF103xB.lds}&quot;"/>
</option>

View File

@@ -1,11 +1,38 @@
#include "mcu_init.h"
#include "tos_k.h"
#define TASK_SIZE 1024
#define BLED_TASK_SIZE 1024
#define WIFI_TASK_SIZE 4096
k_task_t k_task_bled;
k_task_t k_task_wifi;
uint8_t k_bled_stk[TASK_SIZE];
uint8_t k_wifi_stk[TASK_SIZE];
uint8_t k_bled_stk[BLED_TASK_SIZE];
uint8_t k_wifi_stk[WIFI_TASK_SIZE];
void USART0_IRQHandler() {
#if 0
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
uint8_t data = usart_data_receive(USART0);
printf("%c\n", data);
}
#endif
}
void USART1_IRQHandler() {
if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE)){
uint8_t data = usart_data_receive(USART1);
//tos_at_uart_input_byte(data);
printf("-%c\n", data);
}
}
void USART2_IRQHandler() {
if(RESET != usart_interrupt_flag_get(USART2, USART_INT_FLAG_RBNE)){
uint8_t data = usart_data_receive(USART2);
tos_at_uart_input_byte(data);
}
//printf("usart2\n");
}
void task_bled(void *pdata)
{
@@ -33,8 +60,10 @@ void main(void) {
tos_knl_init();
tos_task_create(&k_task_bled, "bled", task_bled, NULL, 5, k_bled_stk, TASK_SIZE, 0);
tos_task_create(&k_task_wifi, "wifi", task_wifi, NULL, 3, k_wifi_stk, TASK_SIZE, 0);
usart0_init(115200);
tos_task_create(&k_task_bled, "bled", task_bled, NULL, 5, k_bled_stk, BLED_TASK_SIZE, 0);
tos_task_create(&k_task_wifi, "wifi", task_wifi, NULL, 3, k_wifi_stk, WIFI_TASK_SIZE, 0);
tos_knl_start();

View File

@@ -3,13 +3,13 @@
#define MQTT_SERVER_IP "111.230.189.156"
#define MQTT_SERVER_PORT "1883"
#define MQTT_PRODUCT_ID "RUAP1R610V"
#define MQTT_DEV_NAME "supowang"
#define MQTT_CLIENT_ID "RUAP1R610Vsupowang"
#define MQTT_USR_NAME "RUAP1R610Vsupowang;21010406;12365;4294967295"
#define MQTT_PASSWORD "1371ae55cd1036f088bd7e39d230712bc3c32c40;hmacsha1"
#define MQTT_SUBSCRIBE_TOPIC "RUAP1R610V/supowang/data"
#define MQTT_PUBLISH_TOPIC "RUAP1R610V/supowang/data"
#define MQTT_PRODUCT_ID "Z774IYDTH0"
#define MQTT_DEV_NAME "ChinaMobileStandardBoard"
#define MQTT_CLIENT_ID "Z774IYDTH0ChinaMobileStandardBoard"
#define MQTT_USR_NAME "Z774IYDTH0ChinaMobileStandardBoard;12010126;RJW8Z;1614485713"
#define MQTT_PASSWORD "83c5188935eb67708ca5cf3245f4eb3f19b78004e6a0e7d438206939705fc808;hmacsha256"
#define MQTT_SUBSCRIBE_TOPIC "Z774IYDTH0/ChinaMobileStandardBoard/cmd"
#define MQTT_PUBLISH_TOPIC "Z774IYDTH0/ChinaMobileStandardBoard/gps"
#endif

View File

@@ -35,8 +35,8 @@ void mqtt_demo(void)
sub_opt.topic = MQTT_SUBSCRIBE_TOPIC;
#ifdef USE_ESP8266
esp8266_sal_init(HAL_UART_PORT_0);
esp8266_join_ap("SheldonDai", "srnr6x9xbhmb0");
esp8266_sal_init(HAL_UART_PORT_1);
esp8266_join_ap("AceiPhone", "12345678");
#endif
#ifdef USE_NB_BC35

View File

@@ -19,15 +19,23 @@ __API__ int tos_hal_uart_init(hal_uart_t *uart, hal_uart_port_t port)
}
if (port == HAL_UART_PORT_0) {
uart->private_uart = &huart0;
usart0_init(115200);
} else if (port == HAL_UART_PORT_1) {
uart->private_uart = &huart1;
usart1_init(115200);
} else if (port == HAL_UART_PORT_2) {
uart->private_uart = &huart2;
usart2_init(115200);
} else {
return -1;
}
uart->port = ((UART_HandleTypeDef*)(uart->private_uart))->port;
return 0;
}