From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21713 invoked by alias); 23 Jan 2007 08:42:26 -0000 Received: (qmail 21558 invoked by uid 22791); 23 Jan 2007 08:42:24 -0000 X-Spam-Check-By: sourceware.org Received: from sta-204-188-98-27.rockynet.com (HELO hermes.chez-thomas.org) (204.188.98.27) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 23 Jan 2007 08:42:19 +0000 Received: by hermes.chez-thomas.org (Postfix, from userid 999) id 78FDC19500C1; Tue, 23 Jan 2007 01:42:17 -0700 (MST) Received: from [192.168.1.101] (hermes_local [192.168.1.101]) by hermes.chez-thomas.org (Postfix) with ESMTP id 66560195008C; Tue, 23 Jan 2007 01:42:14 -0700 (MST) Message-ID: <45B5CA65.1060604@mlbassoc.com> Date: Tue, 23 Jan 2007 08:42:00 -0000 From: Gary Thomas User-Agent: Thunderbird 1.5.0.8 (X11/20061107) MIME-Version: 1.0 To: Weiguang Shi CC: ecos-discuss References: <579575.1784.qm@web30406.mail.mud.yahoo.com> In-Reply-To: <579575.1784.qm@web30406.mail.mud.yahoo.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Mailing-List: contact ecos-discuss-help@ecos.sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: ecos-discuss-owner@ecos.sourceware.org Subject: Re: AW: [ECOS] cat zImage >/dev/mtd1 does not work X-SW-Source: 2007-01/txt/msg00134.txt.bz2 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 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 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? >>>> >>>> >>>> Also, drivers/mtd has some RedBoot FIS parsing code in it. You could >>>> look at it for pointers. >>>> >>>>> --- Gary Thomas 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