[U-Boot-Users] Question about CFG_ENV_ADDR during RAMBOOT

Ulf Samuelsson ulf at atmel.com
Mon May 28 16:08:50 CEST 2007


> On Sat, May 26, 2007 at 12:53:31PM +0200, Ulf Samuelsson wrote:
>> => OK, then tell me how
>>    to compare a 6 MB
>>    file in flash with a 6MB
>>    file in SDRAM when
>>    your SDRAM is 8 MB.
> 
> Chunk by chunk?

Yes, but not by doing that manually.
It was suggested that you do not need any command
to do that compare since you can copy from dataflash to SDRAM.
If you use 64 kB buffers, then you have to type in 96 U.boot commands
to do that single compare.

> But indeed, there is a little problem. It would be usefull to show
> address which contains diferences from the beginning of dataflash
> (or dataflash partition)...
> 
>>    We are *not* running on
>>    PC's.
> 
> 
> Anyone who copies whole file into RAM and then does compare has either a
> lot of RAM or doesn't deserve to be called power user.
> 

The amount of flash and ram is typically determined by the need of 
the application, and not by the qualifications of the person running U-boot.

> Lines 303-308 of common/cmd_mem.c reads (cmp command):
> #ifdef CONFIG_HAS_DATAFLASH
>        if (addr_dataflash(addr1) | addr_dataflash(addr2)){
>                puts ("Comparison with DataFlash space not supported.\n\r");
>                return 0;
>        }
> #endif
> 
> On my boards it leads to:
> # cmp.l 10000000 C0000000 10
> Comparison with DataFlash space not supported.
> 
> Therefore it seems I have to copy to RAM anyway and it doesn't seem to
> be fixed by any patch at ftp 81.80.104.162.

That is funny because I have done that patch.

> 
>>    I would have more respects
>>    for exhibited views if writes
>>    to parallel flash is removed
>>    from cp.b...
>>    Parallel flash is clearly not
>>    "memory" for write 
>>     purposes, only for read
>>     purposes.
>>     Its existence in cp.b will 
>>     force endless #ifdefs
>>     or support for parallel flash
>>     will have to remain and
>>    bloat code.
> 
> Erm... This interface is finished, contains finite number of features
> and certainly finite numbers of #ifdefs. This number could be reduced
> even more by removing hacks for MMC.

It is not finished, since people would like to "clean" up the memory commands
but you are avoiding the point, in favour of advocacy.

Parallel flash CANNOT be written in the same way as SDRAM.
Why should then parallel flash be considered as memory.

I really do not advocate that this is changed, but I would like to see
some consistency in arguments.

> 
>>     You could then argue that 
>>     support for parallel flash 
>>     should be removed from
>>     all commands to remove
>>     inconsistencies...
>> 
>>    I do not think this will
>>    happen because it is
>>    *useful* and because
>>    this affects boards which
>>    people that makes 
>>    decisions works with
>>    this. They do not work
>>    with dataflash and do
>>    not care about people
>>    that wants this.
> 
> I have two AT91RM9200 based boards here. One boots from dataflash,
> stores enviroment here and loads kernel from NAND. Sure I care about
> dataflash support...
> 
>>    I think that consistency
>>    in argumentation is a
>>    reasonable demand.
>>    
>>    * BYTE WRITE
>> 
>>    Why should you waste
>>    time on copying dataflash
>>    to SDRAM when you can 
>>    do operations inside the
>>    internal SRAM.
>> 
>>    It is not desirable to transfer
>>    20,000 bits between CPU
>>    and dataflash when 100-200
>>    are sufficient.
> 
> Could you please point exactly where I suggested such behaviour?
> 

Wolfgang suggested byte writes should be implemented as 
1) Copy to SDRAM
2) Modify SDRAM
3) Write to Dataflash

which will result in above inefficiency.


> Best regards,
> ladis
>

Personally, I would like to see an architecture where every memory
registers itself in a common database.

When a memory command is executed, the command should be split 
the memory areas involved into pages, and execute the command
on each page.

Each driver would, if neccessary copy its data into a SDRAM buffer before use.

cp.b
     
     for each registred memory do
         if(src = parse(parameter 1)) != FAIL) 
                break;
         end if
     done
     if(src == FAIL) then
            src = SDRAM
    end if 

     for each registred memory do
         if(dst = parse(parameter 2)) != FAIL) 
                break;
         end if;
    done
     if(dst == FAIL) then
            dst = SDRAM
    end if

    /*
         Now you have src pointing to a descriptor for the first parameter
         and dst pointing to a descriptor for the second parameter.
        - Without any ifdefs, and easily extendible.
    */
    pageesize = determine_pagesize(src,dst);

    for(i = 0; i < size; i += pagesize) {
            Ensure that src is accessible using a memory pointer to SDRAM
                 * maybe by reading from storage to SDRAM
                 * if in SDRAM/par flash memory, just return pointer
            Copy page to destination, using access routine defined in storage driver.
    }


Best Regards
Ulf Samuelsson





More information about the U-Boot mailing list