Breaking out new subject...
> We also talked a while back about the idea of a standardized download to the
> target.
>
> The general idea i was taking about at the time is described below.
>
> -Duane.
> ====
>
> A small say 2K, 100% position independent common block of arm code.
> perhaps - an "armv4" based 32bit code (not thumb)
> why? Because that would cover all arm7 and arm9 chips.
>
> Perhaps - another for cortexM3
> perhaps - another for armv7 - (cortexA8)
>
> Maybe other chips are "fixed address" - but generally ARM code can be made
> to be PIC in a very simple way.
>
> When this idea would be bad: Little quick downloads
> When this idea would be good: BULK transfers, flash programing, etc.
>
> The idea is this:
> Let us assume there is a 4K block (working space) of ram some where.
> The code could be 2K, set aside 1K for stack (yes 1K)
> And 1K for a download buffer - could be bigger..
> Maybe we work with 4K and 4K...
>
> The entry point would be fixed - always at Buffer+0
> Set the program counter there, nothing else needs set.
>
> Then, set a SW breakpoint at - a fixed location.
> Example: Buffer + 0x10
> This would leave a few bytes @ the start for startup code
> And might be easier for different chips (ie: non-arm chips).
>
> The target code *RUNS*, sets up the stack and then enters
> some type of "for-ever" loop, that looks like this:
> *AND* is 100% written in *C* code - not assembler.
>
> some_c_function( void )
> {
> uint32_t buffer[16];
> // this example puts the 4K transfer buffer on the stack
> uint32_t download_buffer[ 1024 ];
> int result;
>
> // assume result=success
> result = 0;
>
> for( ;; ){
> // buffer[0] = holds result
> buffer[0] = result;
> // tell app where transfer buffer is located.
> buffer[1] = &download_buffer[0];
> buffer[2] = sizeof(download_buffer);
>
> // this hits openocd breakpoint
> openocd_syscall( &buffer[0] );
>
> // openocd stuffs parameters in the buffer.
> // parameter 0 - is the command.
> // parameter 1/2/3 ... /15 are command specific
>
> switch( buffer[0] ){
> case CFI_FLASH_ERASE:
> // params 1,2,3 are address and length
> result= perform_cfi_erase( &buffer[0] );
> case HIGH_SPEED_DOWNLOAD:
> // on ARM this might use CP15 DCC
> result =perform_high_speed_download( &buffer[0] );
> case .. other commands
> // break
> } // switch
> } // forever()
> }
>
> ======
>
> Why do I suggest C? And the above method...
> Because it would work on *ALL* targets!
> One only needs to *compile* a small C program.
> And little helpers would be very fast.
How would you handle the C code for a particular flash chip?
Would that algorithm have to go into the single "giant" app
that is downloaded?
--
Øyvind Harboe
Embedded software and hardware consulting services
http://www.zylin.com
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development