From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from motgate8.mot.com ([129.188.136.8]) by pentafluge.infradead.org with esmtp (Exim 4.30 #5 (Red Hat Linux)) id 1AiX6o-0001Lh-3j for linux-mtd@lists.infradead.org; Mon, 19 Jan 2004 10:58:18 +0000 Received: from az33exr04.mot.com (az33exr04.mot.com [10.64.251.234]) by motgate8.mot.com (Motorola/Motgate3) with ESMTP id i0JAu3VI027795 for ; Mon, 19 Jan 2004 03:56:03 -0700 (MST) Received: from zch07exm04.corp.mot.com (ZCH07EXM04.corp.mot.com [200.3.1.210]) by az33exr04.mot.com (Motorola/az33exr04) with ESMTP id i0JAtwMC004644 for ; Mon, 19 Jan 2004 04:56:00 -0600 From: Li Yang Cc: linux-mtd@lists.infradead.org In-Reply-To: <1074503876.14499.40.camel@imladris.demon.co.uk> References: <01139FC052A0D411900B00508B9535FC0F0D25BB@ZCH07EXM04.corp.mot.com> <1074503876.14499.40.camel@imladris.demon.co.uk> Content-Type: text/plain Message-Id: <1074509881.14564.3.camel@Gundam> Mime-Version: 1.0 Date: 19 Jan 2004 18:58:01 +0800 Content-Transfer-Encoding: 7bit Subject: Re: jffs2+mtd+big endian problem Reply-To: leoli@motorola.com List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Mon, 2004-01-19 at 17:17, David Woodhouse wrote: > On Mon, 2004-01-19 at 16:43 +0800, Li Yang-r58472 wrote: > > Hi, > > > > I'm doing a JFFS2 port to a PowerPC target board. I have several > > questions while porting. > > > > 1. Which kind of endian should I use in JFFS2? Mkfs.jffs2 (older > > version, I have tried the new binary on JFFS2 website, the big-endian > > option breaks) can generate images of the two endian types. > > There are two options. First, you can try a fixed version of mkfs.jffs2 > which gets the byte-swapping right. I've uploaded the current CVS > version, 1.39, to sources.redhat.com now -- I think that should be OK. > > Second, you could use the current CVS JFFS2 code (you should probably > use that anyway since it has a lot of optimisations missing from older > kernels), and make it use little-endian images by defining > JFFS2_LITTLE_ENDIAN instead of JFFS2_NATIVE_ENDIAN at about line 90 of > include/linux/jffs2.h I have some problem accessing CVS from the damned corporate network. I'm a poor guy living on binaries and snapshots. :( Thanks for you update. I'm using JFFS2 code from kernel-2.4.22. Seems it's pretty old code in the kernel. Could you kindly give me a recent snapshot or direct me to a link to download it? > > > 2. I added a new map file in driver/mtd/maps directory. Which > > read/write/memcpy operation should I use? __raw_readw() or readw()? > > Or Inw()? They determined whether to swap bytes. > > That depends on how your hardware is wired up. It's probably best not to > try this with JFFS2, which introduces its own endianness complexity... > try it with raw read/write (and the erase ioctl of course) on the > /dev/mtd devices. Read and write data in units of 1, 2 and 4 bytes at > various offsets and see what you get. > > > I have tried several cases. When I use little-endian fs and > > __raw_read(), the JFFS2 mount got error: jffs2_scan_eraseblock(): > > Magic bitmask 0x1985 not found at 0x00000000: 0x8519 instead. > > > > However, after I change to use big-endian fs, mount can be successful. > > Create new file on JFFS2 got error: Node totlen on flash (0x44000000) > > != totlen in node ref (0x00000044). Seems data written to flash are > > 32-bit byte-swaped. > > That's odd. If you look in the image file you downloaded to the board, > is it telling the truth? Do you actually see (00,00,00,44) or > (44,00,00,00). Can you make the actual image available to me to play > with, and I'll tell you whether it's a valid image and your board > mapping is at fault, or whether it's an invalid image. The image generated by mkfs.jffs2 with -b seems ok, but it's not all right after I done some operations on the target. In the bottom is the log of these operations. Yes, I have examined a section which is formatted by the target board. The first several bytes of the section are: fe3c0000: 03208519 0c000000 98dc60f0 ffffffff . ........`..... fe3c0010: ffffffff ffffffff ffffffff ffffffff ................ They are all 32-bit swapped. I traced into the JFFS2 code, and know it use mtd->write to write data into flash. Which function is it turned out to be finally? Is it the write defined in the drivers/mtd/maps/ files? I used __raw_write*() at the very beginning, it shouldn't be like this. > > > Has anyone here done JFFS2 on Powerpc Big-endian system? What are > > your options? > > Mostly people using JFFS2 on PPC are using it in big-endian mode, I > think. > > -- > dwmw2 Log of the operations: # mount -t jffs2 /dev/mtdblock1 /mnt mtdblock_open ok jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x003c0000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x003c0004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x003c0008: 0x98dc instead JFFS2: Erase block at 0x003c0000 is not formatted. It will be erased jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00400000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00400004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00400008: 0x98dc instead JFFS2: Erase block at 0x00400000 is not formatted. It will be erased jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00440000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00440004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00440008: 0x98dc instead JFFS2: Erase block at 0x00440000 is not formatted. It will be erased jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00480000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00480004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00480008: 0x98dc instead JFFS2: Erase block at 0x00480000 is not formatted. It will be erased jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x004c0000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x004c0004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x004c0008: 0x98dc instead JFFS2: Erase block at 0x004c0000 is not formatted. It will be erased jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00500000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00500004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00500008: 0x98dc instead JFFS2: Erase block at 0x00500000 is not formatted. It will be erased jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00540000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00540004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00540008: 0x98dc instead JFFS2: Erase block at 0x00540000 is not formatted. It will be erased jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00580000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00580004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00580008: 0x98dc instead JFFS2: Erase block at 0x00580000 is not formatted. It will be erased jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x005c0000: 0x0320 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x005c0004: 0x0c00 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x005c0008: 0x98dc instead JFFS2: Erase block at 0x005c0000 is not formatted. It will be erased # cd /mnt # ls bin dev home mnt prj_tmp root tmp var boot etc lib opt proc sbin usr # touch abc Node totlen on flash (0x44000000) != totlen in node ref (0x00000044) # ls abc boot etc lib opt proc sbin usr bin dev home mnt prj_tmp root tmp var # echo "jhskjfsldfjdklsf" > abc Node totlen on flash (0x44000000) != totlen in node ref (0x00000044) Node totlen on flash (0x44000000) != totlen in node ref (0x00000044)