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