问题现象:
[ 2.120000] VFS: Cannot open root device "mtdblock5" or unknown-block(0,0): error -6 [ 2.136000] Please append a correct "root=" boot option; here are the available partitions: [ 2.152000] 1f00 4096 mtdblock0 (driver?) [ 2.164000] 1f01 192 mtdblock1 (driver?) [ 2.172000] 1f02 64 mtdblock2 (driver?) [ 2.184000] 1f03 64 mtdblock3 (driver?) [ 2.192000] 1f04 3776 mtdblock4 (driver?) [ 2.204000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
导致该问题的原因:flash分区不对
第一种情况是根本没有做分区,没有出现下面的启动信息
[ 0.460000] Creating 4 MTD partitions on "spi32766.0": [ 0.470000] 0x000000000000-0x000000030000 : "u-boot" [ 0.480000] 0x000000030000-0x000000040000 : "u-boot-env" [ 0.490000] 0x000000040000-0x000000050000 : "factory" [ 0.500000] 0x000000050000-0x000000400000 : "firmware"
像MTK的就需要在dts文件中添加flash分区
target/linux/ramips/dts/MT7621.dts
palmbus@1E000000 { spi@b00 { status = "okay";
m25p80@0 { #address-cells = <1>; #size-cells = <1>; compatible = "w25q128"; reg = <0 0>; linux,modalias = "m25p80"; spi-max-frequency = <10000000>;
partition@0 { label = "u-boot"; reg = <0x0 0x30000>; read-only; };
partition@30000 { label = "u-boot-env"; reg = <0x30000 0x10000>; read-only; };
factory: partition@40000 { label = "factory"; reg = <0x40000 0x10000>; read-only; };
partition@50000 { label = "firmware"; reg = <0x50000 0xfb0000>; };
}; };
第二种情况是dts文件中添加了flash分区,flash大小没配置正常
label = "firmware"; reg = <0x50000 0xfb0000>; // 16M = 0x50000 + 0xfb0000
要是板子是4M的,4M = 0x50000 + 0x3b0000,需要调整为reg = <0x50000 0x3b0000>;
第三种情况是分区没有分完整,rootfs分区没出来
[ 0.460000] Creating 4 MTD partitions on "spi32766.0": [ 0.470000] 0x000000000000-0x000000030000 : "u-boot" [ 0.480000] 0x000000030000-0x000000040000 : "u-boot-env" [ 0.490000] 0x000000040000-0x000000050000 : "factory" [ 0.500000] 0x000000050000-0x000000400000 : "firmware"
在uboot启动阶段有以下打印
## Booting image at bc030000 ...
此种情况下"firmware"的分区起始地址要放在0x000000030000,即 0x000000030000-0x000000400000 : "firmware"
或者
## Booting image at bc050000 ...
此种情况下"firmware"的分区起始地址要放在0x000000050000,即 0x000000050000-0x000000400000 : "firmware"
配置正确后可出现如下分区信息:
[ 1.608000] 2 uimage-fw partitions found on MTD device firmware [ 1.620000] 0x000000030000-0x000000165801 : "kernel" [ 1.632000] mtd: partition "kernel" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only [ 1.656000] 0x000000165801-0x000000400000 : "rootfs" [ 1.668000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only [ 1.696000] 1 squashfs-split partitions found on MTD device rootfs [ 1.708000] 0x000000330000-0x000000400000 : "rootfs_data"
最后,要出现以上分割firmware分区的效果,需要配置kernel
执行make kernel_menuconfig
MTK openwrt 3.10.14的SDK,有的flash分区不在dts文件中,需要在源码中调整,譬如以下
vi build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14-p112871/drivers/mtd/ralink/ralink_bbu_spi.c
|