NUC972 SPI Flash启动+内核+Cramfs文件系统

NUC972 作为一个低成本linux方案,有片内SDRAM,又有茫茫多的外设,简直工控神U.

为了追究更低成本,考虑放弃使用NAND,把uboot, 内核,文件系统都放在SPI FLASH。这样画板面积就更小了,更灵活。下面就简要记录一下修改和编译的过程。

一.Uboot修改编译

新塘官方有提供SPI下的Uboot配置文件nuc970_evb.h,这里没做修改,直接用。放到uboot目录下的include\configs中,然后执行make nuc970_nonand_config。为何是nuc970_nonand_config,看下Uboot的Makefile就明白了。

######################################################################
#nuc970 
######################################################################
nuc970_nand_config	\
nuc970_config:     unconfig
	@mkdir -p $(obj)include $(obj)board/nuvoton/nuc970evb
	@mkdir -p $(obj)nand_spl/board/nuvoton/nuc970evb
	@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
	@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
	@echo "RAM_TEXT = 0xE00000" >> $(obj)board/nuvoton/nuc970evb/config.tmp
	@$(MKCONFIG) nuc970_evb arm arm926ejs nuc970evb nuvoton nuc970
	@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
	
nuc970_nonand_config:     unconfig
	@mkdir -p $(obj)include $(obj)board/nuvoton/nuc970evb
	@echo "RAM_TEXT = 0xE00000" >> $(obj)board/nuvoton/nuc970evb/config.tmp
	@$(MKCONFIG) nuc970_evb arm arm926ejs nuc970evb nuvoton nuc970

注意,这里也定义了Uboot的链接地址RAM_TEXT = 0xE00000。
另外注意还有1个需要关注的参数,nuc970_evb.h中定义的的uboot环境变量的地址

#define CONFIG_ENV_OFFSET       0x80000

配置好后,直接make all -j4,生成uboot.bin。

二.内核修改

主要的要修改的配置有:
1.打开SPI接口配置在这里插入图片描述

在这里插入图片描述

2.MTD配置在这里插入图片描述
3.文件系统配置,我使用了cramfs和squashfs。
内核配置
4.如果是使用的w25q128,最好修改linux-3.10.x/drivers/mtd/devices/m25p80.c驱动文件,把erasesize 改64K。

//	{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256,  SECT_4K | M25P80_DUAL_READ | M25P80_QUAD_READ | M25P80_QUAD_WRITE) },
	{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256,  M25P80_DUAL_READ | M25P80_QUAD_READ | M25P80_QUAD_WRITE) },

三.修改Uboot环境变量

nuc972支持直接下载.txt的环境变量文件。打开env.txt,修改2个参数
1.bootcmd=sf probe 0 18000000; sf read 0x7fc0 0x200000 0x220000; bootm 0x7fc0。 sf read的size必须大于内核uImage镜像的大小,可以多读,不可以少。
2. bootargs=noinitrd root=/dev/mtdblock1 rw rootfstype=cramfs console=ttyS0,115200n8 rdinit=/sbin/init mem=64M。默认分区表配置下,无Nand时候,SPI的第2个分区映射到了/dev/mtdblock1。有Nand情况则应该是root=/dev/mtdblock4

//env.txt
bootcmd=sf probe 0 18000000\; sf read 0x7fc0 0x200000 0x220000\; bootm 0x7fc0
bootargs=noinitrd root=/dev/mtdblock1 rw rootfstype=cramfs console=ttyS0,115200n8 rdinit=/sbin/init mem=64M
baudrate=115200
bootdelay=3
ethact=emac
ethaddr=00:00:00:11:66:88
stderr=serial
stdin=serial
stdout=serial

四.文件系统生成

cramfs: 用bulidroot生成cramfs,过程略 。建议还是用cramfs这些只读文件系统,有需要写配置文件再单独分区,直接操作spi。不然开机速度蛋疼。
也可以打包成jffs2 : mkfs.jffs2 -e 0x10000 -d rootfs/ -o jffs2.img

五.终于搞完了,开始烧写

烧写工具:对我这样的新手还是很友好。
在这里插入图片描述
对应的地址/偏移地址,等熟悉了再自己规划下分区,最好还得加个OTA。

文件image typeoff/addr
uboot.binuboot0xE0000
env.txt binEnvironment0x80000
uImagedata0x200000
rootfsdata0x800000

烧写完成后,上电,linux系统加载正常。收工睡觉。

nuc970-spi0 nuc970-spi0: master is unqueued, this is deprecated
0x000000000000-0x000000800000 : "kernel"
0x000000800000-0x000001000000 : "rootfs"
libphy: nuc970_rmii0: probed
TCP: cubic registered
NET: Registered protocol family 17
VFS: Mounted root (cramfs filesystem) readonly on device 31:1.
devtmpfs: mounted
Freeing unused kernel memory: 116K (c02ff000 - c031c000)

Please press Enter to activate this console. 

Processing /etc/profile... Done

/ # 
/ # 
/ # du -sh
2.0M    .
/ # 
/ # uname -a
Linux (none) 3.10.101 #1 PREEMPT Thu Jun 20 07:58:05 PDT 2019 armv5tejl GNU/Linux

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值