1935|1

94

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

全志F1C100S/F1C200S spi-flash 启动全流程适配烧录及踩坑指南 [复制链接]

正文开始 big_smile

分区规划
分区序号	分区大小              分区作用	     地址空间及分区名
mtd0	        1MB (0x100000)        spl+uboot	     0x0000000-0x0100000 : “uboot”
mtd1	        64KB (0x10000)        dtb文件        0x0100000-0x0110000 : “dtb”
mtd2	        4MB (0x400000)        linux内核	     0x0110000-0x0510000 : “kernel”
mtd3	        剩余 (0xAF0000)       根文件系统     0x0510000-0x1000000 : “rootfs”

cool

uboot 配置和编译

这种方法只需要修改配置就行,不需要修改源码和设备树:
这里只写使spi-flash需要做的修改

git clone 
链接已隐藏,如需查看请登录或者注册
-b nano-v2018.01&&cd u-boot make licheepi_nano_spiflash_defconfig make menuconfig
# 对应 `CONFIG_BOOTCMD` 的宏定义
# 选中 然后 run distro_bootcmd 修改为以下参数
[*] Enable a default value for bootcmd
	(sf probe 0 50000000; sf read 0x80C00000 0x100000 0x4000; sf read 0x80008000 0x110000 0x400000; bootz 0x80008000 - 0x80C00000) bootcmd value

# 对应 `CONFIG_BOOTARGS` 的宏定义
[*] Enable boot arguments
	(console=ttyS0,115200 earlyprintk panic=5 rootwait; mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=/dev/mtdblock3 rw rootfstype=jffs2)    Boot arguments

参数说明

# 初始化Flash设备(CS拉低)
sf probe 0 50000000;
# 从flash0x100000(1MB)位置读取dtb放到内存0x41800000偏移处。
sf read 0x41800000 0x100000 0x10000; 
# 从flash0x110000(1MB+64KB)位置读取dtb放到内存0x41000000偏移处。
sf read 0x41000000 0x110000 0x400000; 
# 启动内核
bootz 0x41000000 (内核地址)- 0x41800000(dtb地址) 

# 在串口0上输出信息,如果要用串口1做控制台就改为 console=ttyS1
# 由于在kernel刚启动的过程中,还没有为串口等设备等注册console(在device probe阶段实现),此时无法通过正常的console来输出log。
# early console机制,用于实现为设备注册console之前的早期log的输出。
# earlyprintk 是基于 early console的基础上实现
console=ttyS0,115200 earlyprintk panic=5 rootwait

# spi32766.0是设备名,后面是分区大小,名字,读写属性。
# 根文件系统是mtd3;jffs2格式  root=31:03 等同于 /dev/mtdblock3 指的是mtd设备第三分区
mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2 

说明
1. 重要!!!官方文档这里有错误,不是 "sf probe 0:50000000; " ,应该是 "sf probe 0 50000000; "
2. root=/dev/mtdblock3 也可以用 root=31:03 表示。
3. mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) 是FLASH分区,分区指定也可以在dts中声明。即修改内核源码目录下的 ./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts。

添加FLASH支持_xt25f128b
由于这开发板的FLASH没在支持列表(xt25f128b),所以需要自己添加,不然的话启动后报错 SF: unrecognized JEDEC id bytes: 0b, 40, 18。

# 显示spiflash的信息 
$ sudo sunxi-fel spiflash-info
Manufacturer: Unknown (0Bh), model: 40h, size: 16777216 bytes.

修改 u-boot/drivers/mtd/spi/spi_flash_ids.c,根据上面查询的信息增加 xt25f128b:

const struct spi_flash_info spi_flash_ids[] = {
    ...
	{"w25q128fw",	   INFO(0xef6018, 0x0,	64 * 1024,   256, RD_FULL | WR_QPP | SECT_4K) },
	{"xt25f128b",	   INFO(0x0b4018, 0x0,	64 * 1024,   256, RD_FULL | WR_QPP | SECT_4K) },
    ...
};

修改 u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts:

&spi0 {
	...
	flash@0 {
        ...
		compatible = "winbond,xt25f128b", "jedec,spi-nor";
		...
	};
};

 

kernel 配置

这里只写使用spi-flash需要做的修改,详细配置参考:

# 以下适配了 800*480屏幕 和 xt25f128bflash
git clone https://gitee.com/LicheePiNano/Linux.git && cd linux/
wget http://dl.sipeed.com/LICHEE/Nano/SDK/config
cp config .config
make menuconfig
File systems  --->
	[*] Miscellaneous filesystems  --->
		<*>   Journalling Flash File System v2 (JFFS2) support	# 打开jffs2的文件系统支持
		(0)     JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
		[*]     JFFS2 write-buffering support
		[ ]     JFFS2 summary support
		[ ]     JFFS2 XATTR support
		[ ]     Advanced compression options for JFFS2
Device Drivers  --->
	<*> Memory Technology Device (MTD) support  --->
		<*>   Command line partition table parsing	# 勾选,用来解析uboot传递过来的flash分区信息。(如果 bootarg 是用的我的方法一就需要勾选)
		<*>   Caching block device access to MTD devices	# 勾选,读写块设备用户模块
		<*>   SPI-NOR device support  --->
			[ ]   Use small 4096 B erase sectors	# 取消勾选,否则jffs2文件系统会报错

 

注:

  • lichee官方的u-boot 中 kernel cmdline 使用jffs2格式的 mtdblock3 作为rootfs,但config中没有打开mtdblock设备接口。所以需要勾选 Caching block device access to MTD devices。

  • mkfs.jffs2 使用的最小擦除尺寸是 8KB,而spi flash的扇区大小是 4KB,所以按照扇区擦除的话,会无法使用,所以必须使用块擦除。即勾选 Use small 4096 B erase sectors。,这样以后添加FLASH也不用再修改源文件 linux/drivers/mtd/spi-nor/spi-nor.c 了

  • 如果不勾选 Caching block device access to MTD devices,会卡在 Waiting for root device /dev/mtdblock3。

