[Buildroot] need smaller filesystem for NOR
John Stile
john at stilen.com
Tue Feb 12 00:19:30 UTC 2013
On Fri, 2013-02-08 at 13:34 -0800, John Stile wrote:
> Dear Thomas Petazzoni,
>
> On Fri, 2013-02-08 at 18:38 +0100, Thomas Petazzoni wrote:
> > Dear John Stile,
> >
> > On Fri, 08 Feb 2013 09:25:17 -0800, John Stile wrote:
> > > I primarily boot from one of two 128Mb NAND areas, but I have an 8Mb NOR
> > > failsafe if NAND is bad. I have about 5.5Mb available for the
> > > Filesystem after loading at91bootstrap, uboot, uboot-env, and kernel.
> > > ...(using buildroot-2011.11)...
> > >
> > > The rootfs.jffs2 for NAND is 41Mb.
> > > I need one for NOR that is less than 5.5Mb.
> > >
> > > Is there a good method or script to copy buildroot's rootfs.jffs2 to
> > > make a smaller copy for NOR?
> > >
> > > My first attempt leads to
> > > VFS: Mounted root (jffs2 filesystem) on device 31:1.
> > > Freeing init memory: 104K
> > > Warning: unable to open an initial console.
> > > Kernel panic - not syncing: No init found. Try passing init= option to kernel.
> > > [<c0028678>] (unwind_backtrace+0x0/0xdc) from [<c0243990>] (panic+0x34/0x110)
> > > [<c0243990>] (panic+0x34/0x110) from [<c002254c>] (init_post+0x138/0x170)
> > > [<c002254c>] (init_post+0x138/0x170) from [<c0008408>] (kernel_init+0xbc/0xe8)
> > > [<c0008408>] (kernel_init+0xbc/0xe8) from [<c003b634>] (do_exit+0x0/0x5a4)
> > > [<c003b634>] (do_exit+0x0/0x5a4) from [<00000003>] (0x3)
> > >
> > > I think this means the file system is found and mounted, and for some
> > > reason, init isn't found, although I have played with init= to no avail,
> > > and if I mount my little jffs2, I do see busybox and all the links
> > > (/bin/init).
> >
> > Beware that if a NAND or NOR partition is empty and properly erase,
> > jffs2 will happily mount it and show a filesystem that contains no
> > file. So the behavior you're seeing here could perfectly happen if your
> > NAND or NOR partition is simply empty.
>
> To check for an empty file system I compared the hex dump of my jffs2
> image to the contents of NOR, and they are the same.
> From the uboot prompt I ran: md.b 0xD0294000 0x19
> From the shell I ran: od -t x1z NORrootfs.jffs2
> Both are identical, and I can mount my .jffs2 and see it contains stuff.
>
> Could it be my bootargs mtdparts pointing to the wrong place?
> bootargs=mem=64M console=ttyS0,115200 mtdparts=dataflash0:2640k(bootstrap/uboot/env/kernel)ro,-(rootfs) root=/dev/mtdblock1 rw rootfstype=jffs2
>
> I also tried exchanging 'dataflash0' for 'dataflash1', with no change in
> behavior.
>
> This is the first time I have tried to put a file system on NOR.
>
I discovered the kernel mtdparts statement to control the mtd partition
layout, which I guess is a good staring point for mounting the root file
system, but I still can't mount.
I gleaned the information from the kernel boot messages and the kernel
drivers/mtd/devices/at91_dataflash.c.
Default kernel boot messages for NAND and NOR:
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xda (Micron NAND 256MiB 3,3V 8-bit)
AT91 NAND: 8-bit, Software ECC
Scanning device for bad blocks
mtd: no mtd-id
Creating 3 MTD partitions on "atmel_nand":
0x000000000000-0x000000400000 : "Bootstrap"
0x000000400000-0x000004000000 : "Partition 1"
0x000004000000-0x000010000000 : "Partition 2"
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffc8000 (irq 12)
mtd_dataflash spi0.1: AT45DB642x (8448 KBytes) pagesize 1056 bytes (OTP)
I changed my boot args to:
bootargs=mem=64M console=ttyS0,115200 mtdparts=spi0.1-AT45DB642x:2640k(bootstrap/env/uboot/kernel)ro,-(rootfs);atmel_nand:128k(bootstrap1)ro,256k(uboot1)ro,128k(env1)ro,1536K(unused),2M(linux1),124M(rootfs1),128k(bootstrap2)ro,256k(uboot2)ro,128k(env2)ro,1536k(unused2),2M(linux2),124M(rootfs2) root=/dev/mtdblock2 rw rootfstype=jffs2
Now kernel boot messages for NAND and NOR show my partitions, but fail
to find the root filesystem:
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xda (Micron NAND 256MiB 3,3V 8-bit)
AT91 NAND: 8-bit, Software ECC
Scanning device for bad blocks
12 cmdlinepart partitions found on MTD device atmel_nand
Creating 12 MTD partitions on "atmel_nand":
0x000000000000-0x000000020000 : "bootstrap1"
0x000000020000-0x000000060000 : "uboot1"
0x000000060000-0x000000080000 : "env1"
0x000000080000-0x000000200000 : "unused"
0x000000200000-0x000000400000 : "linux1"
0x000000400000-0x000008000000 : "rootfs1"
0x000008000000-0x000008020000 : "bootstrap2"
0x000008020000-0x000008060000 : "uboot2"
0x000008060000-0x000008080000 : "env2"
0x000008080000-0x000008200000 : "unused2"
0x000008200000-0x000008400000 : "linux2"
0x000008400000-0x000010000000 : "rootfs2"
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffc8000 (irq 12)
mtd_dataflash spi0.1: AT45DB642x (8448 KBytes) pagesize 1056 bytes (OTP)
2 cmdlinepart partitions found on MTD device spi0.1-AT45DB642x
Creating 2 MTD partitions on "spi0.1-AT45DB642x":
0x000000000000-0x000000294000 : "bootstrap/env/uboot/kernel"
0x000000294000-0x000000840000 : "rootfs"
...
rtc-at91sam9 at91_rtt.0: hctosys: unable to read the hardware clock
jffs2: Too few erase blocks (1)
List of all partitions:
1f00 128 mtdblock0 (driver?)
1f01 256 mtdblock1 (driver?)
1f02 128 mtdblock2 (driver?)
1f03 1536 mtdblock3 (driver?)
1f04 2048 mtdblock4 (driver?)
1f05 126976 mtdblock5 (driver?)
1f06 128 mtdblock6 (driver?)
1f07 256 mtdblock7 (driver?)
1f08 128 mtdblock8 (driver?)
1f09 1536 mtdblock9 (driver?)
1f0a 2048 mtdblock10 (driver?)
1f0b 126976 mtdblock11 (driver?)
1f0c 2640 mtdblock12 driver: mtd_dataflash
1f0d 5808 mtdblock13 driver: mtd_dataflash
No filesystem could mount root, tried: jffs2
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
ORDER in mtdparts does not matter (NAND always before NOR)?
Next I changed from:
root=/dev/mtdblock2
to:
root=/dev/mtdblock 13
The kernel messages now show my desire layout at boot time, however, the
the file system still does not mount, but the root file system is not
found.
Kernel boot messages for NAND and NOR:
...
rtc-at91sam9 at91_rtt.0: hctosys: unable to read the hardware clock
JFFS2 write-buffering enabled buffer (1056) erasesize (8448)
Node at 0x00001cd8 with length 0x00000489 would run over the end of the erase block
Perhaps the file system was created with the wrong erase size?
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00001cdc: 0x0489 instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00001ce0: 0x651a instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00001ce4: 0x0006 instead
...
Further such events for this erase block will not be printed
VFS: Mounted root (jffs2 filesystem) on device 31:13.
Freeing init memory: 104K
Kernel panic - not syncing: Attempted to kill init!
[<c0028678>] (unwind_backtrace+0x0/0xdc) from [<c0243990>] (panic+0x34/0x110)
I think this means I am close.
Next I tried to edit my jffs options in the .config for my recovery
'failsafe' buildroot:
Filesystem images --->
[*] jffs2 root filesystem
Flash Type (Select custom page and erase size) --->
(0x1065) Page Size
(0xC60) Erase block size
I gleaned these numbers from the output o the sam-ba utility used to
load the NOR flash, but they still don't work.
This had no effect.
More information about the buildroot
mailing list