123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- #include "otaEvent.h"
- #include "usart.h"
- #include "systick.h"
- #include "w25q32.h"
- #include "main.h"
- #define APPBLOCKNB 2
- #define OTA_EVENT_BLOCKNB 1
- #define SOH 0x01
- #define ACK 0X06
- #define NAK 0x15
- #define EOT 0x04
- int8_t xmodem(uint16_t timeout);
- OTA_T ota_data;
- uint8_t w25q32_data[256];
- uint16_t Xmodem_CRC16(uint8_t *data, uint16_t datalen);
- int8_t check_ota_event()
- {
-
-
- if (ota_data.ota_flag == 1)
- {
- W25Q32_Erase64K(APPBLOCKNB);
- int8_t recvSta = xmodem(1000);
- if (recvSta == 0)
- {
- return 0;
- }
- else
- {
- NVIC_SystemReset();
- }
- }
- else
- return 0;
- }
- int8_t xmodem(uint16_t timeout)
- {
- int startTime = gettick();
- ota_data.done=0;
- OTA_flag data_flag;
- data_flag.flag=0;
- data_flag.xmodemNB=0;
- while(1)
- {
- task_fwdgt_reload();
- if(gettick()-startTime>timeout*1000)return 0;
- usart_data_transmit(COM_232, 'C');
- delay_1ms(1000);
- if(ota_data.done==1)break;
- }
-
- while (gettick() - startTime < timeout * 1000)
- {
- if (ota_data.done == 1)
- {
- task_fwdgt_reload();
- if (ota_data.data[0] == SOH && ota_data.data_cnt == 133)
- {
- uint16_t XCRC = Xmodem_CRC16(ota_data.data + 3, 128);
- if (XCRC == ota_data.data[131] * 256 + ota_data.data[132])
- {
- data_flag.xmodemNB++;
-
-
- if(ota_data.data[1]%2==0)
- {
- memcpy(w25q32_data+128,ota_data.data + 3,128);
- W25Q32_PageWrite(w25q32_data,APPBLOCKNB*256+(data_flag.xmodemNB-1)/2);
- memset(w25q32_data,0,256);
- }
- else
- {
- memcpy(w25q32_data,ota_data.data + 3,128);
- }
-
- ota_data.data_cnt = 0;
- memset(ota_data.data, 0, 133);
- ota_data.done = 0;
- usart_data_transmit(COM_232, ACK);
-
- }
- else
- {
- ota_data.data_cnt = 0;
- memset(ota_data.data, 0, 133);
- ota_data.done = 0;
- usart_data_transmit(COM_232, NAK);
- }
- }
-
- else if (ota_data.data[0] == EOT && ota_data.data_cnt == 1)
- {
- if(data_flag.xmodemNB%2!=0)
- {
- W25Q32_PageWrite(w25q32_data,APPBLOCKNB*256+(data_flag.xmodemNB-1)/2);
- }
-
-
-
- usart_data_transmit(COM_232, ACK);
-
- OTA_MESSAGE ota_message;
- ota_message.Completion_flag=1U;
- ota_message.XmodemByte=data_flag.xmodemNB*128;
- W25Q32_Erase64K(OTA_EVENT_BLOCKNB);
- W25Q32_PageWrite((uint8_t *)&ota_message,OTA_EVENT_BLOCKNB*256);
-
- delay_1ms(50);
-
- return 1;
- }
- else
- {
- ota_data.data_cnt = 0;
- memset(ota_data.data, 0, 133);
- ota_data.done = 0;
- usart_data_transmit(COM_232, NAK);
- }
- }
- delay_1ms(1);
- }
- return 0;
- }
- uint16_t Xmodem_CRC16(uint8_t *data, uint16_t datalen)
- {
- uint8_t i;
- uint16_t Crcinit = 0x0000;
- uint16_t Crcipoly = 0x1021;
- while (datalen--)
- {
- Crcinit = (*data << 8) ^ Crcinit;
- for (i = 0; i < 8; i++)
- {
- if (Crcinit & 0x8000)
- Crcinit = (Crcinit << 1) ^ Crcipoly;
- else
- Crcinit = (Crcinit << 1);
- }
- data++;
- }
- return Crcinit;
- }
|