tao_z
2022-06-01 73bf3cdb517b55f662ed5fa513cdaaf55c1fd0c8
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;