问题就在与启动时,一堆如下打印,最后系统启动失败。
[ 1.130000] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002b70: 0x7173 instead
我回帖遇到相同问题和给出的解决步骤如下:
1、编译使用的默认8M固件配置,编译的固件小于8M,实际使用16M芯片,但工作正常
2、后来增加一些包,导致固件大于8M,于是修改Flash配置。我使用的ralink芯片,首先修改了trunk/target/linux/ramips/image/Makefile,找到对应路由器,
将Default8M改为Default16M。编译通过,烧入之后,就出现了上面这样的问题,有很多这样的打印。
3、开始我以为是驱动不支持,找到内核支持SPI芯片列表,确认对应厂商芯片ID在列表中。
4、后来我想到平时编译其他工程的时候都要对代码进行分段,也就是分区。最后找到trunk/target/linux/ramips/dts/下对应路由器的分区配置文件,修改了匹配16M的分区数据。编译烧入,重启后以上问题消失
所以编译一个支持不同容量的Flash的固件时,要确认3点:
1、trunk/target/linux/ramips/image/Makefile内对应固件的大小。
2、确认驱动支持使用的Flash芯片。
3、确认trunk/target/linux/ramips/dts/对应的dts文件是否匹配。
前两点很好解决,然后有的童鞋就问到底怎么修改dts呢?举例说明如下
在这个问题例子里面,我们可以看到打印信息
[ 0.850000] 0x000000000000-0x000000020000 : "u-boot"
[ 0.870000] 0x000000020000-0x000000030000 : "u-boot-env"
[ 0.880000] 0x000000030000-0x000000040000 : "factory"
[ 0.890000] 0x000000040000-0x000001000000 : "firmware"
[ 0.900000] 0x00000012d491-0x000001000000 : "rootfs"
这一段就是说明了flash内部分段的情况,每一个段存储了不同的内容,不同的固件可能还会有其他的段,看看每一段的意义:
[ 0.850000] 0x000000000000-0x000000020000 : "u-boot" u-boot存放的段,从flash开始的地址到0x20000 = 128K,所以我们看到很多u-boot固件是128K的
[ 0.870000] 0x000000020000-0x000000030000 : "u-boot-env" u-boot的参数,包括内核启动参数,u-boot使用的参数等,例如ip地址,TTL波特率等等
[ 0.880000] 0x000000030000-0x000000040000 : "factory" 厂家参数,实际上无线配置参数就存在这个段,如果这个段的数据丢失,表现为没有无线或信号极弱
[ 0.890000] 0x000000040000-0x000001000000 : "firmware" 一般是linux内核
[ 0.900000] 0x00000012d491-0x000001000000 : "rootfs" op文件系统
知道具体意义,那么看看dts是怎么样的,从op拷贝了一个dts文件,如下openwrt-rt5350-1/target/linux/ramips/dts/MT7620a_MT7610e.dts
/dts-v1/;
/include/ "mt7620a.dtsi"
/ {
compatible = "ralink,mt7620a-eval-board", "ralink,mt7620a-soc";
model = "Ralink MT7620A evaluation board";
palmbus@10000000 {
sysc@0 {
ralink,gpiomux = "i2c", "jtag";
ralink,uartmux = "gpio";
ralink,wdtmux = <1>;
};
gpio0: gpio@600 {
status = "okay";
};
spi@b00 {
status = "okay";
m25p80@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "en25q64";
reg = <0 0>;
linux,modalias = "m25p80", "en25q64";
spi-max-frequency = <1000000>;
partition@0 {
label = "u-boot"; //这里就是u-boot,可以看出从0到0x30000,可以支持192K大小的u-boot固件
reg = <0x0 0x30000>;
read-only;
};
partition@30000 {
label = "u-boot-env"; //u-boot参数,64K
reg = <0x30000 0x10000>;
read-only;
};
factory: partition@40000 {
label = "factory"; //无线参数,64K
reg = <0x40000 0x10000>;
read-only;
};
partition@50000 {
label = "firmware"; //固件剩下的部分全部给op固件,问题多半在这里,下面具体分析一下
reg = <0x50000 0x7b0000>;
};
};
};
};
............后面内容不列出................
对于固件分区:
partition@50000 {
label = "firmware";
reg = <0x50000 0x7b0000>;
};
如果使用8M的Flash, 固件编译成8M,不用修改,也能运行
如果使用16M的Flash, 固件编译成8M,不用修改,也能运行,相当与16M的Flash只使用了前面8M,后面空闲。
但是,如果使用8MFlash,固件编译选择16M,后面长度不够,可能导致问题,那么修改了Makefile还不够,还需要修改这个数据
reg = <0x50000 0x7b0000>; 中的0x7b0000需要再加8M,应该是0xfb0000
实际就是16M-0x50000,前面的被u-boot和参数段使用了。
0x50000也不是固定值,需要匹配使用的u-boot,如果u-boot固件增加很多功能,变成256K,那么相应的需要修改u-boot段
同时后面的段也需要按地址顺序修改,并从新计算固件使用的长度,要求与实际使用的Flash匹配
本帖为回答hj6419的留言而发,快来看看能不能解决你的实际问题吧。转自https://www.right.com.cn/forum/thread-177610-1-1.html