今天痞子衡給大家介紹的是導(dǎo)致串行NOR Flash在i.MXRT下無(wú)法正常下載/啟動(dòng)的常見(jiàn)因素之SFDP。
基于i.MXRT的客戶產(chǎn)品也越來(lái)越多,可以說(shuō)是全面開(kāi)花了。痞子衡作為i.MXRT產(chǎn)品線的系統(tǒng)應(yīng)用工程師,早期的時(shí)候還可以盡情做參考設(shè)計(jì),現(xiàn)在基本大量時(shí)間都被客戶支持占據(jù)了。
因?yàn)閕.MXRT系列都沒(méi)有內(nèi)置Flash(RT1064, RT1024等SIP型號(hào)除外),因此為其搭配一塊串行NOR Flash去啟動(dòng)是客戶項(xiàng)目的第一個(gè)頭等大事,而串行NOR Flash廠商非常多,客戶選擇余地很大,因此我們不得不與客戶一起同茫茫Flash型號(hào)打交道,痞子衡也常常調(diào)侃自己已淪為Flash測(cè)試工程師。
痞子衡在支持客戶解決串行NOR Flash下載啟動(dòng)問(wèn)題過(guò)程中主要遇到幾個(gè)常見(jiàn)因素,這幾個(gè)因素可能會(huì)影響Flash在i.MXRT下無(wú)法正常使用,今天痞子衡就重點(diǎn)跟大家聊聊SFDP這個(gè)因素。
1.SFDP標(biāo)準(zhǔn)簡(jiǎn)介
SFDP又叫JESD216,是JEDEC協(xié)會(huì)于2011年開(kāi)始推出的串行Flash接口標(biāo)準(zhǔn),類似于CFI在并行NOR Flash上的標(biāo)準(zhǔn)。SFDP發(fā)展至今已經(jīng)誕生了如下版本:
我們知道串行Flash廠商非常多,在2011年之前,大家都是各自玩,沒(méi)有明確的統(tǒng)一標(biāo)準(zhǔn)(雖然幾個(gè)領(lǐng)頭廠商起了示范作用,但各家在具體細(xì)節(jié)上還是會(huì)有差異),這對(duì)于Flash用戶來(lái)說(shuō)就比較麻煩了,需要把各家Flash手冊(cè)仔細(xì)研讀,不能漏掉任何一個(gè)細(xì)節(jié)。
隨著串行Flash市場(chǎng)需求越來(lái)越強(qiáng)烈,各個(gè)廠商也在鉚足勁給自家Flash加特性,這時(shí)候JEDEC站出來(lái)了,拉了幾個(gè)主要的Flash廠商一起訂個(gè)SFDP標(biāo)準(zhǔn),有了這個(gè)標(biāo)準(zhǔn),F(xiàn)lash用戶就方便多了,尤其是軟件設(shè)計(jì)人員,開(kāi)發(fā)Flash驅(qū)動(dòng)從此有標(biāo)準(zhǔn)可依,甚至一套驅(qū)動(dòng)可以用在所有支持SFDP標(biāo)準(zhǔn)的Flash上,實(shí)現(xiàn)各廠商Flash之間輕松切換。
2.部分Flash型號(hào)不支持SFDP
因?yàn)镾FDP標(biāo)準(zhǔn)是2011年才開(kāi)始推出,新興Flash廠商(比如兆易創(chuàng)新)的產(chǎn)品基本都是支持SFDP標(biāo)準(zhǔn)的,而部分老牌Flash廠商(比如華邦)則存在老型號(hào)和新型號(hào)共存的問(wèn)題。老型號(hào)都是2011年前設(shè)計(jì)生產(chǎn)的,不支持SFDP;2011年之后設(shè)計(jì)的新型號(hào)基本都是支持SFDP的。
華邦目前是串行Flash第一大廠商,痞子衡遇到好幾個(gè)i.MXRT客戶,選用的華邦NOR Flash,但Flash里不支持SFDP,因此客戶支持稍微復(fù)雜一些。關(guān)于SFDP支持問(wèn)題,痞子衡特別聯(lián)系過(guò)華邦銷售人員,得到了他們的答復(fù),華邦NOR Flash家族里 W25QxxJV 和 W25QxxJW 系列都是新型號(hào),全部支持SFDP;而 W25QxxFV 和W25QxxFW 系列屬于老型號(hào),大多沒(méi)有SFDP,但是也有如下部分型號(hào)支持SFDP:
雖然我們可以在后續(xù)開(kāi)發(fā)的過(guò)程中也能正常使用非SFDP標(biāo)準(zhǔn)的Flash以及能通過(guò)讀SFDP命令查詢出芯片是否支持SFDP,但最好在Flash選型前就能明確知道其SFDP情況,這個(gè)需要跟Flash廠商銷售溝通好。總之,痞子衡推薦大家選用各廠商支持SFDP標(biāo)準(zhǔn)的新型號(hào)。
3.不支持SFDP的Flash如何適用i.MXRT下載
如果你認(rèn)真看過(guò)痞子衡寫(xiě)的i.MXRT啟動(dòng)系列文章,你應(yīng)該知道i.MXRT之所以能夠支持市面上幾乎所有的串行NOR Flash啟動(dòng)是靠的512 byte的FDCB結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體原型即flexspi_nor_config_t,它可以描述啟動(dòng)所需的所有Flash參數(shù)信息。
i.MXRT在啟動(dòng)時(shí)首先會(huì)用1bit SDR時(shí)序模式去獲取用戶放在Flash開(kāi)始或偏移0x400處(因i.MXRT型號(hào)而異)的FDCB,然后根據(jù)FDCB里的信息去進(jìn)一步配置啟動(dòng),因此Flash里有無(wú)SFDP其實(shí)不影響啟動(dòng),只要在FDCB里描述清楚即可。
但是Flash里有無(wú)SFDP非常影響在i.MXRT相關(guān)配套工具下的擦寫(xiě)操作(俗稱下載),因?yàn)樗泄ぞ撸↗Link、各IDE、ROM配套Flashloader、痞子衡的MCUBootUtility)默認(rèn)都是基于SFDP來(lái)設(shè)計(jì)Flash下載算法的。
僅以ROM配套Flashloader為例,其上位機(jī)工具是blhost.exe,它有如下經(jīng)典的命令序列。這個(gè)序列就是利用用戶提供簡(jiǎn)化的串行Flash配置值0xc0000007(描述一般的四線QSPI)來(lái)初始化FlexSPI以及Flash,為后續(xù)擦寫(xiě)操作做準(zhǔn)備。
blhost -u -- fill-memory 0x20202000 4 0xc0000007
blhost -u -- configure-memory 0x9 0x20202000
configure-memory命令底層到底是什么樣的邏輯呢?讓我們找到任何一個(gè)SDK包,在SDK_2.x.x_MIMXRTxxxx-EVKmiddlewaremcu-bootsrcmemorysrcflexspi_nor_memory.c里可以找到如下函數(shù)flexspi_nor_mem_config(),它就是其底層邏輯,在這個(gè)函數(shù)里我們可以看到,F(xiàn)lashloader會(huì)判斷傳來(lái)的config值到底是簡(jiǎn)化的serial_nor_config_option_t,還是完整的flexspi_nor_config_t。
如果config是簡(jiǎn)化的serial_nor_config_option_t,F(xiàn)lashloader會(huì)調(diào)用flexspi_nor_get_config()函數(shù)去自動(dòng)填充生成完整的flexspi_nor_config_t,你可以繼續(xù)去看flexspi_nor_get_config()函數(shù)的實(shí)現(xiàn),對(duì)于普通四線QSPI,其就是根據(jù)Flash里讀回的SFDP表內(nèi)容來(lái)做的填充,因此這種方式下SFDP不可缺。
status_t flexspi_nor_mem_config(uint32_t *config)
{
status_t status = kStatus_InvalidArgument;
bool isNorConfigOption = false;
serial_nor_config_option_t *option = (serial_nor_config_option_t *)config;
flexspi_nor_config_t *norConfig = (flexspi_nor_config_t *)config;
if (option->option0.B.tag == kSerialNorCfgOption_Tag)
{
status = flexspi_nor_get_config(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock, option);
// ...
isNorConfigOption = true;
}
else if (norConfig->memConfig.tag == FLEXSPI_CFG_BLK_TAG)
{
memcpy(&s_flexspiNorConfigBlock, norConfig, sizeof(flexspi_nor_config_t));
isNorConfigOption = true;
}
// ...
if (isNorConfigOption)
{
status = flexspi_nor_flash_init(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock);
// ...
}
return status;
}
上面這種0xc0000007搞定一切四線QSPI的方式僅適用于含SFDP的Flash,對(duì)于不含SFDP的Flash怎么辦呢。其實(shí)上面已經(jīng)給了解決方法,那就是直接提供完整的FDCB,因此i.MXRT相關(guān)配套工具下載算法都需要相應(yīng)改一下,痞子衡在兩個(gè)項(xiàng)目上都做了非SFDP Flash支持:
J-Link下載算法源工程,可以參考 /boards/msft_rt600_xproject/flash_algo_b0_silicon/Keil_JLink 這個(gè)源工程MCUBootUtility v2.3更新,參看文章 《MCUBootUtility v2.3發(fā)布,這次不再放過(guò)任何一款Flash》 第2.3節(jié)
至此,導(dǎo)致串行NOR Flash在i.MXRT下無(wú)法正常下載/啟動(dòng)的常見(jiàn)因素之SFDP痞子衡便介紹完畢了~~~
文章出處:痞子衡嵌入式