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