主题中讨论的其他器件:MSPM0L1306、
工具与软件:
我将 为 MSPM0L1306编写主机侧(Linux) I2C BSL 闪存器。 我可以通过 GPIO 调用序列进入 BSL 模式、连接、批量擦除和将数据刷写到器件中。 但是、独立验证无法正常工作。 我使用的 CRC 算法与计算 BSL 消息的校验和相同、用于计算我尝试验证的数据块上的预期 CRC。 但是、从"独立验证"命令返回的 CRC 与我正在计算的 CRC 不匹配。 下面是我用来向 BSL 发送独立验证消息的函数。 BSL_CRC32是我必须在本地生成 CRC32的函数。
bool bsl_verify_simple (uint32_t addr、uint32_t len_data){
uint32_t CRC32;
bsl_txbuf[0]= 0x80;//packet_header
bsl_txbuf[1]= 9;//CMD_BYTE (1)+ Addrs_bytes (4)+ verify_bytes (4)
bsl_txbuf[2]= 0;
bsl_txbuf[3]= 0x26;//cmd_verify
*(uint32_t *)\bsl_txbuf[4]= addr;//HDR_LEN_CMD_bytes (4)
*(uint32_t *)\bsl_txbuf[8]= len_data;//HDR_LEN_CMD_bytes (4)+ Addrs_bytes (4)
CRC32 = BSL_CRC32 (&bsl_txbuf[3]、9);//CMD_BYTE (1)+ Addrs_bytes (4)+ verify_bytes (4)
*(uint32_t *)\bsl_txbuf[12]= CRC32;//HDR_LEN_CMD_BYTES (4)+ Addrs_bytes (4)+ verify_bytes (4)
uint8_t tx_len = 16;//HDR_LEN_CMD_bytes (4)+ Addrs_bytes (4)+ verify_bytes (4)+ CRC_Bytes (4)
如果(!i2c_write (bsl_txbuf、tx_len))返回 false;
uint8_t rx_len = 13;// ACK_byte (1)+ HDR_LEN_CMD_bytes (4)+ verify_bytes (4)+ crc_Bytes (4)
如果(!i2c_read (bsl_rxbuf、rx_len))返回 false;
//检查确认
如果(bsl_rxbuf[0]!= BSL_ACK_OK)返回 FALSE;
返回 true;
}
int main(){
//验证空白闪存以测试 CRC
如果(!bsl_verify (01024))、请转到 err;
const uint8_t TEST_DATA_EMPTY[1024]={0x00};
BSL_CRC32 (TEST_DATA_EMPTY、array_LEN (TEST_DATA_EMPTY));
}
BSL 正在接受并处理该消息(返回 ACK 以及正确响应以表明这是一个独立验证响应)、但结果不匹配。 我还尝试了与长度为1024的数组(0xFF)进行比较、但 CRC 仍然不匹配。 下面是从上面构建的原始缓冲区、随响应一起发送到器件。
BSL_VERIFY (已发送):
0x80 0x09 0x00 0x26 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0xa4 0xb8 0x14 0xef
bsl_verify (recv):
0x00 0x08 0x05 0x00 0x32 0x0B 0x00 0xc5 0x47 0x3D 0x93 0x08 0x6b
crc_recv:0x47c5000b
crc_calc:0x104a50d1
用于独立验证的 CRC 算法与用于消息校验和验证的 CRC 算法是否不同? 数据表中未提及此内容、通过查看辅助 BSL 示例(表明示例实现应与 ROM BSL 相匹配)、CRC 参数与数据表相同。
与此相关的是、 MSPM0引导加载程序用户指南(slau887)在第 4.3.10节"独立验证"中包含多个错误。 显示的命令结构是响应数据包、而不是命令数据包。 示例命令(主机)指定地址0x20000000和长度0x400。 示例响应(BSL)不是独立验证响应(0x32)、而是一个内核消息响应(0x3B)、消息内容为0x05 (无效存储器范围):
H | LEN |CMD| A A A A | D D D D | CRC |
80 09 00 26 00 00 20 00 04 00 00 A0 97 D5 2E
做出权衡
BSL:00 08 02 00 3B 05 B7 F6 FE F2 (MSG:无效地址!)