forked from xuos/xiuos
fix e220 lora send and receive bug using ch438 uart in xidatong board
This commit is contained in:
parent
99b5c0d9a0
commit
e5296efa91
|
@ -117,6 +117,12 @@ enum IpType
|
||||||
IPV6,
|
IPV6,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AdapterData
|
||||||
|
{
|
||||||
|
uint32 len;
|
||||||
|
uint8 *buffer;
|
||||||
|
};
|
||||||
|
|
||||||
struct AdapterProductInfo
|
struct AdapterProductInfo
|
||||||
{
|
{
|
||||||
uint32_t functions;
|
uint32_t functions;
|
||||||
|
|
|
@ -29,8 +29,8 @@ extern AdapterProductInfoType E220Attach(struct Adapter *adapter);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ADAPTER_LORA_CLIENT_NUM 255
|
#define ADAPTER_LORA_CLIENT_NUM 255
|
||||||
#define ADAPTER_LORA_DATA_LENGTH 128
|
#define ADAPTER_LORA_DATA_LENGTH 256
|
||||||
#define ADAPTER_LORA_RECV_DATA_LENGTH 256
|
#define ADAPTER_LORA_RECV_DATA_LENGTH ADAPTER_LORA_DATA_LENGTH + 16
|
||||||
|
|
||||||
#define ADAPTER_LORA_DATA_HEAD 0x3C
|
#define ADAPTER_LORA_DATA_HEAD 0x3C
|
||||||
#define ADAPTER_LORA_NET_PANID 0x0102
|
#define ADAPTER_LORA_NET_PANID 0x0102
|
||||||
|
@ -167,13 +167,7 @@ static int LoraReceiveDataCheck(uint8 *data, uint16 length, struct LoraDataForma
|
||||||
uint32 recv_data_length = 0;
|
uint32 recv_data_length = 0;
|
||||||
for ( i = 0; i < length; i ++) {
|
for ( i = 0; i < length; i ++) {
|
||||||
if (ADAPTER_LORA_DATA_HEAD == data[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);
|
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) {
|
if (sizeof(struct LoraDataFormat) == recv_data_length) {
|
||||||
memcpy(recv_data, (uint8 *)(data + i), sizeof(struct LoraDataFormat));
|
memcpy(recv_data, (uint8 *)(data + i), sizeof(struct LoraDataFormat));
|
||||||
return 0;
|
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)
|
static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid)
|
||||||
{
|
{
|
||||||
struct LoraDataFormat client_join_data;
|
struct LoraDataFormat client_join_data;
|
||||||
|
struct AdapterData priv_lora_net;
|
||||||
|
|
||||||
memset(&client_join_data, 0, sizeof(struct LoraDataFormat));
|
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.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);
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -498,18 +496,22 @@ static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid)
|
||||||
*/
|
*/
|
||||||
static int LoraClientQuitNet(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_quit_data.flame_head = ADAPTER_LORA_DATA_HEAD;
|
||||||
client_join_data.length = sizeof(struct LoraDataFormat);
|
client_quit_data.length = sizeof(struct LoraDataFormat);
|
||||||
client_join_data.panid = panid;
|
client_quit_data.panid = panid;
|
||||||
client_join_data.data_type = ADAPTER_LORA_DATA_TYPE_QUIT;
|
client_quit_data.data_type = ADAPTER_LORA_DATA_TYPE_QUIT;
|
||||||
client_join_data.client_id = adapter->net_role_id;
|
client_quit_data.client_id = adapter->net_role_id;
|
||||||
client_join_data.crc16 = LoraCrc16((uint8 *)&client_join_data, sizeof(struct LoraDataFormat) - 2);
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -623,7 +625,6 @@ static void *LoraGatewayTask(void *parameter)
|
||||||
static void *LoraClientDataTask(void *parameter)
|
static void *LoraClientDataTask(void *parameter)
|
||||||
{
|
{
|
||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
int join_times = 10;
|
|
||||||
struct Adapter *lora_adapter = (struct Adapter *)parameter;
|
struct Adapter *lora_adapter = (struct Adapter *)parameter;
|
||||||
struct LoraClientParam *client = (struct LoraClientParam *)lora_adapter->adapter_param;
|
struct LoraClientParam *client = (struct LoraClientParam *)lora_adapter->adapter_param;
|
||||||
|
|
||||||
|
|
|
@ -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)
|
static int E220Join(struct Adapter *adapter, unsigned char *priv_net_group)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
|
||||||
|
|
||||||
uint16 len = 144;
|
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
|
||||||
|
|
||||||
ret = PrivWrite(adapter->fd, (void *)priv_net_group, len);
|
|
||||||
if(ret < 0) {
|
if(ret < 0) {
|
||||||
printf("E220 Join net group failed: %d!\n", ret);
|
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)
|
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;
|
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){
|
if(ret < 0){
|
||||||
printf("E220 quit net group failed %d!\n", ret);
|
printf("E220 quit net group failed %d!\n", ret);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group)
|
||||||
{
|
{
|
||||||
int ret;
|
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){
|
if(ret < 0){
|
||||||
printf("Sx1278 Join net group failed: %d!\n", ret);
|
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)
|
static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group)
|
||||||
{
|
{
|
||||||
int ret;
|
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){
|
if(ret < 0){
|
||||||
printf("Sx1278 Join net group failed: %d!\n", ret);
|
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)
|
static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group)
|
||||||
{
|
{
|
||||||
int ret;
|
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){
|
if(ret < 0){
|
||||||
printf("Sx1278 quit net group failed %d!\n", ret);
|
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)
|
static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group)
|
||||||
{
|
{
|
||||||
int ret;
|
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){
|
if(ret < 0){
|
||||||
printf("Sx1278 quit net group failed %d!\n", ret);
|
printf("Sx1278 quit net group failed %d!\n", ret);
|
||||||
}
|
}
|
||||||
|
|
|
@ -629,7 +629,7 @@ void WriteCH438Block(uint8 maddr, uint8 mlen, uint8 *mbuf)
|
||||||
** date:
|
** 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;
|
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(dev);
|
||||||
NULL_PARAM_CHECK(write_param);
|
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 SerialHardwareDevice *serial_dev = (struct SerialHardwareDevice *)dev;
|
||||||
struct SerialDevParam *dev_param = (struct SerialDevParam *)serial_dev->haldev.private_data;
|
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;
|
return EOK;
|
||||||
}
|
}
|
||||||
|
@ -1028,6 +1053,12 @@ static uint32 ImxrtCh438ReadData(void *dev, struct BusBlockReadParam *read_param
|
||||||
read_param->read_length = rcv_num;
|
read_param->read_length = rcv_num;
|
||||||
|
|
||||||
interrupt_done = 1;
|
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]);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue