硬件平台资源:
SOC芯片:复旦微电子FMQL45t900
Flash芯片:深圳国微电子的SM25QH256MX 型256Mbits SPI Flash存储器
一.确定uboot和kernel是否能识别flash芯片
如果新型号的flash芯片无法识别,会出现如下情况:
- Uboot无法识别:uboot启动后,在加载内核和根文件系统之前,进入uboot命令行,输入指令:sf probe,回车,如果uboot无法识别该flash芯片,会出现如下打印信息:
如果uboot能够识别该flash芯片,会出现下面的结果:
- kernel无法识别,会出现如下现象:
首先是Linux系统启动过程中打印信息会提示flash芯片无法识别:
如果内核能正常识别flash芯片,打印信息是这样的(前提是已经在设备树中添加了QSPI节点的分区信息):
其次是如果内核不支持flash芯片,Linux系统启动后进入/dev/目录查看设备节点信息,会没有mtd0的节点,结果就会造成烧写EMMC的时候,无法烧写,提示找不到/dev/mtd0的节点。
从上面可以看出,uboot和kernel会分别独立的对spi flash芯片进行初始化,所以,如果需要系统支持一款新的spi flash芯片,需要同时修改uboot和kernel的配置。
二.修改配置uboot,使uboot支持新的flash芯片
1. 通过menuconfig添加spi flash芯片的驱动支持:
(1)cd到SDK目录---设置环境变量---cd到uboot源码目录---输入指令:make menuconfig
会弹出uboot配置界面:
(2)找到对应路径:Device Drivers--->SPI Flash Support--->勾选对应厂家的SPI Flash驱动的支持。
以深圳国微电子的SM25QH256MX 型256Mbits SPI Flash为例,因为是国产芯片,所以uboot中并没有对应品牌厂商的驱动支持,但是该型号芯片对标的是国外一款w25q256jve的flash芯片,其厂商是winbond,所以在uboot中勾选上:winbond spi flash support选项,这样uboot启动时,就会将winbond厂商各种型号的驱动也加载进来。
(3)依次点击save---OK---exit---直到退出uboot图形化配置界面。
2. 修在uboot源码,在源码中添加spi flash芯片型号对应的ID号等描述信息
(1)进入到SDK中,找到如下目录中的spi_flash.c文件,双击打开,找到如下函数
这里面我添加了几行打印信息,打印的是uboot启动后读取的spi flash芯片实际的ID值,系统启动后进入uboot指令,输入:sf probe,即可查看,一共是6个值,分为两组,前三个为flash芯片的Manufacture ID,也就是0x010219,后三个为Device ID的值,也就是0x4d0180,或者是0x4d01,具体情况跟芯片的型号有关,同时可以查看芯片手册来确定上面的两个ID的值。
有时候会遇到读出来的两组ID值相同,这个情况下Manufacture ID是:0x206019,Device ID是:0x00,或者查看flash芯片手册确定。
(2)进入到SDK中,找到如下目录中的spi_flash_ids.c文件,双击打开,
找到flash芯片对应厂商名字的宏定义部分,也就是刚才menuconfig中配置的厂商,之前添加的是winbond,在宏定义里面增加对应flash芯片的一些描述信息,例如Manufacture ID,Device ID,容量大小等等,图中红色圈出的。
W25q256jve是flash芯片的名字,按照实际情况写就行,0x206019和0x0是Manufacture ID和Device ID,根据uboot启动读出来的ID值填写就行,或者查询flash手册,后面是flash芯片的一些容量参数,64*1024是每块扇区的大小,一共有512块扇区,总容量是512*64/1024=32MB,根据芯片手册填写即可。
(3)cd到SDK目录,输入如下指令:
出现下面的提示证明uboot编译成功:
新生成的uboot.elf文件在image目录下:
取出用于生成BOOT.bin文件,系统启动时进入uboot命令行,输入指令:sf probe,修改后uboot如果能正常识别flash芯片的话,会有如下打印:
会列出flash芯片的名称,容量大小等。
三.修改配置kernel,使内核支持新的flash芯片
2. 修在kernel源码,在源码中添加spi flash芯片型号对应的ID号
(1)进入到SDK,按照如下目录找到spi-nor.c文件,双击打开:
找到对应flash芯片厂商的flash ID的定义部分,在里面添加新的flash芯片的描述信息(和uboot添加差不多)如下所示:
修改后保存。
(2)cd到SDK目录,输入如下指令:
出现下面的提示证明kernel编译成功:
新生成的uImage文件在image目录下:
取出用于系统启动,内核加载成功后,启动过程会打印spi flash芯片初始化成功的信息,同时/dev/目录下也能看到mtd0节点信息,如下所示:
四.修改配置设备树
1. 修改QSPI节点下spi flash芯片的属性名称
找到Procise工程下IAR编译生成的设备树文件夹DeviceTree目录,找到system-top.dts文件,找到qspi节点,将之前的”spansion,s25fl256s1”改为”winbond,w25q256jve”。
将修改后的DeviceTree文件夹放入到虚拟机的SDK中进行编译,这样编译出来的设备树文件才能生效。