This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Re: Re: How can I use the flashs of sst29vfxxx and intel_strata at the same timeat redboot ???
Hi Andrew,
I got it ~~
And it works!!
Thank you~~
Steven Cheng
----- Original Message -----
From: "Andrew Lunn" <andrew@lunn.ch>
To: "Steven_cheng" <05071@alphanetworks.com>
Cc: <ecos-discuss@sources.redhat.com>
Sent: Wednesday, September 14, 2005 3:27 PM
Subject: Re: [ECOS] Re: How can I use the flashs of sst29vfxxx and
intel_strata at the same timeat redboot ???
> On Wed, Sep 14, 2005 at 10:05:13AM +0800, Steven_cheng wrote:
> > Hi Andrew,
> >
> > It does not works in some commands.
> >
> > As following:
> > RedBoot> fis list
> > ... Read from 0x70fe0000-0x70fffbff to 0x0efe0000:
> > Name FLASH addr Mem addr Length Entry point
> > RedBoot 0x70000000 0x70000000 0x00040000 0x00000000
> > FIS directory 0x70FE0000 0x70FE0000 0x0001FC00 0x00000000
> > RedBoot config 0x70FFFC00 0x70FFFC00 0x00000400 0x00000000
> >
> > RedBoot> load -m xmodem -b 0x100000
> > CCCCAddress offset = 0x000c0000
> > Entry point: 0x00100100, address range: 0x00100000-0x00135cc8
> > xyzModem - CRC mode, 2553(SOH)/0(STX)/0(CAN) packets, 4 retries
> >
> > RedBoot> fis create pX[RAM] -f 0xfff00000
> > ... Read from 0x70fe0000-0x70fffbff to 0x0efe0000:
> > ... Read from 0x70fe0000-0x70fffbff to 0x0efe0000:
> > ... Read from 0x70fe0000-0x70fffbff to 0x0efe0000:
> > Invalid FLASH address - not free!
> >
> > I find it is taken mistake in find_free() (codebase is flashv2 branch of
> > ecos);
> >
////////////////////////////////////////////////////////////////////////////
> > ///////////////////////////////////
> > static int
> > find_free(struct free_chunk *chunks)
> > {
> > cyg_flashaddr_t err_addr;
> > cyg_flash_info_t info;
> > struct fis_image_desc *img;
> > int i=0, idx;
> > int num_chunks = 0;
> > int ret;
> >
> > do {
> > ret = cyg_flash_get_info(i, &info);
> > if (ret == CYG_FLASH_ERR_OK) {
> > if (i == 0 ) {
> > // Do not search the area reserved for pre-RedBoot systems:
> > chunks[num_chunks].start = (info.start +
> >
CYGNUM_REDBOOT_FLASH_RESERVED_BASE +
> > CYGBLD_REDBOOT_MIN_IMAGE_SIZE);
> > chunks[num_chunks].end = info.end;
> > num_chunks++;
> > } else { // Contiguous flash? If so collapse the chunks
together.
> > if (chunks[num_chunks-1].end == (info.start -1)) {
> > chunks[num_chunks-1].end = info.end;
> > } else {
> > chunks[num_chunks].start = info.start;
> > chunks[num_chunks].end = info.end;
> > num_chunks++;
> > }
> > }
> > }
> > i++;
> > } while (ret != CYG_FLASH_ERR_INVALID);
> >
> > /////////// chunks[] value [correct
!!]//////////////////////////////////
> > chunks[0].start = 0x70040000
> > chunks[0].end = 0x70ffffff
> > chunks[1].start = 0xfff00000
> > chunks[1].end = 0xfff7fffff
>
> This looks OK.
>
> > ///////////////////////////////////////////////////////////////////
> >
> > cyg_flash_read(fis_addr, fis_work_block, fisdir_size, &err_addr);
> > img = (struct fis_image_desc *) fis_work_block;
> > for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
> > if (img->name[0] != (unsigned char)0xFF) {
> > // Figure out which chunk this is in and split it
> > for (idx = 0; idx < num_chunks; idx++) {
> > if ((img->flash_base >= chunks[idx].start) &&
> > (img->flash_base <= chunks[idx].end)) {
> > if (img->flash_base == chunks[idx].start) {
> > chunks[idx].start += img->size;
> > if (chunks[idx].start >= chunks[idx].end) {
> > // This free chunk has collapsed
> > while (idx < (num_chunks-1)) {
> > chunks[idx] = chunks[idx+1];
> > idx++;
> > }
> > num_chunks--;
> > }
> > } else if ((img->flash_base+img->size) ==
> > chunks[idx].end) {
> > chunks[idx].end = img->flash_base;
> > } else {
> > // Split chunk into two parts
> > chunks[idx+1].start = img->flash_base +
img->size;
> > chunks[idx+1].end = chunks[idx].end;
> > if (++num_chunks ==
> > CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS) {
> > diag_printf("Warning: too many free
chunks\n");
> > return num_chunks;
> > }
> > chunks[idx].end = img->flash_base;
> > }
> > break;
> > }
> > }
> > }
> > }
> > return num_chunks;
> > }
> > #endif // CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
> >
> > /////////// chunks[] value [Error
value]//////////////////////////////////
> > chunks[0].start = 0x70040000
> > chunks[0].end = 0x70fe0000
> > chunks[1].start = 0x71000000
> > chunks[1].end = 0x70ffffff
>
> And this is wrong.
>
> There was a patch to the trunk by Peter Korsgaard on 2005-06-29 which
> fixed something here. It might be worth applying that patch to the v2
> branch and see if it helps.
>
> > ///////////////////////////////////////////////////////////////////
> >
> > Question :
> > 2. How can I get the lastest code for falsh multi-driver ??
> > Use " cvs -z3 -d :pserver:anoncvs@ecos.sourceware.org:/cvs/ecos co -r
> > flashv2 -P ecos " ??
>
> That looks OK.
>
> Andrew
>
> --
> Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
> and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
>
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss