Hello,
I am working on a P1020WLAN-compatible board with only one NOR flash to boot it with a Linux image. Using LTIB, I build the image and put
three files UImage, .dtb file and root.squashfs in the flash, in the addresses determined by Freescale. I follow the instruction provided by Freescale (erasing the NOR flash , TFTP and then cp.b). When I boot the board and the kernel tries to switch to jfss2 mode, we encounter the famous errors of jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at …. 0xdead instead.
If instead of my own root.squashfs, I use the original root.squashfs file provided in the USB disk by Freescale for P1020WLAN (keeping the UImage and .dtb and only re-programming the root.squashfs file in the same address), it works well with no problem. Note that using unsquashfs -s tool, I compared both files and all details except the size are the same (block size, version, compression, …). I thought may be something is wrong with my LTIB. So, I decompressed the original root.squashfs file and just recompressed it with no change using mksquashfs4. It did not work on the board (the same jfss2 problem). I tried different switches (-nopad, -b 65536 , …), but none of them worked.
U-boot bootargs are the same as P1020WLAN and naturally the same for all squashfs files that I tried. All the files have almost the
same size between 23 to 26 MB, so the space erased in the flash and assigned to the file is enough.
Note that I can build a RamDisk image using LTIB and boot the board in RAM. So the board is OK. The flash is also OK because it works well with the original root.squashfs. So, I do not know what could be wrong . I appreciate if you could kindly advise me.
The details are as follow:
NOR Flash is S29GL512P . In U-boot, we can see:
Bank # 1: CFI conformant FLASH (16 x 16) Size: 64 MB in 512 Sectors
AMD Standard command set, Manufacturer ID: 0x89, Device ID: 0x227E
Erase timeout: 4096 ms, write timeout: 2 ms
Buffer write timeout: 5 ms, buffer size: 1024 bytes
U-boot bootargs:
bootargs=root=/dev/mtdblock1 rw console=ttyS0,115200
init=/etc/preinit cache-sram-size=0x10000
Please make sure "the erase block size" parameter is set correctly, in ltib run ./ltib -c, and specify an appropriate value from --- Target Image Generation->jffs2 erase block size in KB.
Hi.
Thank you Yiping. As explained, I build a root.squashfs image (LTIB by default does that for P1020WLAN) not a jffs2. As you may know, this idea is taken from OpenWRT. When the kernel comes up, it uses some scripts to "switch to jfss2" (mounting). Therefore, in LTIB, there is no such an option for squashfs image type. For squashfs, we have only data block size and no erase block size. I played with data block size parameter and nothing changed.
Thank you for your comment and if you had any idea, please advise me.
Please don't use the parameter "-nopad", actually when generating jffs2 filesystem, it is needed to specify "--pad" parameter.
Hello,
Thank you. It did not change. Note that in LTIB, I could not find the place where I can enable/disable padding. What I did was manually making a squashfs image using -nopad and without using it. But, it did not work.
I just realized that there is a script called firstboot in the bin folder of the rootfs. But, by default, the init in bootargs of the U-boot is set to /etc/preinit. As am I am imaging the board for the first time, is not the problem related to the init configuration in bootargs? Maybe it should be set in a different way in the first boot! I appreciate if you have any comment on that.
Hello,
Thank you for your support. I tried different switches with mksquashfs4 command and none of them solved the problem. However, I finally found a solution, which may also be useful for others.
It seems that JFFS2 is looking for special erased blocks with a magic marker. However, when we erase the NOR flash with U-boot (erase 0x… ), by default, U-boot writes 0xFF values. JFFS2 thus generates later the error jffs2_scan_eraseblock(): Magic bitmask..
.
Instead, I first boot the board in RAM and from there, using mtd-utils (i.e., flash_eraseall ) I erased the flash with the switch –j (i.e., flash_eraseall -j mtd3). The switch –j does the job and writes the magic marker. Then, using flashcp, I copied the root.squashfs file into the flash. The problem was resolved. I did not try, but maybe U-boot has a similar switch while erasing, which makes the flash ready for JFFS2, so no need to boot first in RAM. This link helped me a lot: http://www.linux-mtd.infradead.org/faq/jffs2.html