欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统

程序员文章站 2022-06-26 18:23:52
前情提要:目前本人正在用ADSP-SC589开发板做开发,希望实现内核与文件系统都从SPI FLASH启动,但板子上原来的SPI FLASH太小了,于是更换了镁光的MT25QU01GBBB FLASH芯片。但是要想使开发板适配新的FLASH,需要对u-boot源码、设备树保存地址、内核保存地址以及文件系统的引导方式进行一定的修改。以下记录修改过程。开发环境开发板:ADSP-SC589 EZ-kit;原有的FLASH芯片:W25Q128FV;新的FLASH芯片:MT25QU01GBBB;u-boot...

前情提要:目前本人正在用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芯片的相关信息。
ADSP-SC589开发板更换SPI FLASH并从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。
ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统

1.4 使flash支持16MB以上地址

修改开发板的配置文件uboot/configs/sc589-ezkit.h,增加宏定义

#define CONFIG_SPI_FLASH_BAR

ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统
如不增加此宏定义,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地址,防止每次都要更改,节约了时间。

ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统
打开文件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) },

ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统

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;

ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统
修改此函数的原因:

因为我使用的镁光公司的芯片,厂商代码为0x20,与意法半导体的厂商代码相同。因此此函数会自动使用意法半导体的QUAD驱动,而这种驱动是不能适用于我们的芯片的。因此我们需要把调用意法半导体QUAD驱动的这一段代码注释掉,这样此函数就会使用Spansion的驱动了,这种驱动适用于我们的芯片。

3 修改设备树以设置flash分区

修改本开发板的设备树源码sc89-ezkit.dts,找到spi_2下的flash设备节点,将flash:后的w25q32@0改为w25q128@0,将三个分区的reg<>改成如下图所示:

ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统
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