板卡为 hisi 的 hi3518ev200,16M RAM,64M Flash。板卡不支持从SD卡启动,但是由于Flash空间有限,很多应用都放不下,因此考虑把 rootfs 放到 SD 卡中。先从 Flash 中启动 kernel,然后再加载 SD 卡中的 rootfs。
由于需要从sd卡中加载 rootfs,因此需要把我们编译生成的rootfs下载到sd卡中。这里我们使用 ext4 文件系统。
将sd卡通过读卡器接入到PC上,这里接入后,出来的分区设备是 /dev/sdc1
,先将其格式化为 ext4:
umount /dev/sdc1
sudo mke2fs -t ext4 -F -L "rootfs" /dev/sdc1
格式化完成后,挂载分区,然后把编译的跟文件系统复制到这个分区中即可:
mkdir /tmp/rootfs
sudo mount /dev/sdc1 /tmp/rootfs
tar -xvf /media/linuxdata/workspace/buildroot-2022.02.8/output/images/rootfs.tar -C /tmp/rootfs/
umount /dev/sdc1
拔下sd卡,将其插到板卡上。
由于默认uboot不支持emmc sd卡驱动,因此,无法从sd卡中加载kernel。所以先从 Flash 中加载 kernel,先将 kernel 和 initrd 加载 RAM中,然后运行kernel,kernel启动后,会先挂载 initrd 为初始的/,然后进行一系列的初始化后,再挂载真正的 rootfs。默认是从 Flash 中去挂载这个 rootfs,bootargs 参数为 setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)'
。
这里需要将root参数修改为如下:
set bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mmcblk0p1 rw rootwait'
完整的参数如下:
set bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 init=/linuxrc'
我这里只要加了下面的参数(blkdevparts
),就会报错导致挂载失败:
set bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 init=/linuxrc blkdevparts=mmcblk0:-(rootfs.ext4)'
失败报错如下:
mmc1: error -84 whilst initialising SD card
usb 1-1.2: new high-speed USB device number 4 using hiusb-ehci
mmc1: new high speed SDHC card at address 5048
mmcblk0: mmc1:5048 SD32G 29.7 GiB
mmcblk0: p1(rootfs)
List of all partitions:
b300 31178752 mmcblk0 driver: mmcblk
b301 31178752 mmcblk0p1 00000000-0000-0000-0000-000000000000
No filesystem could mount root, tried: ext4
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,1)
那么,使用上面最简单的参数就可以了。
保存,然后启动:
sa
sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000
挂载成功:
mmc1: error -84 whilst initialising SD card
usb 1-1.2: new high-speed USB device number 4 using hiusb-ehci
mmc1: new high speed SDHC card at address 5048
mmcblk0: mmc1:5048 SD32G 29.7 GiB
mmcblk0: p1
EXT4-fs (mmcblk0p1): warning: mounting fs with errors, running e2fsck is recommended
EXT4-fs (mmcblk0p1): recovery complete
EXT4-fs (mmcblk0p1): mounted filesystem with writeback data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 179:1.
devtmpfs: mounted
Freeing init memory: 148K
EXT4-fs (mmcblk0p1): re-mounted. Opts: (null)
devpts: called with bogus options
Starting syslogd: OK
Starting watchdogd: OK
Starting klogd: OK
Running sysctl: OK
Starting mdev... OK
Initializing random number generator: OK
Saving random seed: OK
Starting iptables: OK
Starting network: OK
Starting dhcpcd...
dhcpcd-9.4.1 starting
sandbox unavailable: seccomp
DUID 00:01:00:01:c7:92:bc:85:00:00:00:00:00:00
sandbox unavailable: seccomp
forked to background, child pid 592
ADDRCONF(NETDEV_UP): eth0: link is not ready
启动成功,sd卡是一张32G的内存卡:
# df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/root ext4 29.0G 187.5M 27.3G 1% /
devtmpfs devtmpfs 28.7M 0 28.7M 0% /dev
tmpfs tmpfs 28.8M 0 28.8M 0% /dev/shm
tmpfs tmpfs 28.8M 36.0K 28.8M 0% /tmp
tmpfs tmpfs 28.8M 32.0K 28.8M 0% /run
#