nuc972开发板用的是w25q128的spi nor flash (总共16M).
做了如下事情使得从nor flash启动,jffs2文件系统也放在nor flash上:
-
sudo apt install mtd-utils, 以获得mkfs.jffs2
-
mkfs.jffs2 -s 0x100 -e 0x10000 -p 0x800000 -d rootfs_48_refine/ -o jffs2.img
rootfs_48_refine是精简了原先的rootfs, 原来的有几十兆(一大堆QT库之类的), 因为nor flash 比较小, 删除到剩下几M。 这个命令是指block为64K, page为256字节, 这些是从数据手册里获知。 -
drivers\mtd\devices\m25p80.c 中
{ “w25q128”, INFO(0xef4018, 0, 64 * 1024, 256, 0) }, 里面最后一个flag直接写0, 这个是按照网上或的删除SECT_4K, 这样改动后与第 2步的jffs2.img保持一致。 -
arch\arm\mach-nuc970\dev.c 中修改分区, 修改后如下:(这里u-boot和kernel空间留太大了,都可以缩小一点)
static struct mtd_partition nuc970_spi0_flash_partitions[] = {
{
.name = “u-boot”,
.size = 0x0200000,
.offset = 0,
},
{
.name = “kernel”,
.size = 0x0600000,
.offset = 0x0200000,
},
{
.name = “rootfs”,
.size = 0x0800000,
.offset = 0x0800000,
},
}; -
kernel中的cmdline设置成如下:选/dev/mtdblock2是因为与上面rootfs对应
CONFIG_CMDLINE=“noinitrd root=/dev/mtdblock2 console=ttyS0,115200n8 rdinit=/sbin/init rootfstype=jffs2 mem=64M mtdparts=m25p80:2M(u-boot),6M@0x200000(kernel),8M@0x800000(rootfs)” -
make menuconfig中, 直接删除nand驱动, 这个也不知道为什么, 反正不删除好像nor flash这边就mount不成功。如下:FMI_NUC970设置为n则nand就不会probe了
Symbol: FMI_NUC970 [=n]
│ Type : tristate
│ Prompt: Nuvoton NUC970 FMI function selection
│ Location:
│ -> Device Drivers
│ -> Generic Driver Options
配置支持JFFS2如下:
Symbol: JFFS2_FS [=y] │
│ Type : tristate │
│ Prompt: Journalling Flash File System v2 (JFFS2) support │
│ Location: │
│ -> File systems │
│ -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])
7 make menuconfig中CONFIG_SPI, CONFIG_SPI_NUC970_P0和CONFIG_MTD_M25P80都设成y, 而且CONFIG_SPI_NUC970_P0_QUAD设置成y,可能SPI读写快一点
8 用nuwriter烧写是选SPI, u-boot.bin 选 “u-boot”烧在0xe00000, 970uImage选“Data”烧在0x200000,jffs2.img选“Data”烧在0x800000
其他:
uboot中设置下面命令从spi读取kernel并且启动:
set bootcmd sf probe 0 18000000; sf read 0x7fc0 0x200000 0x600000; bootm 0x7fc0
saveenv