From 1c775d42f646b5d77a423670239a6091881e569e Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Thu, 24 Aug 2023 14:38:24 +0800 Subject: [PATCH] fix adapter lora bug on edu-arm32 board --- .../Framework/connection/lora/adapter_lora.c | 38 +++++++++++----- .../Framework/control/shared/control.h | 2 +- .../third_party_driver/spi/connect_lora_spi.c | 22 +++------ .../third_party_driver/spi/connect_spi.c | 3 +- .../sx12xx/src/radio/sx1276.c | 45 +++++++++++++++++++ .../sx12xx/src/radio/sx1276.h | 4 ++ .../XiZi_IIoT/lib/newlib/time_syscalls.c | 4 +- 7 files changed, 88 insertions(+), 30 deletions(-) diff --git a/APP_Framework/Framework/connection/lora/adapter_lora.c b/APP_Framework/Framework/connection/lora/adapter_lora.c index 0c44b76bd..6133e52cc 100644 --- a/APP_Framework/Framework/connection/lora/adapter_lora.c +++ b/APP_Framework/Framework/connection/lora/adapter_lora.c @@ -129,6 +129,9 @@ uint8_t lora_recv_data[ADAPTER_LORA_TRANSFER_DATA_LENGTH]; struct LoraDataFormat client_recv_data_format[ADAPTER_LORA_CLIENT_NUM]; static sem_t gateway_recv_data_sem; +static sem_t gateway_send_cmd_sem; +static sem_t client_recv_cmd_sem; +static sem_t client_send_data_sem; struct LoraDataFormat gateway_recv_data_format; static int recv_error_cnt = 0; @@ -315,6 +318,8 @@ static int LoraGatewaySendCmd(struct Adapter *adapter, uint8_t client_id, uint16 return -1; } + PrivSemaphoreAbandon(&gateway_send_cmd_sem); + return 0; } @@ -410,6 +415,7 @@ static int LoraClientSendData(struct Adapter *adapter, void *send_buf, int lengt return -1; } + PrivSemaphoreAbandon(&client_send_data_sem); return 0; } @@ -462,7 +468,7 @@ static int LoraClientDataAnalyze(struct Adapter *adapter, void *send_buf, int le struct timespec abstime; abstime.tv_sec = DEFAULT_SEM_TIMEOUT; - ret = PrivSemaphoreObtainWait(&adapter->sem, &abstime); + ret = PrivSemaphoreObtainWait(&client_recv_cmd_sem, NULL); if (0 == ret) { //only handle this client_id information from gateway if ((client_recv_data_format[client_id - 1].client_id == adapter->net_role_id) && @@ -653,9 +659,15 @@ static int LoraReceiveDataCheck(struct Adapter *adapter, uint8_t *recv_data, uin static void *LoraReceiveTask(void *parameter) { int ret = 0; + struct timespec abstime; + abstime.tv_sec = DEFAULT_SEM_TIMEOUT; + struct Adapter *lora_adapter = (struct Adapter *)parameter; while (1) { +#ifdef AS_LORA_GATEWAY_ROLE + PrivSemaphoreObtainWait(&gateway_send_cmd_sem, NULL); +#endif memset(lora_recv_data, 0, ADAPTER_LORA_TRANSFER_DATA_LENGTH); ret = AdapterDeviceRecv(lora_adapter, lora_recv_data, ADAPTER_LORA_TRANSFER_DATA_LENGTH); @@ -675,8 +687,10 @@ static void *LoraReceiveTask(void *parameter) if (ret < 0) { continue; } - - PrivSemaphoreAbandon(&lora_adapter->sem); +#ifdef AS_LORA_CLIENT_ROLE + PrivSemaphoreAbandon(&client_recv_cmd_sem); + PrivSemaphoreObtainWait(&client_send_data_sem, &abstime); +#endif } return 0; @@ -702,7 +716,7 @@ void LoraGatewayProcess(struct Adapter *lora_adapter, struct LoraGatewayParam *g printf("LoraGatewaySendCmd client ID %d error\n", gateway->client_id[i]); continue; } - + ret = PrivSemaphoreObtainWait(&gateway_recv_data_sem, &abstime); if (0 == ret) { printf("LoraGatewayProcess receive client %d data done\n", gateway->client_id[i]); @@ -904,9 +918,13 @@ int AdapterLoraInit(void) adapter->done = product_info->model_done; #endif - PrivSemaphoreCreate(&adapter->sem, 0, 0); - +#ifdef AS_LORA_GATEWAY_ROLE PrivSemaphoreCreate(&gateway_recv_data_sem, 0, 0); + PrivSemaphoreCreate(&gateway_send_cmd_sem, 0, 0); +#else//AS_LORA_CLIENT_ROLE + PrivSemaphoreCreate(&client_recv_cmd_sem, 0, 0); + PrivSemaphoreCreate(&client_send_data_sem, 0, 0); +#endif PrivMutexCreate(&adapter->lock, 0); @@ -944,9 +962,9 @@ int AdapterLoraTest(void) PrivTaskStartup(&lora_recv_data_task); #ifdef ADD_NUTTX_FEATURES - lora_gateway_attr.priority = 19; + lora_gateway_attr.priority = 20; #else - lora_gateway_attr.schedparam.sched_priority = 19; + lora_gateway_attr.schedparam.sched_priority = 20; #endif PrivTaskCreate(&lora_gateway_task, &lora_gateway_attr, &LoraGatewayTask, (void *)adapter); @@ -966,9 +984,9 @@ int AdapterLoraTest(void) PrivTaskStartup(&lora_recv_data_task); #ifdef ADD_NUTTX_FEATURES - lora_client_attr.priority = 19; + lora_client_attr.priority = 20; #else - lora_client_attr.schedparam.sched_priority = 19; + lora_client_attr.schedparam.sched_priority = 20; #endif //create lora client task diff --git a/APP_Framework/Framework/control/shared/control.h b/APP_Framework/Framework/control/shared/control.h index 2639a4719..de9beac60 100644 --- a/APP_Framework/Framework/control/shared/control.h +++ b/APP_Framework/Framework/control/shared/control.h @@ -67,7 +67,7 @@ typedef enum struct ControlDevice { - char *dev_name; + char dev_name[20]; int status; //to do diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/connect_lora_spi.c b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/connect_lora_spi.c index c949d38e7..129455867 100644 --- a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/connect_lora_spi.c +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/connect_lora_spi.c @@ -191,8 +191,8 @@ static uint32 SpiLoraWrite(void *dev, struct BusBlockWriteParam *write_param) KPrintf("SpiLoraWrite ERROR:The message is too long!\n"); return ERROR; } else { - SX1276SetTxPacket(write_param->buffer, write_param->size); - while(SX1276Process() != RF_TX_DONE); + SX1276SetTx(write_param->buffer, write_param->size); + KPrintf("SpiLoraWrite success!\n"); } @@ -210,24 +210,12 @@ static uint32 SpiLoraRead(void *dev, struct BusBlockReadParam *read_param) NULL_PARAM_CHECK(dev); NULL_PARAM_CHECK(read_param); - int read_times = 100; - - SX1276StartRx(); KPrintf("SpiLoraRead Ready!\n"); - while (read_times) { - if (SX1276Process() != RF_RX_DONE) { - read_times --; - MdelayKTask(500); - } else { - break; - } - } + int ret = SX1276GetRx(read_param->buffer, (uint16 *)&read_param->read_length); - if (read_times > 0) { - SX1276GetRxPacket(read_param->buffer, (uint16 *)&read_param->read_length); - } else { - read_param->read_length = 0; + if (ret < 0) { + return 0; } return read_param->read_length; diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/connect_spi.c b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/connect_spi.c index 24dc5e8ef..d2ba6d337 100644 --- a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/connect_spi.c +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/connect_spi.c @@ -494,6 +494,7 @@ int HwSpiInit(void) return ret; } +#ifdef TEST_SPI /*Just for lora test*/ static struct Bus *bus; static struct HardwareDev *dev; @@ -578,4 +579,4 @@ void TestLoraOpen(void) SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), TestLoraOpen, TestLoraOpen, open lora device and read parameters); - +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/third_party_spi_lora/sx12xx/src/radio/sx1276.c b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/third_party_spi_lora/sx12xx/src/radio/sx1276.c index e694f2b75..19e9bd528 100644 --- a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/third_party_spi_lora/sx12xx/src/radio/sx1276.c +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/third_party_spi_lora/sx12xx/src/radio/sx1276.c @@ -50,6 +50,9 @@ uint8_t SX1276Regs[0x70]; static bool LoRaOn = true; static bool LoRaOnState = false; +static int sx1276_tx_sem, sx1276_rx_sem; +static int sx1276_radio_task; + void SX1276Reset(void) { uint32_t startTick; @@ -200,6 +203,20 @@ void SX1276GetRxPacket(void *buffer, uint16_t *size) } } +int SX1276GetRx(void *buffer, uint16_t *size) +{ + int ret = -1; + SX1276StartRx(); + + //receive timeout 10s + ret = KSemaphoreObtain(sx1276_rx_sem, 10000); + if (0 == ret) { + SX1276LoRaSetRFState(RFLR_STATE_IDLE); + SX1276GetRxPacket(buffer, size); + } + return ret; +} + void SX1276SetTxPacket(const void *buffer, uint16_t size) { if(LoRaOn == false) { @@ -209,6 +226,14 @@ void SX1276SetTxPacket(const void *buffer, uint16_t size) } } +void SX1276SetTx(const void *buffer, uint16_t size) +{ + SX1276SetTxPacket(buffer, size); + + KSemaphoreObtain(sx1276_tx_sem, WAITING_FOREVER); + SX1276StartRx(); +} + uint8_t SX1276GetRFState(void) { if(LoRaOn == false) { @@ -236,6 +261,20 @@ uint32_t SX1276Process(void) } } +static void Sx1276RadioEntry(void *parameter) +{ + uint32_t result; + while(1) { + result = SX1276Process(); + if (RF_RX_DONE == result) { + KSemaphoreAbandon(sx1276_rx_sem); + } + if (RF_TX_DONE == result) { + KSemaphoreAbandon(sx1276_tx_sem); + } + } +} + uint32_t SX1276ChannelEmpty(void) { if(LoRaOn == false) { @@ -277,6 +316,12 @@ void SX1276Init(void) SX1276_SetLoRaOn(LoRaOn); SX1276LoRaInit(); #endif + + sx1276_rx_sem = KSemaphoreCreate(0); + sx1276_tx_sem = KSemaphoreCreate(0); + + sx1276_radio_task = KTaskCreate("radio", Sx1276RadioEntry , NONE, 2048, 20); + StartupKTask(sx1276_radio_task); } #endif diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/third_party_spi_lora/sx12xx/src/radio/sx1276.h b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/third_party_spi_lora/sx12xx/src/radio/sx1276.h index 0230420ca..44699274e 100644 --- a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/third_party_spi_lora/sx12xx/src/radio/sx1276.h +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/spi/third_party_spi_lora/sx12xx/src/radio/sx1276.h @@ -80,8 +80,12 @@ void SX1276StartRx( void ); //开始接收 void SX1276GetRxPacket( void *buffer, uint16_t *size ); //得到接收的数据 +int SX1276GetRx(void *buffer, uint16_t *size); //应用接收数据,无数据时阻塞 + void SX1276SetTxPacket( const void *buffer, uint16_t size ); //发送数据 +void SX1276SetTx( const void *buffer, uint16_t size ); //应用发送数据 + uint8_t SX1276GetRFState( void ); //得到RFLRState状态 void SX1276SetRFState( uint8_t state ); //设置RFLRState状态,RFLRState的值决定了下面的函数处理哪一步的代码 diff --git a/Ubiquitous/XiZi_IIoT/lib/newlib/time_syscalls.c b/Ubiquitous/XiZi_IIoT/lib/newlib/time_syscalls.c index 10f1efcb6..885bd8a1e 100644 --- a/Ubiquitous/XiZi_IIoT/lib/newlib/time_syscalls.c +++ b/Ubiquitous/XiZi_IIoT/lib/newlib/time_syscalls.c @@ -16,7 +16,9 @@ time_t time(time_t *t) { - NULL_PARAM_CHECK(t); + if (NULL == t) { + return 0; + } time_t current = 0; #ifdef RESOURCES_RTC