ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统
前情提要:目前本人正在用ADSP-SC589开发板做开发,希望实现内核与文件系统都从SPI FLASH启动,但板子上原来的SPI FLASH太小了,于是更换了镁光的MT25QU01GBBB FLASH芯片。但是要想使开发板适配新的FLASH,需要对u-boot源码、设备树保存地址、内核保存地址以及文件系统的引导方式进行一定的修改。以下记录修改过程。
开发环境
开发板:ADSP-SC589 EZ-kit;
原有的FLASH芯片:W25Q128FV;
新的FLASH芯片:MT25QU01GBBB;
u-boot版本:经过ADI公司剪裁的u-boot,可在开发板产品页下载。
1 修改u-boot源码
新的FLASH芯片大体上可以与u-boot原来的SPI驱动兼容,但需要修改一下u-boot中的SPI FLASH ID,以使新的芯片可以被识别。
1.1 修改结构体数组spi_flash_params_table[]
结构体数组spi_flash_params_table[]位于uboot源码/driver/mtd/spi/sf_params.c文件下,它定义了u-boot支持的flash芯片的相关信息。
数组中元素的典型格式为
{"W25Q128BV", 0xef4018, 0x0, 64 * 1024, 256, RD_FULL, WR_QPP | SECT_4K},
"W25Q128BV":代表芯片名称;
0xef4018:前两字节代表芯片的厂商ID,后四字节代表芯片的设备ID;
0x0:代表extend ID;
64 * 1024:代表页的大小;
256:代表页的数量;
RD_FULL:读命令的枚举列表;
WR_QPP | SECT_4K:一些特殊参数。
以上信息一般都可以从芯片手册中找到。
我的MT25QU01GBBB芯片ID为0x20,设备ID为0xBB21,extend ID为0x1040,页大小为64K,页的数量为2048。
为了尽量少改写内容以免出错,我在原有芯片W25Q128FV的信息的基础上进行修改,芯片名与读命令列表、特殊参数保持不变,其余项按照MT25QU01GBBB芯片手册上的内容进行修改,最后得到:
{"W25Q128BV", 0x20bb21, 0x1040, 64 * 1024, 2048, RD_FULL, WR_QPP | SECT_4K}
1.2 宏定义CONFIG_SPI_FLASH_WINBOND
修改完成后,若程序能正常编译修改过的代码段,则跳过此步;若不能正常编译,则还需添加宏定义CONFIG_SPI_FLASH_WINBOND。
打开文件uboot源码/configs/sc_adi_common.h,找到其中
#ifdef CONFIG_SPI_FLASH_ALL
... ...
一段,将其修改为:
#ifndef CONFIG_SPI_FLASH_WINBOND
# define CONFIG_SPI_FLASH_WINBOND
1.3 修改宏定义SPI_FLASH_CFI_MFR_WINBOND
由于我们直接采用原芯片的框架进行FLASH识别,需要将原芯片的厂商编号修改成新芯片的。WINBOND是我们原芯片的制造商,其厂商编号为0xef;我们使用的新芯片的厂商ID则是0x20.因此需要将uboot源码/driver/mtd/spi/sf_internal.h文件中的宏定义SPI_FLASH_CFI_MFR_WINBOND从0xef修改为0x20。
1.4 使flash支持16MB以上地址
修改开发板的配置文件uboot/configs/sc589-ezkit.h,增加宏定义
#define CONFIG_SPI_FLASH_BAR
如不增加此宏定义,uboot的spi flash驱动将只能识别16MB以下的地址,如果强行使用大于16MB的地址,会导致读写出现问题。并且会报错:
SF: Warning - Only lower 16MiB accessible,Full access #define CONFIG_SPI_FLASH_BAR
1.5 修改u-boot ip地址和网关地址
本小节内容与FLASH关系不大,纯粹是为了我个人方便。
由于u-boot的默认ip地址与我tftp服务器不在一个网段,每次刷u-boot的时候都要设置环境变量,非常麻烦。但可以通过以下方法设置u-boot的IP地址,防止每次都要更改,节约了时间。
打开文件uboot源码/configs/sc_adi_common.h,找到其中Network Settings部分,修改相关参数。
2 修改内核驱动文件
2.1 修改spi_nor_ids结构体
修改内核源码/drivers/mtd/spi-nor/spi-nor.c文件中的结构体数组spi_nor_ids[],将其中的"w25q128"一项改为
{ "w25q128", INFO(0x20bb21, 0x1040, 64 * 1024, 2048, SECT_4K| SPI_NOR_QUAD_READ) },
2.2 修改函数set_quad_mode
修改文件内核源码/drivers/mtd/spi-nor/spi-nor.c中的函数set_quad_mode,将以下段落注释掉:
case CFI_MFR_ST:
status = micron_quad_enable(nor);
if (status) {
dev_err(nor->dev, "Micron quad-read not enabled\n");
return -EINVAL;
}
return status;
修改此函数的原因:
因为我使用的镁光公司的芯片,厂商代码为0x20,与意法半导体的厂商代码相同。因此此函数会自动使用意法半导体的QUAD驱动,而这种驱动是不能适用于我们的芯片的。因此我们需要把调用意法半导体QUAD驱动的这一段代码注释掉,这样此函数就会使用Spansion的驱动了,这种驱动适用于我们的芯片。
3 修改设备树以设置flash分区
修改本开发板的设备树源码sc89-ezkit.dts,找到spi_2下的flash设备节点,将flash:后的w25q32@0改为w25q128@0,将三个分区的reg<>改成如下图所示:
reg变量的第一个数字表示分区的起始地址,第二个数字表示分区的大小。我将flash的mtd分区分为3个,分别命名为uboot、kernel和root file system。在设置分区时一定要注意各分区不要有重叠。
4 将设备树、内核、文件系统烧写进FLASH
在开始烧写前,请确定你已经将要烧写的设备树文件、内核镜像和jffs2格式的文件系统镜像放入主机的**/tftpboot**目录下。
4.1 烧写设备树
打开minicom,进入uboot命令行,输入以下指令:
$ sf probe 2:1
$ tftp ${loadaddr} sc589-ezkit.dtb
$ sf erase 0x100000 0x40000
$ sf write ${loadaddr} 0x100000 ${filesize}
设备树已烧写至flash地址0x100000处。
4.2 烧写内核
本步骤应使用此文章中第6节如何配置与编译适用于ADSP-SC589的U-boot和Linux内核生成的不含文件系统的uImage镜像。
在minicom中输入以下命令:
$ tftp ${loadaddr} uImage
$ sf erase 0x800000 0x800000
$ sf write ${loadaddr} 0x800000 ${filesize}
内核已烧写至flash地址0x800000处。
4.3 烧写文件系统
在minicom中输入以下命令
$ tftp ${loadaddr} rootfs.jffs2
$ sf erase 0x2000000 0x4000000
$ sf write ${loadaddr} 0x2000000 ${filesize}
设备树已烧写至flash地址0x2000000处,同时该地址也是mtd分区mtdblock2的起始地址。
5 配置uboot环境变量
在minicom控制台中设置以下环境变量,将u-boot配置为使用norflash上的文件系统。
$ set flashargs set bootargs root=/dev/mtdblock2 rw rootwait rootfstype=jffs2 clkin_hz=(25000000) earlyprintk console=ttySC0,57600
$ set flashboot 'run flashargs; sf probe 2:1;sf read ${dtbaddr} 0x100000 0x40000;sf read ${loadaddr} 0x800000 0x800000;bootm ${loadaddr} - ${dtbaddr}'
$ set bootcmd run flashboot
$ save
配置完后重启开发板,即可自动从spi flash中引导Linux内核及文件系统。
本文地址:https://blog.csdn.net/weixin_44839882/article/details/108920281
上一篇: 链游玩家:简谈链游经济体系的几个方面
下一篇: 他是项羽的左膀右臂,最后结局如何?