加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

揭秘i.MXRT1170 eFuse空間訪問可靠性的保護(hù)策略

2020/05/06
403
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是恩智浦 i.MXRT1170 的 eFuse 空間訪問可靠性保護(hù)策略。

關(guān)于 i.MXRT 系列的 eFuse/OTP,痞子衡之前在介紹 Boot 時(shí)寫過兩篇,分別是針對(duì) RT1050 的《eFuse 及其燒寫方法》 和針對(duì) RT600 的《OTP 及其燒寫方法》,今天要介紹的 i.MXRT1170 eFuse 其實(shí)是這兩者的融合,在空間組織上(尤其是 Shadow Register)更像 RT1050,但是在訪問可靠性保護(hù)策略上又接近 RT600。關(guān)于訪問可靠性保護(hù)策略,痞子衡之前沒有提及,今天咱們就展開聊一聊。

一、eFuse 基本情況

eFuse 是 i.MXRT1170 內(nèi)嵌的一塊 OTP(One Time Programmable) memory,僅可被燒寫一次(這里指的是 bit 位從 0 到 1 不可逆),但可以被多次讀取。eFuse memory 的燒寫情況根據(jù)可靠性保護(hù)策略不同而不同。如果被冗余方法保護(hù),那么 eFuse 是按 bit 被燒寫的;如果是被 ECC 方法保護(hù)的,那么 eFuse 是按 word 被燒寫的。

i.MXRT1170 的 eFuse memory 用戶地址空間有 8Kbit(地址范圍為 0x900 - 0x18F0,低 4bit 地址位無效),分為 32 個(gè) BANK,每個(gè) BANK 含 8 個(gè) word(1word = 4bytes)。下圖中 0x00 - 0xFF 是 eFuse 的用戶 bank word 索引地址,其與 eFuse 空間地址對(duì)應(yīng)關(guān)系是:

fuse_address = user_fuse_index * 0x10 + 0x900

此外 i.MXRT1170 的 eFuse memory 還有額外的 0.5Kbit 地址空間(范圍為 0x800 - 0x8F0,低 4bit 地址位無效),用于存放廠商(NXP)配置以及一些敏感配置,其與 eFuse 空間地址對(duì)應(yīng)關(guān)系是:

fuse_address = supp_fuse_index * 0x10

不管是 8Kbit 用戶空間還是額外的 0.5Kbit 敏感空間,我們都是可以訪問的,其 index 其實(shí)是統(tǒng)一編址的,下面這個(gè) index 才是真正用于 blhost 工具或者 OCOTP API 的地址參數(shù):

fuse_address = fuse_index * 0x10 + 0x800

關(guān)于 i.MXRT1170 的 eFuse 一般特性(比如 Lock 屬性、OCOTP 控制器、Shadow Register)可參考痞子衡在文章開頭給出的兩篇文章,這里不予贅述。

二、eFuse 燒寫方法

有三種方法或工具可以幫助燒寫 eFuse,我們以燒寫和回讀 eFuse 地址 0xA80(MAC1_ADDR)為例,將 0x12345678 燒寫進(jìn) MAC1_ADDR 并回讀。根據(jù)上面公式我們可以得出 fuse_index = (fuse_address - 0x800) / 0x10 = 0x28,這個(gè) fuse_index 便是底下我們傳給燒寫工具的地址。

2.1 blhost 工具

blhost 是個(gè)上位機(jī)命令行工具,其能正常工作的前提是預(yù)先加載一個(gè)特殊 flashloader 程序(SDK_x.x.x_MIMXRT1170-EVKboardsevkmimxrt1170bootloader_examplesflashloader)進(jìn) MCU 來實(shí)現(xiàn) eFuse 燒寫,flashloader 中集成了 OCOTP 驅(qū)動(dòng)。關(guān)于 blhost 使用方法,詳見痞子衡 Boot 系列文章,這里僅列出兩個(gè)命令:

NXP-MCUBootUtilitytoolsblhost2_3win> .blhost.exe -u -- efuse-program-once 0x28 12345678
NXP-MCUBootUtilitytoolsblhost2_3win> .blhost.exe -u -- efuse-read-once 0x28

2.2 OCOTP 驅(qū)動(dòng)

如果你覺得 blhost 工具這一套太復(fù)雜,可以直接借助 SDK 包里的 ocotp 例程(SDK_x.x.x_MIMXRT1170-EVKboardsevkmimxrt1170driver_examplesocotp),代碼也是非常簡(jiǎn)單清晰:

 1#include?"fsl_ocotp.h"
 2
 3int?main(void)
 4{
 5????status_t?status?=?kStatus_Success;
 6????uint32_t?fuseData?=?0U;
 7
 8????/*?初始化 OCOTP 模塊?*/
 9????OCOTP_Init(OCOTP,?0U);
10
11????/*?將 word 數(shù)據(jù)(0x12345678)寫入 fuse?index 為 0x28 的 eFuse?memory 里?*/
12????status?=?OCOTP_WriteFuseShadowRegister(OCOTP,?0x28,?0x12345678);
13
14????/*?從 fuse?index 為 0x28 的 eFuse?memory 處讀出一個(gè) word*/
15????status?=?OCOTP_ReadFuseShadowRegisterExt(OCOTP,?0x28,?&fuseData,?1);
16}

