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内核及文件系统。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值