public inbox for ecos-discuss@sourceware.org
 help / color / mirror / Atom feed
From: Gary Thomas <gary@mlbassoc.com>
To: Weiguang Shi <wgshizz@yahoo.com>
Cc: ecos-discuss <ecos-discuss@ecos.sourceware.org>
Subject: Re: AW: [ECOS] cat zImage >/dev/mtd1 does not work
Date: Sat, 20 Jan 2007 13:46:00 -0000	[thread overview]
Message-ID: <45B21D32.9080907@mlbassoc.com> (raw)
In-Reply-To: <20070120020028.81283.qmail@web30405.mail.mud.yahoo.com>

[-- Attachment #1: Type: text/plain, Size: 2792 bytes --]

Weiguang Shi wrote:
> Gary,
> 
> I'm at the point to flash the modified partition back but can't erase the
> FIS partition /dev/mtd4
> 
>    # cat /proc/mtd
>    dev:    size   erasesize  name
>    mtd0: 00080000 00020000 "RedBoot"
>    mtd1: 00100000 00020000 "kernel"
>    mtd2: 00200000 00020000 "ramdisk"
>    mtd3: 00020000 00020000 "kiyon_config"
>    mtd4: 0001f000 00020000 "FIS directory"
>    mtd5: 00001000 00020000 "RedBoot config"
>    # eraseall /dev/mtd4
>    eraseall: /dev/mtd4: Permission denied
> 
> I realized that I may need to "unlock" it but both my attempts to do that
> in RedBoot and Linux failed. In the former, "fis unlock" worked fine in 
> Redboot but after Linux boots up I still get the same "Permission denied"
> error. In linux, my unlock resulted in 
>         # unlock /dev/mtd4
>         Could not open mtd device: /dev/mtd4
>         # unlock /dev/mtd5
>         Could not open mtd device: /dev/mtd5
> 
> Any ideas on how shall I proceed?

The problem is that if you use combined FIS directory and FCONFIG data
(which you are based on the map above), then the MTD layer makes both of
those images read only.  The attached patch can let you override this.
It's based on the public 2.6.18 kernel.

Note: you need to be careful doing these changes to your FLASH.  If you
simply erase the partition, RedBoot will lose everything.  MTD is pretty
cool and if you simply open /dev/mtd4 read/write, read the current contents,
update them and then rewrite them, the MTD layer will take care of erasing
and updating the appropriate portions.

> --- Gary Thomas <gary@mlbassoc.com> wrote:
> 
>> Weiguang Shi wrote:
>>> That's even better and was the solution that I was looking for.
>>> The question is how, from the OS, can I update the FIS. Obviously
>>> I need to know the structure of the "FIS directory" partition and
>>> find the offset of that checksum and insert a '0' there by 
>>>    - reading the whole partition into ram, 
>>>    - changing the bit, erasing the partition on the flash, 
>>>    - and finally flashing the modified partition in the ram back.
>>>
>>> Any suggestions as to where to start?
>> <redboot/fis.h>
>>
>> Also, drivers/mtd has some RedBoot FIS parsing code in it.  You could
>> look at it for pointers.
>>
>>> --- Gary Thomas <gary@mlbassoc.com> wrote:
>>>
>>>> Note: you don't really need to change RedBoot.  Just update the
>>>> FIS [directory] entry for the image you are changing, either with
>>>> the corrected checksum, or the value 0.  RedBoot ignores the checksum
>>>> when the stored value is 0.

-- 
------------------------------------------------------------
Gary Thomas                 |  Consulting for the
MLB Associates              |    Embedded world
------------------------------------------------------------

[-- Attachment #2: mtd.patch --]
[-- Type: text/x-patch, Size: 1690 bytes --]

diff -ubNr --exclude=.gitignore linux-2.6.18/drivers/mtd/redboot.c /tmp/fc_base/opt/amltd/develop/linuxppc-2.6/drivers/mtd/redboot.c
--- linux-2.6.18/drivers/mtd/redboot.c	2006-09-19 21:42:06.000000000 -0600
+++ /tmp/fc_base/opt/amltd/develop/linuxppc-2.6/drivers/mtd/redboot.c	2006-10-24 11:59:32.000000000 -0600
@@ -85,6 +85,10 @@
 
 	numslots = (master->erasesize / sizeof(struct fis_image_desc));
 	for (i = 0; i < numslots; i++) {
+                if (buf[i].name[0] == 0xff) {
+                        i = numslots;
+                        break;
+                }
 		if (!memcmp(buf[i].name, "FIS directory", 14)) {
 			/* This is apparently the FIS directory entry for the
 			 * FIS directory itself.  The FIS directory size is
@@ -124,7 +128,7 @@
 		struct fis_list *new_fl, **prev;
 
 		if (buf[i].name[0] == 0xff)
-			continue;
+                        break;
 		if (!redboot_checksum(&buf[i]))
 			break;
 
@@ -196,14 +200,22 @@
 		parts[i].size = fl->img->size;
 		parts[i].offset = fl->img->flash_base;
 		parts[i].name = names;
-
 		strcpy(names, fl->img->name);
+
 #ifdef CONFIG_MTD_REDBOOT_PARTS_READONLY
 		if (!memcmp(names, "RedBoot", 8) ||
 				!memcmp(names, "RedBoot config", 15) ||
 				!memcmp(names, "FIS directory", 14)) {
 			parts[i].mask_flags = MTD_WRITEABLE;
 		}
+#else
+		if (!memcmp(names, "FIS directory", 14)) {
+                    // Special hack to let directory be read/write
+                    if ((fl->img->size & (master->erasesize - 1)) != 0) {
+                        parts[i].size = (fl->img->size + (master->erasesize - 1)) & ~(master->erasesize - 1);
+                    }
+                }
+
 #endif
 		names += strlen(names)+1;
 


[-- Attachment #3: Type: text/plain, Size: 148 bytes --]

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

  reply	other threads:[~2007-01-20 13:46 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-19  7:48 Neundorf, Alexander
2007-01-19  9:00 ` [ECOS] Ecos/redboot on Xscale pxa270 tejas pawaskar
2007-01-19 16:50 ` AW: [ECOS] cat zImage >/dev/mtd1 does not work Weiguang Shi
2007-01-19 16:53   ` Andrew Lunn
2007-01-19 17:50   ` Gary Thomas
2007-01-19 18:08     ` Weiguang Shi
2007-01-19 18:18       ` Gary Thomas
2007-01-19 18:28         ` Weiguang Shi
2007-01-20  2:00         ` Weiguang Shi
2007-01-20 13:46           ` Gary Thomas [this message]
2007-01-23  2:08             ` Weiguang Shi
2007-01-23  8:42               ` Gary Thomas
2007-01-23 19:34                 ` Weiguang Shi
2007-01-23 20:11                   ` Gary Thomas
2007-01-28 21:26                     ` Weiguang Shi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=45B21D32.9080907@mlbassoc.com \
    --to=gary@mlbassoc.com \
    --cc=ecos-discuss@ecos.sourceware.org \
    --cc=wgshizz@yahoo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).