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