From 73bf3cdb517b55f662ed5fa513cdaaf55c1fd0c8 Mon Sep 17 00:00:00 2001
From: tao_z <tzj0429@163.com>
Date: Wed, 01 Jun 2022 23:51:43 +0800
Subject: [PATCH] Bootloader调试完成,可以正常烧录程序

---
 Application/source/nvm.c |   45 +++++++++++++++++++++++++++++++++++++++------
 1 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/Application/source/nvm.c b/Application/source/nvm.c
index 9be73eb..79e4256 100644
--- a/Application/source/nvm.c
+++ b/Application/source/nvm.c
@@ -119,19 +119,33 @@
     return OP_STATUS_OK;
 }
 
-extern int8_t NVM_FlashCRCCheck(uint8_t *ptrdata)
+extern int8_t NVM_FlashCRCCheck(uint8_t *ptrdata, uint32_t targetcrc, uint32_t len)
 {
     int8_t ret = OP_STATUS_FAIL;
     uint32_t crc = 0;
     uint32_t init_crc = 0xFFFFFFFF;
-    crc = CRC_Cal32(init_crc, ptrdata + 4, RAM_FALSH_DRIVE_LENGHT);
+    crc = CRC_Cal32(init_crc, ptrdata, len);
     crc = crc ^ init_crc;
-    if (crc == *((uint32_t *)ptrdata))
+    if (crc == targetcrc)
     {
         ret = OP_STATUS_OK;
     }
     return ret;
 }
+
+// extern int8_t NVM_FlashDriverCRCCheck(uint8_t *ptrdata, uint32_t targetcrc, uint32_t len)
+// {
+//     int8_t ret = OP_STATUS_FAIL;
+//     uint32_t crc = 0;
+//     uint32_t init_crc = 0xFFFFFFFF;
+//     crc = CRC_Cal32(init_crc, ptrdata, len);
+//     crc = crc ^ init_crc;
+//     if (crc == targetcrc)
+//     {
+//         ret = OP_STATUS_OK;
+//     }
+//     return ret;
+// }
 extern int8_t NVM_ReInitFlashDriveRam(void)
 {
     memset((void *)flashCode, 0x0, RAM_FALSH_DRIVE_LENGHT + 4);
@@ -168,13 +182,31 @@
     }
 }
 
-extern uint8_t MEM_PartitionCRCOK(uint8_t partionid)
+static void NVM_FlipEndian(void *address, uint16_t size)
+{
+
+    uint8_t temp = 0;
+    uint8_t i = 0;
+    for (i = size; i > size / 2; i--)
+    {
+        temp = ((uint8_t *)address)[size - i];
+        ((uint8_t *)address)[size - i] = ((uint8_t *)address)[i - 1];
+        ((uint8_t *)address)[i - 1] = temp;
+    }
+}
+
+extern uint8_t MEM_PartitionCRCOK(uint8_t partionid, uint32_t targetcrc)
 {
     uint8_t ret = 0;
+    uint32_t length = 0;
+    targetcrc = targetcrc ^ 0xFFFFFFFF;
     switch (partionid)
     {
     case MEM_PARTITION_CODEFLASH:
-        ret = (OP_STATUS_OK == NVM_FlashCRCCheck((uint8_t *)APPCODE_START));
+        length = *((uint32_t *)(APPCODE_START + 12));
+        NVM_FlipEndian((void *)&length, 4);
+        length -= 4;
+        ret = (OP_STATUS_OK == NVM_FlashCRCCheck((uint8_t *)(APPCODE_START + 4), targetcrc, length));
         if (ret == 1)
         {
             // write present flag
@@ -186,7 +218,8 @@
         /* code */
         break;
     case MEM_PARTITION_RAM:
-        ret = (OP_STATUS_OK == NVM_FlashCRCCheck(flashCode));
+        length = RAM_FALSH_DRIVE_LENGHT;
+        ret = (OP_STATUS_OK == NVM_FlashCRCCheck(flashCode, targetcrc, length));
         if (ret == 1)
         {
             Nvm_Flags.flash_driver_loaded = 1;

--
Gitblit v1.8.0