|
@@ -5,6 +5,7 @@
|
|
|
#include "iap.h"
|
|
|
#include "dataHandling.h"
|
|
|
#include "md5c.h"
|
|
|
+#include "stdbool.h"
|
|
|
|
|
|
typedef void (*iapfun)(void);
|
|
|
iapfun jump2app;
|
|
@@ -49,7 +50,7 @@ uint16_t packTotalNum = 0;
|
|
|
uint16_t packIndexbak = 0;
|
|
|
uint16_t crcIAP = 0;
|
|
|
uint16_t crcTerminal = 0;
|
|
|
-uint32_t AddrToWrite = Application_Buffer_Addr;
|
|
|
+uint32_t AddrToWrite ;
|
|
|
int FileLength_IAP;
|
|
|
uint32_t update_flag = 0;
|
|
|
|
|
@@ -63,7 +64,8 @@ uint16_t curaddr[2] = {0};
|
|
|
uint16_t curapack[1] = {0};
|
|
|
uint16_t curaddr_pack[3] = {0};
|
|
|
int sameIndex;
|
|
|
-
|
|
|
+bool Trindex;
|
|
|
+
|
|
|
void Process_CMD_IAP_Update(void)
|
|
|
{
|
|
|
int lenRx1;
|
|
@@ -75,13 +77,13 @@ void Process_CMD_IAP_Update(void)
|
|
|
|
|
|
lenRx1 = USART_PUB_LENGTH;
|
|
|
|
|
|
- uint8_t ERR_Arr[8] = "error\r\n";
|
|
|
+ uint8_t ERR_Arr[8] = "error";
|
|
|
|
|
|
YmodemID = USART_IAP_RX[7];
|
|
|
+
|
|
|
memset(FileBuffArray, 0, sizeof(FileBuffArray));
|
|
|
memset(FileBuffArray1, 0, sizeof(FileBuffArray1));
|
|
|
|
|
|
- updatecuraddr(CURaddr_PACKAGE_ADDR);
|
|
|
|
|
|
switch (YmodemID)
|
|
|
{
|
|
@@ -181,6 +183,7 @@ void Process_CMD_IAP_Update(void)
|
|
|
|
|
|
memset(FileBuffArray, 0, sizeof(FileBuffArray));
|
|
|
memset(FileBuffArray1, 0, sizeof(FileBuffArray1));
|
|
|
+
|
|
|
break;
|
|
|
|
|
|
/***
|
|
@@ -188,67 +191,84 @@ void Process_CMD_IAP_Update(void)
|
|
|
*/
|
|
|
|
|
|
case 0x02: //有效载荷帧数据处理
|
|
|
+
|
|
|
+ updatecuraddr(CURaddr_PACKAGE_ADDR);
|
|
|
+ updatecurpack(CURaddr_PACKAGE_ADDR);
|
|
|
+
|
|
|
crcIAP = crc16_xmodem(&USART_IAP_RX[10], 128);
|
|
|
crcTerminal = (USART_IAP_RX[lenRx1 - 4] << 8) + USART_IAP_RX[lenRx1 - 3];
|
|
|
+
|
|
|
+// nowcurAddr1 += 128;
|
|
|
|
|
|
-
|
|
|
- if(nowcurAddr1 == 0xFFFFFFFF)
|
|
|
+
|
|
|
+ if((nowcurAddr1&0xFFFF) == addrIndex+128)
|
|
|
{
|
|
|
- AddrToWrite = Application_Buffer_Addr;
|
|
|
+ Trindex = 1;
|
|
|
}
|
|
|
- else{
|
|
|
- int addr = nowcurAddr1;
|
|
|
- int base_addr = Application_Buffer_Addr;
|
|
|
- int step_size = 0x80;
|
|
|
- int index = (addr - base_addr) / step_size;//算出包索引
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Trindex = 0;
|
|
|
|
|
|
- AddrToWrite = addr;
|
|
|
- packIndex = index;
|
|
|
}
|
|
|
|
|
|
+ if(((nowcurAddr1&0xFFFF) != addrIndex) && Trindex)
|
|
|
+
|
|
|
+ {
|
|
|
+ addrIndex-=128;
|
|
|
+ nowcurAddr1 = (nowcurAddr1 &0xFFFF0000) | addrIndex;
|
|
|
+ AddrToWrite = nowcurAddr1;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
if (crcIAP == crcTerminal)
|
|
|
{
|
|
|
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
|
|
|
+ HAL_Delay(1);
|
|
|
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
|
|
|
+
|
|
|
for (i = 0; i < 64; i++)
|
|
|
{
|
|
|
FileBuffArray[i] = (uint16_t)(USART_IAP_RX[i * 2 + 11] << 8 | USART_IAP_RX[i * 2 + 10]);
|
|
|
}
|
|
|
-
|
|
|
- Flash_WriteBytes(FileBuffArray, AddrToWrite, 64);
|
|
|
- AddrToWrite += 128;
|
|
|
-
|
|
|
-
|
|
|
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
|
|
|
- HAL_Delay(1);
|
|
|
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
|
|
|
|
|
|
+ Flash_WriteBytes(FileBuffArray, AddrToWrite, 64);//init 08040000
|
|
|
+ AddrToWrite += 128; // +128
|
|
|
+ nowcurAddr = AddrToWrite;
|
|
|
+ curaddr_pack[0] = (nowcurAddr >> 16) & 0xFFFF;
|
|
|
+ curaddr_pack[1] = nowcurAddr & 0xFFFF;
|
|
|
+ curaddr_pack[2] = packIndex;
|
|
|
+ Flash_WriteBytes(curaddr_pack, CURaddr_PACKAGE_ADDR, 3);
|
|
|
|
|
|
- if((AddrToWrite & 0xffff) != (USART_IAP_RX[2] << 8 | USART_IAP_RX[3]))
|
|
|
- {
|
|
|
- HAL_UART_Transmit(&huart1, ERR_Arr, strlen((char *)ERR_Arr), 100);
|
|
|
- break;
|
|
|
- }
|
|
|
|
|
|
|
|
|
memset(USART_IAP_RX, 0, sizeof(USART_IAP_RX));
|
|
|
|
|
|
//CURPACKAGE_ADDR
|
|
|
//CURADDRESS_ADDR
|
|
|
- nowcurAddr = AddrToWrite;
|
|
|
-
|
|
|
- curaddr_pack[0] = (nowcurAddr >> 16) & 0xFFFF;;
|
|
|
- curaddr_pack[1] = nowcurAddr & 0xFFFF;
|
|
|
- curaddr_pack[2] = packIndex+1;
|
|
|
+
|
|
|
+// if((nowcurAddr-128) != addrIndex)
|
|
|
+// {
|
|
|
+//
|
|
|
+// HAL_UART_Transmit(&huart1, ERR_Arr, strlen((char *)ERR_Arr), 100);
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+
|
|
|
+ HAL_GPIO_WritePin(kmg_GPIO_Port, kmg_Pin, GPIO_PIN_SET);
|
|
|
+ HAL_Delay(1);
|
|
|
+ HAL_GPIO_WritePin(kmg_GPIO_Port, kmg_Pin, GPIO_PIN_RESET);
|
|
|
+// }
|
|
|
|
|
|
+ receive_modbus_9_1(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
|
|
|
+ ((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5], USART_MODBUS_RX[6]);
|
|
|
|
|
|
}
|
|
|
-
|
|
|
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
|
|
|
- HAL_Delay(1);
|
|
|
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
|
|
|
- Flash_WriteBytes(curaddr_pack, CURaddr_PACKAGE_ADDR, 3);
|
|
|
-
|
|
|
- receive_modbus_9_1(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
|
|
|
- ((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5], USART_MODBUS_RX[6]);
|
|
|
+
|
|
|
+
|
|
|
break;
|
|
|
|
|
|
|
|
@@ -323,7 +343,6 @@ void Start_BootLoader(void)
|
|
|
int txLen;
|
|
|
memset(USART_IAP_RX, 0, sizeof(USART_IAP_RX));
|
|
|
|
|
|
-
|
|
|
update_iaplength(LENGTH_ADDR);
|
|
|
|
|
|
switch (ModeStart)
|
|
@@ -333,7 +352,6 @@ void Start_BootLoader(void)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
case Startup_Update: /*启动最新的程序 */
|
|
|
|
|
|
all_len = FileLength_IAP;
|
|
@@ -344,13 +362,13 @@ void Start_BootLoader(void)
|
|
|
iap_write_appbin(ADD_UPDATE_PROG,Application_Buffer_Addr,all_len);
|
|
|
|
|
|
HAL_Delay(80);
|
|
|
- txLen = sprintf((char *)USART_IAP_RX, "updating");
|
|
|
+ txLen = sprintf((char *)USART_IAP_RX, "Upgrade completed");
|
|
|
HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);
|
|
|
while (huart1.gState == HAL_UART_STATE_BUSY_TX)
|
|
|
{
|
|
|
HAL_Delay(1);
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
+ Set_App2_Flag();
|
|
|
|
|
|
}
|
|
|
else
|
|
@@ -364,22 +382,11 @@ void Start_BootLoader(void)
|
|
|
}
|
|
|
return ;
|
|
|
}
|
|
|
-
|
|
|
- if (App2_MD5_Check(ADD_UPDATE_PROG,all_len))
|
|
|
- {
|
|
|
- txLen = sprintf((char *)USART_IAP_RX, "checkok");
|
|
|
- HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);
|
|
|
- while (huart1.gState == HAL_UART_STATE_BUSY_TX)
|
|
|
- {
|
|
|
- HAL_Delay(1);
|
|
|
- }
|
|
|
-
|
|
|
- Set_App2_Flag();
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
case Startup_APP2: /*启动最新的程序 */
|
|
|
|
|
|
- if ((all_len<0x20000) && App2_MD5_Check(ADD_UPDATE_PROG,all_len))
|
|
|
+ if (App2_MD5_Check(ADD_UPDATE_PROG,all_len))
|
|
|
{
|
|
|
__set_FAULTMASK(0); //先关闭全局中断
|
|
|
jump_to_app(ADD_UPDATE_PROG);
|
|
@@ -387,6 +394,11 @@ void Start_BootLoader(void)
|
|
|
break;
|
|
|
default: // 启动失败
|
|
|
{
|
|
|
+ if (App2_MD5_Check(ADD_UPDATE_PROG,all_len))
|
|
|
+ {
|
|
|
+ __set_FAULTMASK(0); //先关闭全局中断
|
|
|
+ jump_to_app(ADD_UPDATE_PROG);
|
|
|
+ }
|
|
|
return;
|
|
|
}
|
|
|
}
|