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.c
的919行,有相应的输出,具体如下图所示;
这里打开spi_flash.c
可以看到;
从代码中可以看出,这段程序试图在 spi_flash_ids
这个数组中查找是否有和板载 flash
对应的 id
于是我就尝试找到这个数组;
可以看到,在spi_flash_ids.c
的46行,出现了 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 (转)