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 type | off/addr |
---|---|---|
uboot.bin | uboot | 0xE0000 |
env.txt bin | Environment | 0x80000 |
uImage | data | 0x200000 |
rootfs | data | 0x800000 |
烧写完成后,上电,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