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