uboot 增加不同型号的 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),
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
重新回头看一下前面的报错信息,提示是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
文章来源: great.blog.csdn.net,作者:小麦大叔,版权归原作者所有,如需转载,请联系作者。
原文链接:great.blog.csdn.net/article/details/117752714
- 点赞
- 收藏
- 关注作者
评论(0)