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

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

i.MXRTXXXX系列eFUSE及其燒寫方法

09/30 13:19
8.8萬
閱讀需 17 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

i.MXRTyyyy 啟動(dòng)系列第二篇文章 Boot 配置(BOOT Pin, eFUSE) 里痞子衡提到了 eFUSE,部分 Boot 配置都存儲(chǔ)在 eFUSE memory 里,但是對(duì) eFUSE 的介紹僅僅淺嘗輒止,沒有深入,今天痞子衡就為大家再進(jìn)一步介紹 eFUSE。

  

eFUSE 是 i.MXRTyyyy 里一塊特殊的存儲(chǔ)區(qū)域,用于存放全部芯片配置信息,其中有一部分配置信息和 Boot 相關(guān)。這塊特殊存儲(chǔ)區(qū)域并不在 ARM 的 4G system address 空間里,需要用特殊的方式去訪問(讀 / 寫),如何訪問 eFUSE 是本篇文章的重點(diǎn)。

一、eFUSE 基本原理

1.1 eFUSE 屬性(OTP, Lock)

eFUSE 本質(zhì)上就是 i.MXRTyyyy 內(nèi)嵌的一塊 OTP(One Time Programmable) memory,僅可被燒寫一次,但可以被多次讀取。eFUSE memory 的燒寫是按 bit 進(jìn)行的(RT10xx 都是按 bit 進(jìn)行,RT1170 大部分是按 Word 進(jìn)行的),初始狀態(tài)下所有 eFUSE bit 均為 0,通過特殊的燒寫時(shí)序可以將 bit 從 0 改成 1,一旦某 bit 被燒寫成 1 后便再也無法被修改(可理解為硬件熔絲燒斷了無法恢復(fù))。
  

i.MXRT1050 的 eFUSE memory 總地址空間有 1.75KB(地址范圍為 0x000 - 0x6FF),但可讀寫操作的空間只有 192bytes(位于 0x400 - 0x6FF 區(qū)域),分為 6 個(gè) BANK,每個(gè) BANK 含 8 個(gè) word(1word = 4bytes)。下圖中 0x00 - 0x2F 是 eFUSE 的 bank word 索引地址(也叫 index 地址),其與 eFUSE 空間地址對(duì)應(yīng)關(guān)系是:

fuse_address = fuse_index * 0x10 + 0x400

  

上述可讀寫的 eFUSE memory 空間除了 OTP 特性外,還有 Lock 控制特性,Lock 控制是 OTP memory 的標(biāo)配,Lock 控制有三層:第一層是 WP,即寫保護(hù),被保護(hù)的 eFUSE 區(qū)域只可讀,不可寫;第二層是 OP,即覆蓋保護(hù),被保護(hù)的 eFUSE 區(qū)域只能被寫一次(用于保護(hù) eFUSE Word 里那些不需要被燒寫成 1 的 eFUSE bit);第三層是 RP(WP+OP+RP),即訪問保護(hù),被保護(hù)的 eFUSE 區(qū)域及其對(duì)應(yīng)的 shadow register 均不能被讀寫。
  

Lock 控制在 eFUSE 的 BANK0_word0,如下是 RT1050 上具體 Lock bit 定義:

關(guān)于可讀寫 eFUSE 空間所有 bit 定義詳見 Reference Manual 里的 Table 5-9. Fusemap Descriptions。

1.2 OCOTP 控制器與 Shadow Register

i.MXRTyyyy 內(nèi)部有一個(gè)硬件 IP 模塊叫 OCOTP_CTRL,即 OCOTP 控制器,對(duì) eFUSE memory 的讀寫控制操作其實(shí)都是通過這個(gè) OCOTP 控制器實(shí)現(xiàn)的,下圖是 OCOTP_CTRL 模塊圖:

  

OCOTP_CTRL 模塊寄存器一共分兩類:一類是 IP 控制寄存器,用于實(shí)現(xiàn)對(duì) OTP memory 的讀寫操作時(shí)序控制;一類是 Shadow register,用于上電時(shí)自動(dòng)從 eFUSE memory 獲取數(shù)據(jù)并緩存,這樣我們可以直接訪問 Shadow register 而不用訪問 eFUSE memory 也能獲取 eFUSE 內(nèi)容(注意:當(dāng)芯片運(yùn)行中燒寫 eFUSE,Shadow register 的值并不會(huì)立刻更新,需要執(zhí)行 IP 控制器的 reload 命令或者將芯片 reset 才能同步)。

  

RT1050 上 IP 控制寄存器偏移地址范圍是 0x000 - 0x3FF(下圖僅截取部分):

  

Shadow register 寄存器偏移地址范圍是 0x400 - 0x6FF(下圖僅截取部分),看到 0x400 - 0x6FF 的地址范圍,有沒有感覺很熟悉?是的,這跟上一節(jié)講的可讀寫操作 eFUSE 空間偏移地址范圍是一致的。

二、使用 blhost 燒寫 eFUSE

eFUSE memory 的燒寫是通過 OCOTP_CTRL 模塊來實(shí)現(xiàn)的,我們當(dāng)然可以在 Application 中集成 OCOTP_CTRL 的驅(qū)動(dòng)程序,然后在 Application 調(diào)用 OCOTP_CTRL 的驅(qū)動(dòng)程序完成 eFUSE 的燒寫,但這種方式并不是痞子衡要介紹的重點(diǎn),痞子衡要介紹的是通過 Flashloader 配套的 blhost.exe 上位機(jī)工具實(shí)現(xiàn) eFUSE 的燒寫。
  

