大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是i.MXRT1050/1020/1015 系列 ROM 中的 FlexSPI 驅(qū)動 API 使用。
?
今天痞子衡去 4S 店給愛車做保養(yǎng)了,保養(yǎng)一次要等兩小時,閑來無聊就寫了這篇文章打發(fā)時間,正好痞子衡技術(shù)交流群里有朋友也在問這個主題,急人所急是痞子衡的一大特質(zhì)(此處請允許我裝一下)。
?
本篇是?《利用 i.MXRT1xxx 系列 ROM 提供的 FlexSPI driver API 可輕松 IAP》?的續(xù)集,上篇文章基本上把 ROM API 原理及使用講得很透徹了,但文中賣了一個關(guān)子,即 i.MXRT1xxx 系列一共出了 7 款型號,但并不是每個型號都開放了 ROM API,最早誕生的三款型號(105x、1021、1015)就并沒有開放 API(不是沒有 API,而是沒有嚴格測試),隨著 ROM API 的優(yōu)點逐漸被大家意識到,客戶要求 API 開放的呼聲也越來越高,因此恩智浦研發(fā)團隊對未開放的 API 做了測試,明確功能一切正常后,終于官宣了。所以今天痞子衡著重講這三款未開放 API 的 RT 型號在 API 使用上跟主流 RT 型號(如 i.MXRT1060)有什么區(qū)別。
?
?
一、ROM API 簡介
1.1、API 設(shè)計實現(xiàn)
關(guān)于 i.MXRT1050/1020/1015 API 設(shè)計原理,這里就不予贅述了,因為跟 i.MXRT1060 中是一樣的。咱們直接看它們的 API 原型 bootloader_api_entry_t,細心的朋友會發(fā)現(xiàn)在原型定義上跟 i.MXRT1060 是有區(qū)別的,結(jié)構(gòu)體中前 3 個成員順序上不一樣,其實這是早期的原型定義,存在不合理的地方,顯然 version 放第一個才符合 API 標準定義,因此這在 i.MXRT1060 中得到了改進。此外在后面 API 分組功能上也差異較大,不過我們最在意的 FlexSPI NOR 驅(qū)動 API 在就行。
?
下面是 i.MXRT1050 中的 g_bootloaderTree 實例,其實只真正提供了 HAB、FlexSPI NOR、NAND ECC 三類 API:
?
下面是 i.MXRT1020/1015 中的 g_bootloaderTree 實例,這里甚至只提供了 FlexSPI NOR API,沒辦法,BootROM 空間有限:
?
二、API 之 FlexSPI 驅(qū)動
2.1 FlexSPI 驅(qū)動原型
flexspi_nor_driver_interface_t 是 FlexSPI NOR 驅(qū)動的原型,原型中定義了全部的 API 函數(shù),但具體在每個 RT 型號里并不是都有實例。
下面是 i.MXRT1050 中的 g_flexspiNorDriverInterface 實例,缺少了 get_config()函數(shù)實現(xiàn):
下面是 i.MXRT1020/1015 中的 g_flexspiNorDriverInterface 實例,除了缺少 get_config()函數(shù),還缺少 erase_all()函數(shù)實現(xiàn):
?
2.2 FlexSPI 驅(qū)動使用示例
根據(jù)前面介紹,我們知道未開放的 API 主要缺少 get_config()函數(shù),其他都是一樣的,但是別小看這個 get_config()函數(shù),它可是 API 簡便易用的核心所在,現(xiàn)在沒有了這個函數(shù),我們只能根據(jù)板子上的 Flash 型號去手工提供 512bytes 的 flexspi_nor_config_t 變量。
2.3 FlexSPI 配置變量初始化
那么如何初始化這 512bytes 的 flexspi_nor_config_t 變量呢,這就說來話長了,痞子衡講一個最常見的四線 QSPI Flash 的配置吧。
?
我們知道 i.MXRT1060-EVK 上默認連的是 ISSI 的 8MB QSPI Flash,SDK XIP 工程里默認使用了它的配置,在 SDK_2.x.x_EVK-MIMXRT1060boardsevkmimxrt1060xipevkmimxrt1060_flexspi_nor_config.c 中定義了常量 qspiflash_config,我們可以參考這個常量定義。
?
?
qspiflash_config 適用于四線、100MHz、8MB 的 Flash,如果你的 QSPI Flash 在大小和速度上與它不同,可以做相應(yīng)調(diào)整。不過這個 qspiflash_config 主要是給 ROM 啟動用的,而 ROM 啟動僅需要讀 Flash,因此這個配置中 LUT 僅有 Read,而我們需要的 API 一般都要實現(xiàn)擦除和編程,因此要修改其 lookupTable 如下:
?
?
至此,i.MXRT1050/1020/1015 系列 ROM 中的 FlexSPI 驅(qū)動 API 使用痞子衡便介紹完畢了,掌聲在哪里~~~