|
@@ -19,6 +19,8 @@
|
|
|
#define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
|
|
|
#define PASS 1
|
|
|
#define FAIL -1
|
|
|
+#define YES 1
|
|
|
+#define NO 0
|
|
|
|
|
|
struct SysConfigAndInfo *ShmSysConfigAndInfo;
|
|
|
struct StatusCodeData *ShmStatusCodeData;
|
|
@@ -444,14 +446,35 @@ int Upgrade_Flash(unsigned int Type,char *SourcePath,char *ModelName)
|
|
|
//================================================
|
|
|
// UART update function
|
|
|
//================================================
|
|
|
+void displayMessage(uint8_t *data, uint16_t len, uint8_t isRX)
|
|
|
+{
|
|
|
+ uint8_t output[8192];
|
|
|
+
|
|
|
+ memset(output, 0x00, ARRAY_SIZE(output));
|
|
|
+ sprintf((char*)output, "%s", (isRX?"RX: ":"TX: "));
|
|
|
+ for(uint16_t idx = 0;idx<len;idx++)
|
|
|
+ {
|
|
|
+ sprintf((char*)output, "%s%02x ", output, data[idx]);
|
|
|
+ }
|
|
|
+
|
|
|
+ DEBUG_INFO("%s\n", output);
|
|
|
+}
|
|
|
+
|
|
|
int uart_tranceive(int fd, unsigned char* cmd, unsigned char* rx, int len, unsigned char needErase)
|
|
|
{
|
|
|
uint16_t rxLen = 0;
|
|
|
|
|
|
tcflush(fd,TCIOFLUSH);
|
|
|
+ //displayMessage(cmd, 6, NO);
|
|
|
if(write(fd, cmd, len) >= len)
|
|
|
{
|
|
|
- rxLen = read(fd, rx, 9);
|
|
|
+ rxLen = read(fd, rx, 8);
|
|
|
+
|
|
|
+ /*
|
|
|
+ if(rxLen > 0)
|
|
|
+ displayMessage(rx, rxLen, YES);
|
|
|
+ else
|
|
|
+ DEBUG_INFO("RX: NULL\n");*/
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -465,22 +488,22 @@ unsigned char uart_update_start(unsigned char fd, unsigned char targetAddr, unsi
|
|
|
{
|
|
|
unsigned char result = FAIL;
|
|
|
unsigned char tx[11] = {0xaa, 0x00, targetAddr, UART_CMD_UPDATE_START, 0x04, 0x00, (crc32>>0)&0xff, (crc32>>8)&0xff, (crc32>>16)&0xff, (crc32>>24)&0xff, 0x00};
|
|
|
- unsigned char rx[512];
|
|
|
+ unsigned char rx[8] = {0};
|
|
|
unsigned char chksum = 0x00;
|
|
|
|
|
|
for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
|
|
|
chksum ^= tx[6+idx];
|
|
|
tx[10] = chksum;
|
|
|
|
|
|
- if(uart_tranceive(fd, tx, rx, 11, 0x01) >0)
|
|
|
+ if(uart_tranceive(fd, tx, rx, 11, 0x01) >= 8)
|
|
|
{
|
|
|
chksum = 0x00;
|
|
|
- for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
|
|
|
+ for(int idx=0;idx<((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8));idx++)
|
|
|
{
|
|
|
chksum ^= rx[6+idx];
|
|
|
}
|
|
|
|
|
|
- if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
|
|
|
+ if((chksum == rx[6+((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8))]) &&
|
|
|
(rx[2] == tx[1]) &&
|
|
|
(rx[1] == tx[2]) &&
|
|
|
(rx[3] == tx[3]) &&
|
|
@@ -506,18 +529,18 @@ unsigned char uart_update_abord(unsigned char fd, unsigned char targetAddr)
|
|
|
{
|
|
|
unsigned char result = FAIL;
|
|
|
unsigned char tx[7] = {0xaa, 0x00, targetAddr, UART_CMD_UPDATE_ABORD, 0x00, 0x00, 0x00};
|
|
|
- unsigned char rx[512];
|
|
|
+ unsigned char rx[8] = {0};
|
|
|
unsigned char chksum = 0x00;
|
|
|
|
|
|
|
|
|
- if(uart_tranceive(fd, tx, rx, 7, 0x00) >0)
|
|
|
+ if(uart_tranceive(fd, tx, rx, 7, 0x00) >= 8)
|
|
|
{
|
|
|
- for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
|
|
|
+ for(int idx=0;idx<((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8));idx++)
|
|
|
{
|
|
|
chksum ^= rx[6+idx];
|
|
|
}
|
|
|
|
|
|
- if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
|
|
|
+ if((chksum == rx[6+((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8))]) &&
|
|
|
(rx[2] == tx[1]) &&
|
|
|
(rx[1] == tx[2]) &&
|
|
|
(rx[3] == tx[3]) &&
|
|
@@ -543,7 +566,7 @@ unsigned char uart_update_transfer(unsigned char fd, unsigned char targetAddr, u
|
|
|
{
|
|
|
unsigned char result = FAIL;
|
|
|
unsigned char tx[11 + length];
|
|
|
- unsigned char rx[512];
|
|
|
+ unsigned char rx[8] = {0};
|
|
|
unsigned char chksum = 0x00;
|
|
|
|
|
|
tx[0] = 0xaa;
|
|
@@ -562,15 +585,15 @@ unsigned char uart_update_transfer(unsigned char fd, unsigned char targetAddr, u
|
|
|
chksum ^= tx[6+idx];
|
|
|
tx[sizeof(tx)-1] = chksum;
|
|
|
|
|
|
- if(uart_tranceive(fd, tx, rx, 11 + length,0x00) >0)
|
|
|
+ if(uart_tranceive(fd, tx, rx, (11 + length), 0x00) >= 8)
|
|
|
{
|
|
|
chksum = 0;
|
|
|
- for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
|
|
|
+ for(int idx=0;idx<((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8));idx++)
|
|
|
{
|
|
|
chksum ^= rx[6+idx];
|
|
|
}
|
|
|
|
|
|
- if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
|
|
|
+ if((chksum == rx[6+((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8))]) &&
|
|
|
(rx[2] == tx[1]) &&
|
|
|
(rx[1] == tx[2]) &&
|
|
|
(rx[3] == tx[3]) &&
|
|
@@ -591,18 +614,18 @@ unsigned char uart_update_finish(unsigned char fd, unsigned char targetAddr)
|
|
|
{
|
|
|
unsigned char result = FAIL;
|
|
|
unsigned char tx[7] = {0xaa, 0x00, targetAddr, UART_CMD_UPDATE_FINISH, 0x00, 0x00, 0x00};
|
|
|
- unsigned char rx[512];
|
|
|
+ unsigned char rx[8] = {0};
|
|
|
unsigned char chksum = 0x00;
|
|
|
|
|
|
|
|
|
- if(uart_tranceive(fd, tx, rx, 7,0x00) >0)
|
|
|
+ if(uart_tranceive(fd, tx, rx, 7, 0x00) >= 8)
|
|
|
{
|
|
|
- for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
|
|
|
+ for(int idx=0;idx<((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8));idx++)
|
|
|
{
|
|
|
chksum ^= rx[6+idx];
|
|
|
}
|
|
|
|
|
|
- if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
|
|
|
+ if((chksum == rx[6+((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8))]) &&
|
|
|
(rx[2] == tx[1]) &&
|
|
|
(rx[1] == tx[2]) &&
|
|
|
(rx[3] == tx[3]) &&
|
|
@@ -705,6 +728,7 @@ int Upgrade_UART(int uartfdOrd,unsigned int Type,unsigned char TargetAddr,char *
|
|
|
else
|
|
|
{
|
|
|
DEBUG_WARN("Data transfer fail, retry %d \n", ++CNT_Fail);
|
|
|
+ sleep(1);
|
|
|
}
|
|
|
}while(DataLength-(CNT_Trans*1024)>0 && CNT_Fail<10);
|
|
|
|
|
@@ -712,10 +736,12 @@ int Upgrade_UART(int uartfdOrd,unsigned int Type,unsigned char TargetAddr,char *
|
|
|
{
|
|
|
uart_update_abord(uartfd, TargetAddr);
|
|
|
DEBUG_ERROR("UART upgrade retry > limits, aboard upgrade.\n");
|
|
|
+ printf("UART upgrade retry > limits, aboard upgrade.\n");
|
|
|
}
|
|
|
else if(uart_update_finish(uartfd, TargetAddr)==PASS)
|
|
|
{
|
|
|
result = PASS;
|
|
|
+ printf("UART upgrade success.\n");
|
|
|
}
|
|
|
}
|
|
|
else
|