大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是利用i.MXRT10xx系列內(nèi)部DCP引擎計(jì)算CRC32值時(shí)需注意數(shù)據(jù)長(zhǎng)度對(duì)齊。
MCU 開發(fā)里常常需要 CRC 校驗(yàn)來檢查數(shù)據(jù)完整性,CRC 校驗(yàn)既可以純軟件實(shí)現(xiàn)也可以借助 MCU 片內(nèi)外設(shè)硬件實(shí)現(xiàn)。大部分 MCU 里通常都會(huì)包含一個(gè)單獨(dú)的硬件 CRC 外設(shè),但是在 i.MXRT 四位數(shù)系列里,翻看參考手冊(cè),我們卻找不到名為 CRC 的外設(shè),難道這么一款高性能 MCU 不支持硬件 CRC?當(dāng)然不是!這個(gè)功能藏在一個(gè)更強(qiáng)大的數(shù)學(xué)計(jì)算引擎外設(shè)里。
Note:在 i.MXRT10xx 系列上這個(gè)引擎是 DCP,在 i.MXRT11xx 系列上這個(gè)引擎升級(jí)為 CAAM。
關(guān)于 DCP 引擎使用,痞子衡寫過一篇文章 《DCP計(jì)算Hash值時(shí)需特別處理L1 D-Cache》。最近官方社區(qū)里有人提問,當(dāng)待校驗(yàn) CRC 數(shù)據(jù)長(zhǎng)度是 4 字節(jié)整數(shù)倍時(shí),DCP 計(jì)算結(jié)果和一些在線網(wǎng)站上的計(jì)算結(jié)果保持一致(多項(xiàng)式和配置設(shè)置一致),但是當(dāng)數(shù)據(jù)長(zhǎng)度不是 4 字節(jié)對(duì)齊時(shí),兩者結(jié)果就不一致了,這是怎么回事?今天咱們來聊一聊:
一、DCP對(duì)于CRC支持
翻看任何一個(gè) i.MXRT10xx 系列的參考手冊(cè),僅在 System Security 章節(jié)有一小段關(guān)于 DCP 特性描述,里面講了能支持 CRC32,但是關(guān)于多項(xiàng)式配置信息沒有提及。
既然手冊(cè)沒涉及太多,那直接擼代碼吧,可以參考 SDKboardsevkmimxrt10xxdriver_examplesdcp 例程,相關(guān)代碼足夠簡(jiǎn)單抄錄如下。代碼里僅 m_handle.swapConfig 設(shè)置會(huì)改變 CRC 計(jì)算結(jié)果(因?yàn)閷?duì)源數(shù)據(jù)做了 swap 處理),除此以外并未提供其他 CRC 多項(xiàng)式參數(shù)配置,因此可以基本認(rèn)定 DCP 支持的是一個(gè)固定參數(shù)模式的 CRC32 算法分支,用戶無(wú)法更改參數(shù)。
#include?"fsl_dcp.h"
dcp_config_t?dcpConfig;
DCP_GetDefaultConfig(&dcpConfig);
DCP_Init(DCP,?&dcpConfig);
dcp_handle_t?m_handle;
m_handle.channel????=?kDCP_Channel0;
m_handle.keySlot????=?kDCP_KeySlot0;
//?僅這里換成?kDCP_InputByteSwap?會(huì)影響?CRC?計(jì)算結(jié)果(res?-?4字節(jié))
m_handle.swapConfig?=?kDCP_NoSwap;
status?=?DCP_HASH(DCP,?&m_handle,?kDCP_Crc32,?srcBuf,?srcLen,?res,?&resLen);
這里痞子衡就不繼續(xù)賣關(guān)子了,DCP 固定支持的就是經(jīng)典的 CRC32-MPEG2,其參數(shù)如下:
二、DCP-CRC32關(guān)于數(shù)據(jù)對(duì)齊處理
關(guān)于 CRC32-MPEG2 算法實(shí)現(xiàn)細(xì)節(jié)可在 IEEE 802 標(biāo)準(zhǔn)手冊(cè)里找到,原則上其對(duì)于源數(shù)據(jù)長(zhǎng)度是沒有對(duì)齊要求的,但在具體硬件實(shí)現(xiàn)上,不同硬件可能會(huì)增加末尾數(shù)據(jù)對(duì)齊處理。
痞子衡找了一塊 RT1020-EVK 開發(fā)板跑了一下 SDKboardsevkmimxrt1020driver_examplesdcp 例程,只對(duì)例程做了簡(jiǎn)單修改如下,從測(cè)試結(jié)果來看,發(fā)現(xiàn) DCP 對(duì)源數(shù)據(jù)做了末尾 4 字節(jié)對(duì)齊處理(用 0x00 填充)。
DCP 這個(gè)數(shù)據(jù)對(duì)齊處理特性說明能在哪里找到呢?我們知道 DCP 是跟芯片安全特性相關(guān)的,i.MX RT 芯片除了有普通參考手冊(cè)(RM)之外,還有一個(gè)安全參考手冊(cè)(SRM),在 SRM 里面會(huì)進(jìn)一步介紹芯片安全相關(guān)的外設(shè)。在恩智浦官網(wǎng) i.MXRT 產(chǎn)品主頁(yè)進(jìn)入具體型號(hào),切換到 Secure Files 選項(xiàng)(這里需要賬號(hào)登錄,并且申請(qǐng)?jiān)L問權(quán)限,可聯(lián)系 FAE 簽 NDA),如果有訪問權(quán)限,便可以下載 SRM:
在 SRM 里我們看到了 DCP CRC32 對(duì)于數(shù)據(jù)對(duì)齊處理策略,與板級(jí)測(cè)試結(jié)果吻合:
文章開頭說 i.MXRT11xx 系列里的 CAAM 模塊是 i.MXRT10xx 里 DCP 的升級(jí),我們僅從 CRC 支持方面可見一斑,CAAM 對(duì)于 CRC 的支持更豐富,除了經(jīng)典算法,還支持用戶自定義參數(shù)(這就比較像傳統(tǒng) MCU 里的單獨(dú) CRC 外設(shè)):
至此,利用i.MXRT10xx系列內(nèi)部DCP引擎計(jì)算CRC32值時(shí)需注意數(shù)據(jù)長(zhǎng)度對(duì)齊痞子衡便介紹完畢了,掌聲在哪里~~~