U-Boot驱动篇 | 增加不同型号的Nor-Flash

Posted Neutionwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了U-Boot驱动篇 | 增加不同型号的Nor-Flash相关的知识,希望对你有一定的参考价值。

之前我自己设计了一个板子,用的spi-flash的型号是w25q128,后面为了验证一个问题,买了一块方案验证板子,上面flash的型号是xt25f128b,于是,我将之前编译好的固件直接烧录进去就出现了问题,终端打印的错误信息如下:
unrecognized JEDEC id bytes: 0b, 40, 18

具体如下图所示:
错误信息
根据报错信息,我开始漫漫调试之旅,首先在U-boot的源码下进行查找打印日志的位置,发现在spi_flash.c919行,有相应的输出,具体如下图所示;

这里打开spi_flash.c可以看到;

从代码中可以看出,这段程序试图在 spi_flash_ids 这个数组中查找是否有和板载 flash 对应的 id
于是我就尝试找到这个数组;


可以看到,在spi_flash_ids.c46行,出现了 spi_flash_ids 这个数组的定义,打开这个文件;


找到了定义相应falsh型号,id,容量等信息,只需要将板子上的flash相应信息填入到这个数组就行了。

看了一下INFO这个宏定义:

/* Used when the "_ext_id" is two bytes at most */
#define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags)    \\
        .id = {                         \\
            ...
        .id_len = (!(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))),   \\
        .sector_size = (_sector_size),              \\
        .n_sectors = (_n_sectors),              \\
        .page_size = 256,                   \\
        .flags = (_flags),

    

重新回头看一下前面的报错信息,提示是JEDEC id无法识别,那下面简单看一下什么是JEDEC id?


什么是JEDEC?
JEDEC是针对Nor flash的一种标准,另外一种标准是CFI
JEDEC:全称是Joint Electron Device Engineering Council 即电子元件工业联合会。

JEDEC是由生产厂商们制定的国际性协议,主要为内存制定;
用来帮助程序读取Flash的制造商ID和设备ID,以确定Flash的大小和算法,如果芯片不支持CFI,就需使用JEDEC了。
工业标准的内存通常指的是符合JEDEC标准的一组内存。

板子上的flash型号是xt25f128b,在datasheet中找到flash的id,确实也是 0x0b4018

因为这个flash和w25q128fw相似,因此我直接复制,然后修改了id,具体如下图所示;

重新编译了u-boot,将固件烧录到flash中,这次成功启动,并且能识别到相应的spi-flash;具体如下图所示;

不过这个时候,还没有修改kernel里的设备树设置:

参考:
https://zhuanlan.zhihu.com/p/76221655
https://github.com/thirtythreeforty/businesscard-linux/issues/11

以上是关于U-Boot驱动篇 | 增加不同型号的Nor-Flash的主要内容,如果未能解决你的问题,请参考以下文章

RK356x U-Boot研究所(驱动篇)4.1 驱动模型DM浅析(以UCLASS_DEMO为例)

u-boot器件驱动模型(Device&Drivers)之uclass (转)

《转》u-boot移植烧写步骤u-boot命令和kernel烧写步骤

U-Boot番外篇 | U-Boot驱动模型DM介绍

u-boot硬件驱动——以SD卡为例

Linux嵌入式驱动学习之路⑥u-boot移植