Øyvind Harboe wrote on 2009-09-11 09:57:08: > 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?
The "How to Write your own FLASH Algorithm" document at http://www.lauterbach.com/manual.html could perhaps be of interest. Direct link: http://www2.lauterbach.com/pdf/flash_app_own_algorithm.pdf Best regards Jonas _______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development