前情提要:目前本人正在用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引导内核与文件系统相关推荐

  1. FPGA基础入门【8】开发板外部存储器SPI flash访问

    前两篇教程利用数码管project介绍了chipscope和各种烧写开发板的方式,这篇开始继续探索开发板,这次关注外置存储器的控制,外置指的是芯片外部,不是开发板外部.板子上的外置存储器有DDR2和S ...

  2. 转载:百为STM32开发板教程之十二——NAND FLASH

    http://bbs.21ic.com/icview-586200-1-1.html 百为STM32开发板教程之十二--NAND FLASH 参考资料: 百为stm32开发板光盘V3\百为stm32开 ...

  3. 物联网开发笔记(60)- 使用Micropython开发ESP32开发板之SPI接口控制Micro SD卡TF卡模块

    一.目的 这一节我们学习如何使用我们的ESP32开发板来通过SPI接口控制Micro SD卡TF卡模块. 二.环境 ESP32 + SPI接口控制Micro SD卡TF卡模块 + Thonny IDE ...

  4. Exynos4412开发板更换开机logo图片

    我以linux3.5内核为列子. 首先linux内核默认的开机logo在:linux3.5/drivers/video/logo/ 目录下的   logo_linux_clut224.ppm. 所以我 ...

  5. 君正 Halley6 开发板调试SPI LCD

    kernel版本:linux-4.4.94 CPU: X1600 LCD: 3.5 寸TFT(320×240),Model Name LQ035NC111 本⽂以芯⽚x1600, 开发板halley6 ...

  6. 野火的DSP28335开发板吧代码烧写到Flash中

    说明是针对野火的DSP28335开发板里的例程进行实验的,环境是CCS5.5,已经验证.开发板里的例程都是在RAM里运行的,每次开机都是祝你生日快乐的音乐,经过一周的努力终于不用再受音乐的困扰.可以随 ...

  7. 百为STM32开发板教程之十二——NAND FLASH

    参考资料: 百为stm32开发板光盘V3\百为stm32开发板光盘\芯片数据手册\K9F1208.pdf 百为stm32开发板光盘\st官方参考资料\Application notes\AN2784 ...

  8. 嵌入式开发板更换开机LOGO

    1 先制作好想要的开机图片,此图片有是三个要求,像素是要和屏幕分辨率一样.位深度为 24.图片格式为bmp.我的屏幕是7寸的,所以我设置的分辨率为800*480.如下图 bmp格式图片的信息. 2利用 ...

  9. 运行在TQ2440开发板上以及X86平台上的linux内核编译

    一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的"linux-2.6.30.4_20100531.tar.bz2"源码包. 解压(天嵌默 ...

最新文章

  1. loader调用过程
  2. SAP Marketing Cloud的profile dashboard
  3. 歌谣--回顾2020 展望2021
  4. 这大概是今年最值得推荐的“数据分析工具”
  5. Python学习1----在win系统中搭建Python编程环境
  6. Shell命令-搜索文件或目录之which、find
  7. Python学习笔记8—Python函数
  8. SpringBoot:java.lang.NullPointerException
  9. Reacvt-Native 图片下载使用介绍
  10. 那些通宵加班的年轻人
  11. mantis 邮件配置 linux,Linux系统 mantis 1.0.6工单系统配置安装
  12. 快狗打车CTO沈剑:怕什么技术无穷尽?进一寸有一寸的欢喜
  13. 关于互相尊重和直言有讳
  14. JPA-Hibernate快速入门图文教程
  15. 股票模拟交易日志(一)
  16. 【Web技术】1091- 跨浏览器窗口 ,7种方式,你还知道几种呢?
  17. ESP32-ADC学习
  18. JavaScript---constructor 和 prototype详解
  19. HTML实现好看的登录注册页面
  20. Excel函数之— SUMPRODUCT用法(一),太强大了

热门文章

  1. 解决iOS Retina屏幕0.5pt线宽颜色失真问题
  2. jquery mobile textarea宽度更改
  3. his服务器招标文件,HIS系统升级服务器及存储系统招标文件
  4. 从键盘上输入一个学生的成绩: 如果成绩在小于0或大于100,则显示“输入数据有误”; 如果成绩在0~59分,则输出“成绩为不及格”; 如果成绩在60~69分,则输出“成绩为及格”; 如果成绩在
  5. 工业机器人的臂部配置形式_工业机器人按臂部的运动形式分为哪几种?
  6. 10. 类的关系——关联关系
  7. python转化极坐标_数学高考与python
  8. ME860安装安卓电子市场(android market)
  9. 我国电子商务B2C市场和C2C市场规模的变化
  10. TFN TD97 手持式双目多功能红外热像仪 热成像仪 融合夜视仪 多功能昼夜侦查仪 望远镜 高端高灵敏度