2.3 MCUBootUtility 工具

如果你覺得 blhost 使用不友好,OCOTP 驅(qū)動(dòng)又需要改代碼和下載運(yùn)行,那么還有一個(gè)工具可以幫到你,那就是痞子衡開發(fā)的 MCUBootUtility 圖形界面工具,小白都能輕松上手燒寫 eFuse:

?

三、訪問可靠性保護(hù)策略

eFuse 的特性其實(shí)主要是 OCOTP 模塊決定的,翻開 i.MXRT1170 參考手冊(cè)的 OCOTP 章節(jié)的 Features 小節(jié),可以看到其比 RT1050 OCOTP 多了如下這三行:

? Supports ECC mode programming and reading for MTR fuse words by SkyBlue IPS bus
? Supports ECC mode programming and reading for all the user fuse words
? Supports redundancy mode programming and reading for all the supplementary fuse words

簡(jiǎn)單地說就是 eFuse 空間被分成了兩類,一類受 ECC 保護(hù),一類受 redundancy(冗余)保護(hù),這是本文要介紹的重點(diǎn)。

3.1 冗余保護(hù)

redundancy(冗余)保護(hù)是比較簡(jiǎn)單的訪問可靠性保護(hù)策略,這個(gè)策略基本設(shè)計(jì)思想就是冗余,將 fuse word 一分為二,低 16bit 是用戶操作區(qū),高 16bit 是系統(tǒng)冗余區(qū)。燒寫時(shí)用戶只需要管低 16bit,高 16bit 則由系統(tǒng)自動(dòng)完成復(fù)制燒寫?;刈x時(shí)得到的結(jié)果則是低 16bit 與高 16bit 的或(OR)結(jié)果。這樣的好處就是除非用戶操作區(qū)(低 16bit)和系統(tǒng)冗余區(qū)(高 16bit)均發(fā)生錯(cuò)誤才會(huì)導(dǎo)致訪問不可靠。

redundancy(冗余)保護(hù)雖然一定程度上提高了訪問可靠性,但代價(jià)是犧牲了一半存儲(chǔ)空間,所謂魚和熊掌不可兼得,這個(gè)也是可以理解的。下面這些 eFuse 區(qū)域是受 redundancy(冗余)保護(hù)的,從功能上看這些區(qū)域是按 bit 定義的,功能比較分散,所以存在多次燒寫的需求,適用 redundancy(冗余)保護(hù)。

?

3.2 ECC 保護(hù)

ECC 保護(hù)是相對(duì)復(fù)雜的訪問可靠性保護(hù)策略,ECC 算法是采用經(jīng)典的 SEC-DED(糾正 1bit,檢查 2bit),每個(gè) fuse word 算出一個(gè) ECC 校驗(yàn)值(7bit),這個(gè)校驗(yàn)值緊跟著存在 efuse word 后面(bit31:0 是用戶區(qū),bit38:32 是 ECC 區(qū)),ECC 區(qū)無法被用戶直接訪問。如果在回讀時(shí)發(fā)生 ECC 錯(cuò)誤,可在 HW_OCOTP_OUT_STATUS0 寄存器(這是 RT1170 OCOTP 模塊新增的寄存器)里如下 bit 找到信息。

?

ECC 保護(hù)極大地提高了訪問可靠性,但綜合 eFuse 特點(diǎn)其代價(jià)就是整個(gè) fuse word 僅可被燒寫一次(即使你一次只改一個(gè) bit)。下面這些 eFuse 區(qū)域是受 ECC 保護(hù)的,不過從功能上看這些區(qū)域功能比較單一,一般都是一次性燒寫,所以也適用 ECC 保護(hù)。

?

至此,恩智浦 i.MXRT1170 的 eFuse 空間訪問可靠性保護(hù)策略痞子衡便介紹完畢了,掌聲在哪里~~~

恩智浦

恩智浦

恩智浦半導(dǎo)體創(chuàng)立于2006年,其前身為荷蘭飛利浦公司于1953年成立的半導(dǎo)體事業(yè)部,總部位于荷蘭埃因霍溫。恩智浦2010年在美國納斯達(dá)克上市。恩智浦2010年在美國納斯達(dá)克上市。恩智浦半導(dǎo)體致力于打造全球化解決方案,實(shí)現(xiàn)智慧生活,安全連結(jié)。

恩智浦半導(dǎo)體創(chuàng)立于2006年,其前身為荷蘭飛利浦公司于1953年成立的半導(dǎo)體事業(yè)部,總部位于荷蘭埃因霍溫。恩智浦2010年在美國納斯達(dá)克上市。恩智浦2010年在美國納斯達(dá)克上市。恩智浦半導(dǎo)體致力于打造全球化解決方案,實(shí)現(xiàn)智慧生活,安全連結(jié)。收起

查看更多

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

碩士畢業(yè)于蘇州大學(xué)電子信息學(xué)院,目前就職于恩智浦(NXP)半導(dǎo)體MCU系統(tǒng)部門,擔(dān)任嵌入式系統(tǒng)應(yīng)用工程師。痞子衡會(huì)定期分享嵌入式相關(guān)文章