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内核及文件系统。
ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统相关推荐
- FPGA基础入门【8】开发板外部存储器SPI flash访问
前两篇教程利用数码管project介绍了chipscope和各种烧写开发板的方式,这篇开始继续探索开发板,这次关注外置存储器的控制,外置指的是芯片外部,不是开发板外部.板子上的外置存储器有DDR2和S ...
- 转载:百为STM32开发板教程之十二——NAND FLASH
http://bbs.21ic.com/icview-586200-1-1.html 百为STM32开发板教程之十二--NAND FLASH 参考资料: 百为stm32开发板光盘V3\百为stm32开 ...
- 物联网开发笔记(60)- 使用Micropython开发ESP32开发板之SPI接口控制Micro SD卡TF卡模块
一.目的 这一节我们学习如何使用我们的ESP32开发板来通过SPI接口控制Micro SD卡TF卡模块. 二.环境 ESP32 + SPI接口控制Micro SD卡TF卡模块 + Thonny IDE ...
- Exynos4412开发板更换开机logo图片
我以linux3.5内核为列子. 首先linux内核默认的开机logo在:linux3.5/drivers/video/logo/ 目录下的 logo_linux_clut224.ppm. 所以我 ...
- 君正 Halley6 开发板调试SPI LCD
kernel版本:linux-4.4.94 CPU: X1600 LCD: 3.5 寸TFT(320×240),Model Name LQ035NC111 本⽂以芯⽚x1600, 开发板halley6 ...
- 野火的DSP28335开发板吧代码烧写到Flash中
说明是针对野火的DSP28335开发板里的例程进行实验的,环境是CCS5.5,已经验证.开发板里的例程都是在RAM里运行的,每次开机都是祝你生日快乐的音乐,经过一周的努力终于不用再受音乐的困扰.可以随 ...
- 百为STM32开发板教程之十二——NAND FLASH
参考资料: 百为stm32开发板光盘V3\百为stm32开发板光盘\芯片数据手册\K9F1208.pdf 百为stm32开发板光盘\st官方参考资料\Application notes\AN2784 ...
- 嵌入式开发板更换开机LOGO
1 先制作好想要的开机图片,此图片有是三个要求,像素是要和屏幕分辨率一样.位深度为 24.图片格式为bmp.我的屏幕是7寸的,所以我设置的分辨率为800*480.如下图 bmp格式图片的信息. 2利用 ...
- 运行在TQ2440开发板上以及X86平台上的linux内核编译
一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的"linux-2.6.30.4_20100531.tar.bz2"源码包. 解压(天嵌默 ...
最新文章
- loader调用过程
- SAP Marketing Cloud的profile dashboard
- 歌谣--回顾2020 展望2021
- 这大概是今年最值得推荐的“数据分析工具”
- Python学习1----在win系统中搭建Python编程环境
- Shell命令-搜索文件或目录之which、find
- Python学习笔记8—Python函数
- SpringBoot:java.lang.NullPointerException
- Reacvt-Native 图片下载使用介绍
- 那些通宵加班的年轻人
- mantis 邮件配置 linux,Linux系统 mantis 1.0.6工单系统配置安装
- 快狗打车CTO沈剑:怕什么技术无穷尽?进一寸有一寸的欢喜
- 关于互相尊重和直言有讳
- JPA-Hibernate快速入门图文教程
- 股票模拟交易日志(一)
- 【Web技术】1091- 跨浏览器窗口 ,7种方式,你还知道几种呢?
- ESP32-ADC学习
- JavaScript---constructor 和 prototype详解
- HTML实现好看的登录注册页面
- Excel函数之— SUMPRODUCT用法(一),太强大了
热门文章
- 解决iOS Retina屏幕0.5pt线宽颜色失真问题
- jquery mobile textarea宽度更改
- his服务器招标文件,HIS系统升级服务器及存储系统招标文件
- 从键盘上输入一个学生的成绩: 如果成绩在小于0或大于100,则显示“输入数据有误”; 如果成绩在0~59分,则输出“成绩为不及格”; 如果成绩在60~69分,则输出“成绩为及格”; 如果成绩在
- 工业机器人的臂部配置形式_工业机器人按臂部的运动形式分为哪几种?
- 10. 类的关系——关联关系
- python转化极坐标_数学高考与python
- ME860安装安卓电子市场(android market)
- 我国电子商务B2C市场和C2C市场规模的变化
- TFN TD97 手持式双目多功能红外热像仪 热成像仪 融合夜视仪 多功能昼夜侦查仪 望远镜 高端高灵敏度