Quantcast
Channel: 蓝牙论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 7516

CC2541 串口升级CRC校验问题

$
0
0

大家好

关于SBL升级中CRC两个字节目前感到很困惑。checkcrc代码:

static uint8 checkRC(void)
{
  uint16 crc[2];
  HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,
              (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, HAL_FLASH_WORD_SIZE);

  if ((crc[0] == 0) || (crc[0] == 0xFFFF))
  {
    return FALSE;
  }

  if (SBL_CALC_CRC && (crc[0] != crc[1])&& (crc[1] == 0xFFFF))
  {
    crc[1] = calcCRC();
    crc[0] = 0xFFFF;
    while (!HalAdcCheckVdd(VDD_MIN_NV));
    HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1);
    HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,
                (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, HAL_FLASH_WORD_SIZE);
  }

  return (crc[0] == crc[1]);
}

根据代码,工程设置中定义“xSBL_CALC_CRC”所以计算CRC这部份略过,这里没问题。下面还有设置CRC的代码:

  case SBL_ENABLE_CMD:
    HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,
                (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, sizeof(crc));

    // Bootload master must have verified extra checks to be issuing the SBL_ENABLE_CMD.
    //if ((crc[0] != crc[1]) && (crc[0] != 0xFFFF) && (crc[0] != 0x0000))
    if (crc[1] != crc[0])
    {
      crc[1] = crc[0];
      crc[0] = 0xFFFF;
      HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1);
      HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,
                  (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, sizeof(crc));
    }

    // Bootload master must have verified extra checks to be issuing the SBL_ENABLE_CMD.
    //if ((crc[0] == crc[1]) && (crc[0] != 0xFFFF) && (crc[0] != 0x0000))
    if (crc[0] != crc[1])
    {
      rsp = SBL_VALIDATE_FAILED;
    }
    break;

这里实在烧入固件后,从固定地址0x890和0x891中读取crc[0]和crc[1]。问题在于,刚刚烧录完成的固件中,这两个地址处一定是crc判断的地方吗?是编译器编译bin文件时设置的吗?


Viewing all articles
Browse latest Browse all 7516

Trending Articles