Flash paritioning and JFFS2
Mirek23
miroslaw.dach at psi.ch
Sat Sep 29 07:09:33 EST 2007
I when through the jffs2 driver code and I have noticed that during the jffs2
initialization It is a problem to access the flash memory (of my board) in
32 bit mode. All what refers to the 32 bit access gets from Flash only 16
(Most significant) bits. The remaining 16 (less significant) bits are simply
filled with 0.
I have noticed that there are two sets of functions which are used to access
Flash memory:
#define cpu_to_je32(x) ((jint32_t){x})
#define je32_to_cpu(x) ((x).v32)
#define cpu_to_je16(x) ((jint16_t){x})
#define je16_to_cpu(x) ((x).v16)
These functions which refer to 16 bits access are working fine in my case
but those which refer to 32 access do not work properly. Does anybody have
some idea how to change those functions which deal with 32 bits to force
them to access the Flash memory in two steps to get twice 16 bits numbers
and at the end form 32 bits value?
Best Regards
Mirek
Mirek23 wrote:
>
> Dear All,
>
> Finally I have sorted out few problems with linux and u-boot and I have
> tried to come back to the jffs2 and mtd partitioning issue.
>
> I am using CFI driver and I pass partitioning information from command
> line via u-boot.
>
> This part works fine:
>
> Unfortunatly I have the problem when accesing the flash partitions because
> my Avnet evaluation board is designet in such a way that the data should
> be accessed in the mode x16 (16 bits in each goal).
>
> Linux CFI driver is able to detect the x16 mode but it does not handle it
> correctly.
>
> I will give you an example:
>
> My mtd1 partition contains the u-boot environment. When I print the mtd1
> contents with (busybox) hexdump I get:
>
> 00000000 eb 92 00 00 62 6f 00 00 61 72 00 00 3d 63 00 00
> |....bo..ar..=c..|
> 00000010 73 6f 00 00 3d 74 00 00 55 4c 00 00 39 36 00 00
> |so..=t..UL..96..|
> 00000020 20 72 00 00 74 3d 00 00 65 76 00 00 66 73 00 00 |
> r..t=..ev..fs..|
> 00000030 77 20 00 00 73 72 00 00 74 3d 00 00 39 2e 00 00 |w
> ..sr..t=..9...|
> 00000040 39 2e 00 00 34 2e 00 00 33 3a 00 00 70 74 00 00
> |9...4...3:..pt..|
> 00000050 6c 64 00 00 31 2f 00 00 63 5f 00 00 78 2c 00 00
> |ld..1/..c_..x,..|
> 00000060 70 20 00 00 70 3d 00 00 3a 3a 00 00 72 74 00 00 |p
> ..p=..::..rt..|
> 00000070 34 2d 00 00 72 65 00 00 65 74 00 00 3a 64 00 00
> |4-..re..et..:d..|
>
> When I copy the contents of the /dev/mtd1 to the file by 2 bytes (bs=2) I
> get correct
> readout:
>
> dd if=/dev/mtd1 of=./u-boot_Env.txt bs=2 count=128k
>
> hexdump ./u-boot_Env.txt
> 00000000 eb 92 c9 6d 62 6f 6f 74 61 72 67 73 3d 63 6f 6e
> |...mbootargs=con|
> 00000010 73 6f 6c 65 3d 74 74 79 55 4c 30 2c 39 36 30 30
> |sole=ttyUL0,9600|
> 00000020 20 72 6f 6f 74 3d 2f 64 65 76 2f 6e 66 73 20 72 |
> root=/dev/nfs r|
> 00000030 77 20 6e 66 73 72 6f 6f 74 3d 31 32 39 2e 31 32 |w
> nfsroot=129.12|
> 00000040 39 2e 31 34 34 2e 31 31 33 3a 2f 6f 70 74 2f 65
> |9.144.113:/opt/e|
> 00000050 6c 64 6b 34 31 2f 70 70 63 5f 34 78 78 2c 74 63
> |ldk41/ppc_4xx,tc|
>
> The real problems begin when I want to deal with jffs2 file system.
>
> I have mtd3 partition which is intended to hold jffs2 fs.
> To create the jffs2 fs I do:
>
> ./mkfs.jffs2 --pad=0xA0000 --eraseblock=0x20000 --root=/tmp/bin/mtd1/work/
> --output=image2.jffs2
> flash_erase /dev/mtd3
> dd if=./image2.jffs2 of=/dev/mtd3 bs=2 count=655360
>
> After that I have jffs2 fs under /dev/mtd3.
>
> When I try to mount the jffs2 partition fun begins:
>
> mount -t jffs2 /dev/mtdblock3 /mnt
>
> [ 2828.462121] jffs2_scan_eraseblock(): Node at 0x00000000 {0x1985,
> 0x2003, 0x00000000) has invalid CRC 0xf0600000 (calculated 0xf9d690b3)
> [ 2828.610485] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at
> 0x00000008: 0xf060 instead
> [ 2828.719326] jffs2_scan_eraseblock(): Node at 0x0000000c {0x1985,
> 0xe001, 0x00000000) has invalid CRC 0xc3200000 (calculated 0x92fedd67)
> [ 2828.870047] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at
> 0x00000014: 0xc320 instead
> [ 2828.979854] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at
> 0x00000024: 0x46fc instead
>
> .
> .
> .
> .
>
> [ 2834.858103] Further such events for this erase block will not be
> printed
> [ 2835.029913] Cowardly refusing to erase blocks on filesystem with no
> valid JFFS2 nodes
> [ 2835.124378] empty_blocks 0, bad_blocks 0, c->nr_blocks 5
> mount: mounting /dev/mtdblock3 on /mnt failed
>
>
> I have examined carefully the above output and what I see is that linux
> does not properly access the flash memory:
>
> I did the hexdump on the image2.jffs2 (which is placed in /dev/mtd3) and
> compared it with the jffs2 mount messages:
>
> hexdump -C image2.jffs2
>
> 00000000 19 85 20 03 00 00 00 0c f0 60 dc 98 19 85 e0 01 |..
> ......`......|
> 00000010 00 00 00 31 c3 20 dd 5d 00 00 00 01 00 00 00 00 |...1.
> .]........|
>
> jffs2_scan_eraseblock(): Node at 0x00000000 {0x1985, 0x2003, 0x00000000)
> has invalid CRC 0xf0600000 (calculated 0xf9d690b3)
>
> The linux mount complains about wrong CRC (invalid CRC 0xf0600000) but in
> the memory it is
> f0 60 dc 98 (so it means that it was read in byte by byte mode but not in
> x16 (2 bytes) mode).
>
> Does somebody know how to fix this problem?
>
> Best Regards
>
> Mirek
>
>
>
>
>
>
>
>
>
>
--
View this message in context: http://www.nabble.com/Flash-paritioning-and-JFFS2-tf4317566.html#a12948521
Sent from the linuxppc-embedded mailing list archive at Nabble.com.
More information about the Linuxppc-embedded
mailing list