AW: [ECOS] cat zImage >/dev/mtd1 does not work

Gary Thomas gary@mlbassoc.com
Tue Jan 23 08:42:00 GMT 2007


Weiguang Shi wrote:
> Thanks again.
> 
> My system is 2.4.x under snapgear-3.4.0 and I applied only the following part of the patch
> since this only seems to be relevant.
> 
>    #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);
>                     }
>                 }
> 
> 
> When I tried to cat the modified ram image for the FIS partition back to /dev/mtd4
> I still get 
>       
>     cat: Write Error: Read-only file system

You missed the part of the patch that allows the FIS directory to be
writable even if you have combined FIS & FCONFIG.  I don't have such an
old system, so you'll need to figure out how to get that code in.

> --- Gary Thomas <gary@mlbassoc.com> wrote:
> 
>> 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
>> ------------------------------------------------------------
>>> 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;
>>  
>>
>>> -- 
>> Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
>> and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
> 
> 
> 
>  
> ____________________________________________________________________________________
> It's here! Your new message!  
> Get new email alerts with the free Yahoo! Toolbar.
> http://tools.search.yahoo.com/toolbar/features/mail/


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

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



More information about the Ecos-discuss mailing list