痞子衡在上一篇文章里介紹過如何引導(dǎo)啟動(dòng) Flashloader 并且使用 blhost 與 Flashloader 通信,此處假設(shè)你已經(jīng)使用 blhost 與 Flashloader 建立了通信。讓我們?cè)賮砘仡櫼幌?blhost 的命令 help,可以得知 efuse-program-once 這個(gè)命令就是我們想要的命令。

PS C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolsblhostwin> .blhost.exe -?

usage: C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolsblhostwinblhost.exe

? ? ? ? ? ? ? ? ? ? ? ?[-p|--port <name>[,<speed>]]

? ? ? ? ? ? ? ? ? ? ? ?[-u|--usb [[[<vid>,]<pid>]]]

? ? ? ? ? ? ? ? ? ? ? ?-- command <args...>

Command:

? efuse-program-once <addr> <data>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Program one word of OCOTP Field

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<addr> is ADDR of OTP word, not the shadowed memory address.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<data> is hex digits without prefix '0x'

? efuse-read-once <addr>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Read one word of OCOTP Field

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<addr> is ADDR of OTP word, not the shadowed memory address.
  

讓我們?cè)囈幌?efuse-program-once 這個(gè)命令,開始試之前要解決 2 個(gè)問題:
  

addr 參數(shù)到底是什么地址?幫助里說是 OTP word address,其實(shí)這個(gè)地址就是 1.1 節(jié)里介紹的 fuse_index,index 范圍為 0x00 - 0x2F,對(duì)應(yīng) 48 個(gè)可讀寫操作的 eFUSE Word。
  

data 參數(shù)到底是什么格式?幫助里說是 hex digits without prefix '0x',但是似乎沒有指明長度,我們知道每一個(gè) index 對(duì)應(yīng)的是 4byte,那就應(yīng)該是 8 位 16 進(jìn)制數(shù)據(jù)(實(shí)測下來必須要填 8 位,如果是非 8 位會(huì)返回 Error: invalid command or arguments)。
  

弄清了問題,那我們做一個(gè)小測試:要求將 eFUSE 里的 SRK_REVOKE word 的最低 byte 燒寫成 0x5A,然后再將最高 byte 燒寫成 0xFE,分兩步進(jìn)行。
  

翻看 OTP Memory Footprint 表,找到 SRK_REVOKE 的 index 地址是 0x2F(對(duì)應(yīng) Shadow register 地址是 0x401F46F0),命令搞起來:

PS C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolsblhostwin> .blhost.exe -u -- efuse-program-once 0x2F 0000005A

Inject command 'efuse-program-once'

Successful generic response to command 'efuse-program-once'

Response status = 0 (0x0) Success.

PS C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolsblhostwin> .blhost.exe -u -- efuse-program-once 0x2F FE000000

Inject command 'efuse-program-once'

Successful generic response to command 'efuse-program-once'

Response status = 0 (0x0) Success.

PS C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolsblhostwin> .blhost.exe -u -- efuse-read-once 0x2F

Inject command 'efuse-read-once'

Response status = 0 (0x0) Success.

Response word 1 = 4 (0x4)

Response word 2 = -33554342 (0xfe00005a)

PS C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolsblhostwin> .blhost.exe -u -- read-memory 0x401F46F0 4

Inject command 'read-memory'

Successful response to command 'read-memory'

5a 00 00 fe

(1/1)100% Completed!

Successful generic response to command 'read-memory'

Response status = 0 (0x0) Success.

Response word 1 = 4 (0x4)

Read 4 of 4 bytes.
  

看起來命令執(zhí)行正常,但你是不是會(huì)有幾個(gè)疑問:
  

為何執(zhí)行第二條命令將 0xFE000000 燒寫進(jìn) eFUSE 時(shí)沒有報(bào)錯(cuò)?顯然第一條命令已經(jīng)將 0x0000005A 燒寫進(jìn) eFUSE,而 0xFE000000 的最低 byte 是 0x00,看起來它跟已經(jīng)燒寫進(jìn)去的 0x5A 是沖突的,而前面介紹過 eFUSE bit 只能從 0 燒寫為 1,其實(shí)這不是問題,OCOTP controller 會(huì)自動(dòng)過濾將 eFUSE bit 從 1 燒寫為 0 的操作。
  

為何 eFUSE 被燒寫后,并沒有 reset 操作,用 read-memory 去獲取 Shadow register 可以立即看到數(shù)據(jù)同步更新了?其實(shí) blhost 里的 efuse-program-once 命令不僅包含 program 命令,也自動(dòng)集成了 reload 命令。

  

雖然只有 blhost 可以實(shí)現(xiàn) eFUSE 燒寫功能,但要獲取 eFUSE 狀態(tài)并不是只有 blhost 可以做到,sdphost 也可以做到,因?yàn)?sdphost 提供了讀寫 Shadow register 的命令。

PS C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolssdphostwin> .sdphost.exe -u 0x1fc9,0x0130 -- read-register 0x401F46F0

5a 00 00 fe

Status (HAB mode) = 1450735702 (0x56787856) HAB disabled.

PS C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolssdphostwin> .sdphost.exe -u 0x1fc9,0x0130 -- write-register 0x401F46F0 32 0x00000000

Status (HAB mode) = 1450735702 (0x56787856) HAB disabled.

Reponse Status = 311069202 (0x128a8a12) Write complete.

PS C:Flashloader_i.MXRT1050_GAFlashloader_RT1050_1.1Toolssdphostwin> .sdphost.exe -u 0x1fc9,0x0130 -- read-register 0x401F46F0

00 00 00 00

Status (HAB mode) = 1450735702 (0x56787856) HAB disabled.

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

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