大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT上使用16MB以上NOR Flash軟復位無法正常啓動問題的分析解決經驗。
五年前痞子衡寫過一篇文章 《IS25WP256D的Bank Address Register[0]使用對RT1050軟復位啓動的影響》,這篇文章介紹了對大容量 Flash(>16MB) 的3字節地址命令下高/低地址空間(128Mb segment)切換特殊設計的利用需要注意,如果主芯片 App 程序中包含內核軟復位設計,記得內核復位前先將 Flash 設置到初始狀態。
最近有一個 RT1180 客户,啓動 Flash 選用得是 IS25LP256H,App 程序裏使用 Zephyr Flash 驅動時發現只要調用了 flash_flexspi_nor_4byte_enable() 函數後再做內核軟復位,芯片就不能再次啓動了,這其實還是大容量 Flash 地址模式搞的鬼。今天痞子衡就和大家聊聊這個問題:
一、大容量Flash地址模式設計
痞子衡列出了下面 6 個主流 Flash 廠商的代表大容量 QSPI NOR 型號,將其關於地址模式的信息整理在了一起,開頭提及的文章裏 4.3 關於Flash的3/4字節地址 小節説了,大容量 Flash 一般都支持 3/4B 地址兩套命令,4B 地址命令只接受 4B 地址(不受地址模式影響),3B 地址命令則根據當前地址模式來決定到底跟 3/4B 地址。
| Flash | 地址模式設計 | ||||
|---|---|---|---|---|---|
| 進/出4B地址命令 | 高低Segment配置位 | 高低Segment寄存器寫命令 | 3/4B地址配置位 | 3/4B地址寄存器寫命令 | |
| IS25LP256H | 0xB7/0xE9 | Bank Address Register[0] - BA24 | 0x18/0xC5 | Bank Address Register[7] - EXTADD | 0x18/0xC5 |
| W25Q256JV | 0xB7/0xE9 | Extended Address Register[0] - A24 | 0xC5 | Status Register-3[1:0] - ADP,ADS | 0x11 |
| GD25Q256M | 0xB7/0xE9 | Extended Address Register[0] - A24 | 0xC5 | Status Register-2[13:12] - ADS,ADP | 0x31 |
| MX25L25645G | 0xB7/0xE9 | Extended Address Register[0] - A24 | 0xC5 | Configuration Register[5] - 4BYTE | 0x01 |
| S25FL256L | 0xB7/0xE9 | N/A | N/A | Configuration Register 2 Volatile[1:0] - ADP,ADS | 0x71 |
| MT25QL256A | 0xB7/0xE9 | Extended Address Register[0] - A24
16bit Configuration Register[0] |
0xC5,0xB1 | N/A | N/A |
上表裏我們可以看到所有廠商對於進入/退出 4B 地址模式的命令設計都是一樣的(初始情況下 Flash 都是 3B 地址模式),關於高低 Segment 配置設計除了 Infineon 之外,其他廠商都支持並且設計上也兼容。最後就是 3/4B 地址模式切換除了有專用命令設計外,除 Micron 之外的其他廠商也提供直接寫配置寄存器的方式,但是這裏分為兩派:一派是 Winbond、GigaDevice、Infineon,其寫寄存器切換地址模式僅在 POR 或者 reset 時才會生效,而另一派 ISSI、MXIC 則寫了相應配置寄存器後新地址模式直接生效。
二、Zephyr下flash_flexspi_nor_4byte_enable()
瞭解了大容量 Flash 的地址模式以及切換方法,我們再來看看 Zephyr 驅動裏是怎麼處理的,我們找到這個函數實現,其 en4b 參數區分了好幾種不同處理,最主要的方式就是發 0xB7 專用命令切到 4B 地址模式。
en4b & BIT(6) - Flash is always in 4 byte mode. We just need to configure LUT
en4b & BIT(0) - Issue instruction 0xB7
en4b & BIT(1) - Issue write enable, then instruction 0xB7
en4b & BIT(4) - Set bit 0 of 16 bit configuration register via 0xB1 cmd
Other methods not supported. Include:
BIT(2): 8-bit volatile extended address register used to define A[31:24] bits.
BIT(3): 8-bit volatile bank register used to define A[31:24] bits.
BIT(5): Dedicated vendor instruction set.
從這個函數設計我們知道 Zephyr Flash 驅動使用了 3B 地址命令結合地址模式切換來支持所有容量 Flash 的全部空間訪問,並沒有啓用 4B 地址命令(畢竟 4B 地址命令僅在大容量 Flash 上支持)。
三、RT系列對於Flash地址模式處理
我們知道 RT 系列芯片上電 ROM 默認是用 0x03 命令 + 3B 地址來獲取 FCB 的,當第一次啓動成功之後,如果 App 程序裏將 Flash 切換到 4B 地址模式,然後做內核軟復位重新啓動,此時 ROM 再用 0x03 命令 + 3B 地址就不能再拿到正確的 FCB 了,這就是再次啓動失敗的原因。
3.1 RT10xx系列ROM設計
在 RT10xx 上 ROM 在 BT_CFG 的 FLASH_TYPE 裏放了 3'b000 和 3'b001 兩種配置,分別對應 Flash 是 3B/4B 地址模式兩種情況,從而用 0x03 命令 +3/4B 地址來獲取 FCB。這樣的設計僅對 RT 芯片 POR 時有效,但如果是切換 Flash 地址模式後內核軟復位的情況依然失效(因為 BT_CFG 不能動態更改)。
更進一步的理解是這種設計是針對 Flash 默認地址模式是 4B 的情況,但實際上幾乎沒有 Flash 默認地址模式是 4B,畢竟已經有一套專門 4B 地址命令在這了。
3.2 RT11xx/RT3digits系列ROM設計
為了改進 RT10xx 上 ROM 缺陷,在 RT11xx ROM 裏 xSPI_FLASH_TYPE 乾脆就拿掉了 3'b001 配置(注意這裏僅僅是文檔方面移除,代碼裏實際上支持還在),取而代之的是真正解決地址模式切換問題的手段,詳見痞子衡舊文 《RT系列ROM中集成的NOR SW Reset功能》,簡單來説就是假設 Flash 軟復位後狀態是 3B 地址模式,ROM 上電後先對 Flash 做一次軟復位,再用 0x03 命令 +3B 地址來獲取 FCB,這個設計邏輯看起來通順了,唯一需要注意的是軟復位能不能將 Flash 地址模式恢復到默認狀態,這個需要檢查具體 Flash 數據手冊。
四、通用解決方案
上一節講得都是依賴 ROM 來解決 Flash 地址模式切換問題,這其實還是沒有把控全局的感覺,畢竟 Flash 地址模式是在 App 程序裏切換的,那顯然 App 程序在做內核軟復位的時候自己主動將 Flash 地址模式再切回來不就完了嗎!就像痞子衡舊文 《SW Reset退出NOR Continuous read模式》 裏做法那樣,App 程序里加上 Flash 復位命令相關代碼(對本文來説也可以是退出 4B 地址模式命令相關代碼),在需要的地方調用一下即可。
至此,i.MXRT上使用16MB以上NOR Flash軟復位無法正常啓動問題的分析解決經驗痞子衡便介紹完畢了,掌聲在哪裏~~~
歡迎訂閲
文章會同時發佈到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平台上。
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。