fix e220 lora send and receive bug using ch438 uart in xidatong board

This commit is contained in:
Liu_Weichao 2022-04-25 10:52:05 +08:00
parent 99b5c0d9a0
commit e5296efa91
5 changed files with 91 additions and 31 deletions

View File

@ -117,6 +117,12 @@ enum IpType
IPV6,
};
struct AdapterData
{
uint32 len;
uint8 *buffer;
};
struct AdapterProductInfo
{
uint32_t functions;

View File

@ -29,8 +29,8 @@ extern AdapterProductInfoType E220Attach(struct Adapter *adapter);
#endif
#define ADAPTER_LORA_CLIENT_NUM 255
#define ADAPTER_LORA_DATA_LENGTH 128
#define ADAPTER_LORA_RECV_DATA_LENGTH 256
#define ADAPTER_LORA_DATA_LENGTH 256
#define ADAPTER_LORA_RECV_DATA_LENGTH ADAPTER_LORA_DATA_LENGTH + 16
#define ADAPTER_LORA_DATA_HEAD 0x3C
#define ADAPTER_LORA_NET_PANID 0x0102
@ -167,13 +167,7 @@ static int LoraReceiveDataCheck(uint8 *data, uint16 length, struct LoraDataForma
uint32 recv_data_length = 0;
for ( i = 0; i < length; i ++) {
if (ADAPTER_LORA_DATA_HEAD == data[i]) {
#ifdef ADD_NUTTX_FETURES
/*Big-Endian*/
recv_data_length = (data[i + 4] & 0xFF) | ((data[i + 5] & 0xFF) << 8) | ((data[i + 6] & 0xFF) << 16) | ((data[i + 7] & 0xFF) << 24);
#else
/*Little-Endian*/
recv_data_length = ((data[i + 4] & 0xFF) << 24) | ((data[i + 5] & 0xFF) << 16) | ((data[i + 6] & 0xFF) << 8) | (data[i + 7] & 0xFF);
#endif
if (sizeof(struct LoraDataFormat) == recv_data_length) {
memcpy(recv_data, (uint8 *)(data + i), sizeof(struct LoraDataFormat));
return 0;
@ -469,6 +463,7 @@ static int LoraClientDataAnalyze(struct Adapter *adapter, void *send_buf, int le
static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid)
{
struct LoraDataFormat client_join_data;
struct AdapterData priv_lora_net;
memset(&client_join_data, 0, sizeof(struct LoraDataFormat));
@ -484,7 +479,10 @@ static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid)
client_join_data.flame_head, client_join_data.length, client_join_data.panid, client_join_data.data_type,
client_join_data.client_id, client_join_data.gateway_id, client_join_data.crc16);
if (AdapterDeviceJoin(adapter, (uint8 *)&client_join_data) < 0) {
priv_lora_net.len = sizeof(struct LoraDataFormat);
priv_lora_net.buffer = (uint8 *)&client_join_data;
if (AdapterDeviceJoin(adapter, (uint8 *)&priv_lora_net) < 0) {
return -1;
}
@ -498,18 +496,22 @@ static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid)
*/
static int LoraClientQuitNet(struct Adapter *adapter, unsigned short panid)
{
struct LoraDataFormat client_join_data;
struct LoraDataFormat client_quit_data;
struct AdapterData priv_lora_net;
memset(&client_join_data, 0, sizeof(struct LoraDataFormat));
memset(&client_quit_data, 0, sizeof(struct LoraDataFormat));
client_join_data.flame_head = ADAPTER_LORA_DATA_HEAD;
client_join_data.length = sizeof(struct LoraDataFormat);
client_join_data.panid = panid;
client_join_data.data_type = ADAPTER_LORA_DATA_TYPE_QUIT;
client_join_data.client_id = adapter->net_role_id;
client_join_data.crc16 = LoraCrc16((uint8 *)&client_join_data, sizeof(struct LoraDataFormat) - 2);
client_quit_data.flame_head = ADAPTER_LORA_DATA_HEAD;
client_quit_data.length = sizeof(struct LoraDataFormat);
client_quit_data.panid = panid;
client_quit_data.data_type = ADAPTER_LORA_DATA_TYPE_QUIT;
client_quit_data.client_id = adapter->net_role_id;
client_quit_data.crc16 = LoraCrc16((uint8 *)&client_quit_data, sizeof(struct LoraDataFormat) - 2);
if (AdapterDeviceDisconnect(adapter, (uint8 *)&client_join_data) < 0) {
priv_lora_net.len = sizeof(struct LoraDataFormat);
priv_lora_net.buffer = (uint8 *)&client_quit_data;
if (AdapterDeviceDisconnect(adapter, (uint8 *)&priv_lora_net) < 0) {
return -1;
}
@ -623,7 +625,6 @@ static void *LoraGatewayTask(void *parameter)
static void *LoraClientDataTask(void *parameter)
{
int i, ret = 0;
int join_times = 10;
struct Adapter *lora_adapter = (struct Adapter *)parameter;
struct LoraClientParam *client = (struct LoraClientParam *)lora_adapter->adapter_param;

View File

@ -344,10 +344,9 @@ static int E220Ioctl(struct Adapter *adapter, int cmd, void *args)
static int E220Join(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
uint16 len = 144;
ret = PrivWrite(adapter->fd, (void *)priv_net_group, len);
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0) {
printf("E220 Join net group failed: %d!\n", ret);
}
@ -383,7 +382,22 @@ static int E220Send(struct Adapter *adapter, const void *buf, size_t len)
*/
static int E220Recv(struct Adapter *adapter, void *buf, size_t len)
{
return PrivRead(adapter->fd, buf, len);
int recv_len, recv_len_continue;
uint8 *recv_buf = PrivMalloc(len);
recv_len = PrivRead(adapter->fd, recv_buf, len);
while (recv_len < len) {
recv_len_continue = PrivRead(adapter->fd, recv_buf + recv_len, len - recv_len);
recv_len += recv_len_continue;
}
memcpy(buf, recv_buf, recv_len);
PrivFree(recv_buf);
return recv_len;
}
/**
@ -396,9 +410,9 @@ static int E220Quit(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
uint16 len = 144;
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = PrivWrite(adapter->fd, (void *)priv_net_group, len);
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("E220 quit net group failed %d!\n", ret);
}

View File

@ -108,7 +108,9 @@ static int Sx1278Ioctl(struct Adapter *adapter, int cmd, void *args)
static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group, 144);
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("Sx1278 Join net group failed: %d!\n", ret);
}
@ -119,7 +121,9 @@ static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group)
static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
ret = PrivWrite(adapter->fd, (void *)priv_net_group, 144);
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("Sx1278 Join net group failed: %d!\n", ret);
}
@ -196,7 +200,9 @@ static int Sx1278Recv(struct Adapter *adapter, void *buf, size_t len)
static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group, 144);
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("Sx1278 quit net group failed %d!\n", ret);
}
@ -207,7 +213,9 @@ static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group)
static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
ret = PrivWrite(adapter->fd, (void *)priv_net_group, 144);
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("Sx1278 quit net group failed %d!\n", ret);
}

View File

@ -629,7 +629,7 @@ void WriteCH438Block(uint8 maddr, uint8 mlen, uint8 *mbuf)
** date:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Ch438UartSend( uint8 ext_uart_no,uint8 *data, uint8 Num )
void Ch438UartSend(uint8 ext_uart_no, uint8 *data, uint16 Num)
{
uint8 REG_LSR_ADDR,REG_THR_ADDR;
@ -958,10 +958,35 @@ static uint32 ImxrtCh438WriteData(void *dev, struct BusBlockWriteParam *write_pa
NULL_PARAM_CHECK(dev);
NULL_PARAM_CHECK(write_param);
int write_len, write_len_continue;
int i, write_index;
uint8 *write_buffer;
struct SerialHardwareDevice *serial_dev = (struct SerialHardwareDevice *)dev;
struct SerialDevParam *dev_param = (struct SerialDevParam *)serial_dev->haldev.private_data;
Ch438UartSend(dev_param->ext_uart_no, (uint8 *)write_param->buffer, write_param->size);
write_len = write_param->size;
write_len_continue = write_param->size;
write_buffer = (uint8 *)write_param->buffer;
if (write_len > 256) {
if (0 == write_len % 256) {
write_index = write_len / 256;
for (i = 0; i < write_index; i ++) {
Ch438UartSend(dev_param->ext_uart_no, write_buffer + i * 256, 256);
}
} else {
write_index = 0;
while (write_len_continue > 256) {
Ch438UartSend(dev_param->ext_uart_no, write_buffer + write_index * 256, 256);
write_index++;
write_len_continue = write_len - write_index * 256;
}
Ch438UartSend(dev_param->ext_uart_no, write_buffer + write_index * 256, write_len_continue);
}
} else {
Ch438UartSend(dev_param->ext_uart_no, write_buffer, write_len);
}
return EOK;
}
@ -1028,6 +1053,12 @@ static uint32 ImxrtCh438ReadData(void *dev, struct BusBlockReadParam *read_param
read_param->read_length = rcv_num;
interrupt_done = 1;
// int i;
// uint8 *buffer = (uint8 *)read_param->buffer;
// for (i = 0; i < rcv_num; i ++) {
// KPrintf("Ch438UartRcv i %u data 0x%x\n", i, buffer[i]);
// }
}
}
}