添加FLASH支持_xt25f128b
修改文件 linux/drivers/mtd/spi-nor/spi-nor.c :,在 { "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) }下面添加:

{ "xt25f128b", INFO(0x0b4018, 0, 64 * 1024, 256, SECT_4K) },

buildroot 配置

git clone https://gitee.com/LicheePiNano/buildroot-2017.08.git
cd buildroot-2017.08/
make menuconfig
Target options  --->
	Target Architecture (ARM (little endian))  --->
	Target Architecture Variant (arm926t)  --->
Toolchain  ---> 
	C library (musl)  --->
System configuration  --->
	(gateway) System hostname	# 主机名,随便改
	(Welcome to gateway) System banner	# 欢迎语,随便改
	[*] Enable root login with password (NEW)
		(123456) Root password	# 登录密码,随便改
	[*] remount root filesystem read-write during boot (NEW)	# 重新挂载根文件系统到可读写
	[*] Install timezone info	# 安装时区信息,可选
		(asia) timezone list
		(Asia/Shanghai) default local time	
Target packages  --->
	System tools  --->
	[*] util-linux  --->
		[*]   mount/umount	# 访问其它文件系统中的资源,如果要用overlayfs,那就要用这个挂载

** 生成 rootfs.jffs2 格式的rootfs,打开后会自动下载 mtd-utils 软件包。 **
看官方和论坛生成 rootfs.jffs2 格式的rootfs 都是自己再次打包的,其实 buildroot 可以直接选择生成这个格式的 rootfs :

Filesystem images  --->
	[*] jffs2 root filesystem
			Flash Type (Parallel flash with 64 kB erase size)  ---> # 具有64 kB擦除大小的并行闪存 -e 参数
		[*]   Do not use Cleanmarker	# 用于标记一个块是_完整地_被擦除了。 -n 参数 Do not use cleanmarkers if using NAND flash or Dataflash where the pagesize is not a power of 
		[*]   Pad output
			(0xAF0000) Pad output size (0x0 = to end of EB) 	# 指定 jffs2 分区总空间 -p(--pad) 参数
		Endianess (little-endian)  --->
		[ ]   Produce a summarized JFFS2 image (NEW)	# 生成镜像的
		[*]   Select custom virtual memory page size
		(0x100) Virtual memory page size	# 虚拟内存页大小	-s 参数

当然,要自己用命令行手动生成方法也列在下面,并做了详细注释:(要把内核模块直接打包进文件系统还是要自己动手)

# 下载jffs2文件系统制作工具
sudo apt-get install mtd-utils

# 解压
# -C 当前目录的绝对目录
mkdir rootfs && sudo tar -xvf rootfs.tar -C ./rootfs

# 生成 rootfs.jffs2
# -r :指定要做成image的目录名
# -o : 指定输出image的文件名
# -s :页大小 0x100 256 字节
# -e :块大小 0x10000 64k
# -p :或--pad 参数指定 jffs2 分区总空间
# 由此计算得到 0x1000000(16M)-0x10000(64K)-0x100000(1M)-0x400000(4M)=0xAF0000
# -n 如果挂载后会出现类似:CLEANMARKER node found at0x0042c000 has totlen 0xc != normal 0x0  的警告,则加上-n 就会消失。
# jffs2.img 是生成的文件系统镜像
sudo mkfs.jffs2 -s 0x100 -e 0x10000 -p 0xAF0000 -r rootfs -o rootfs.jffs2 -n

# 为根文件系统制作jffs2镜像包
sudo mkfs.jffs2 -s 0x100 -e 0x10000 -p 0xAF0000 -d rootfs/ -o jffs2.img
# 或者
sudo mkfs.jffs2 -s 0x100 -e 0x10000 --pad=0xAF0000 -d rootfs/ -o jffs2.img

cool

烧录

烧录单独镜像
sudo sunxi-fel -p spiflash-write 0 ./u-boot/u-boot-sunxi-with-spl.bin   
sudo sunxi-fel -p spiflash-write 0x0100000 ./linux/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb
sudo sunxi-fel -p spiflash-write 0x0110000 ./linux/arch/arm/boot/zImage 
sudo sunxi-fel -p spiflash-write 0x0510000 ./buildroot-2017.08/output/images/rootfs.jffs2

烧录完整镜像
16M 大小flash镜像打包脚本:nano_flash_dd.sh
先用脚本打包成 flashimg.bin:

# 下载jffs2文件系统制作工具
sudo apt-get install mtd-utils
# 给脚本权限
chmod 777 nano_flash_dd.sh
# 加 sudo,不然会报错 tar: 由于前次错误,将以上次的错误状态退出
sudo ./nano_flash_dd.sh

在执行以下命令烧录:

sudo sunxi-fel -p spiflash-write 0 flashimg.bin
此帖出自单片机论坛

最新回复

官方和论坛生成 rootfs.jffs2 格式的rootfs 都是自己再次打包的,这个也正常   详情 回复 发表于 2024-5-16 07:33
点赞 关注
 

回复
举报

6822

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

官方和论坛生成 rootfs.jffs2 格式的rootfs 都是自己再次打包的,这个也正常

此帖出自单片机论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
变频器的选型及配置要点

1.前言 由于电力电子技术的不断发展和进步,伴随着新的控制理论的提出与完善,使交流调速传动,尤其是性能优异的变频调速传 ...

AD73360 6通道模拟输入的16位串行可编程A/D转换器

AD73360 6通道模拟输入的16位串行可编程A/D转换器 AD73360是AD公司推出的6通道模拟输入的16位串行可编程A ...

PIC16F73做的逆变器程序及原理图,文件以上传

我给别人做的逆变器,功率50~4000w,实地作过样机,波形良好纯正弦波,带冰箱,洗衣机彩电没任何问题.具有过电流保护,稳压反馈,全单片 ...

单片机编程讨论

1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码 ...

为什么用示波器一测示电波形,家里就断电,并且探针的小夹子还烧掉了一小块?

为什么用示波器一测示电波形,家里就断电,并且探针的小夹子还烧掉了一小块?有人说是接地线的问题,让把示波器 插头的 接地 插 ...

交错式反相电荷泵—第一部分:低噪声负电压电源的新拓扑

简介 精密仪器仪表或射频(RF)电路中的噪声必须最小化,但由于这些系统的特性,降低噪声要应对许多挑战。例如,这些系统常 ...

13.56Mhz读写芯片DS550的LPCD低功耗检卡可以很简单做到这么稳定

在13.56Mhz读写领域中,MCU通过ADC电路检卡是大家常用的低功耗做法,但这做法的弊端是需要MCU持续做检卡的动作,而LPCD功能的出 ...

pspice中仿真中一直卡在pwr supplies阶段是怎么回事

使用pspice进行marx发生器的仿真,一直卡在pwr supplies阶段, 597808有人遇到过这种情况吗

电容资料中的这个图谁来解读一下

本帖最后由 kal9623287 于 2022-6-14 10:41 编辑 选择电容时,找到电容的资料中的这个图,大概知道是有关电容ESR特性曲线吧, ...

关于共地干扰问题

下图是:一个高压脉冲放电系统,绿色的部分与黄色的部分(外控)是共地的,绿色部分(放电)的作用是产生一个-400V的和输入PWM脉宽相 ...

关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表