From d17e1cd93384d56886be7e67cf2b31e97118d811 Mon Sep 17 00:00:00 2001 From: oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> Date: Thu, 28 Feb 2008 08:25:46 +0000 Subject: [PATCH] eCos flash driver. git-svn-id: svn://svn.berlios.de/openocd/trunk@365 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- ecosflash/Makefile | 11 + ecosflash/at91eb40a.elf | Bin 0 -> 36832 bytes ecosflash/debug_at91eb40a.elf | Bin 0 -> 49447 bytes ecosflash/flash.S | 58 ++++ ecosflash/flash.c | 72 +++++ ecosflash/flash.map | 390 +++++++++++++++++++++++++++ ecosflash/notes.txt | 111 ++++++++ src/flash/Makefile.am | 2 +- src/flash/ecos.c | 481 ++++++++++++++++++++++++++++++++++ src/flash/flash.c | 2 + 10 files changed, 1126 insertions(+), 1 deletion(-) create mode 100644 ecosflash/Makefile create mode 100644 ecosflash/at91eb40a.elf create mode 100644 ecosflash/debug_at91eb40a.elf create mode 100644 ecosflash/flash.S create mode 100644 ecosflash/flash.c create mode 100644 ecosflash/flash.map create mode 100644 ecosflash/notes.txt create mode 100644 src/flash/ecos.c diff --git a/ecosflash/Makefile b/ecosflash/Makefile new file mode 100644 index 000000000..dfff37c2e --- /dev/null +++ b/ecosflash/Makefile @@ -0,0 +1,11 @@ +# Create OpenOCD eCos flash driver +# Syntax: make INSTALL_DIR=ecosinstalldir OUTPUT=outputname + +include $(INSTALL_DIR)/include/pkgconf/ecos.mak + +all: + $(ECOS_COMMAND_PREFIX)gcc $(ECOS_GLOBAL_CFLAGS) $(ECOS_GLOBAL_LDFLAGS) -g -o debug_$(OUTPUT).elf -nostdlib flash.S flash.c -Wl,--gc-sections -I$(INSTALL_DIR)/include -Wl,$(INSTALL_DIR)/lib/libtarget.a -Wl,-Map,flash.map + cp debug_$(OUTPUT).elf $(OUTPUT).elf + $(ECOS_COMMAND_PREFIX)strip $(OUTPUT).elf + echo Flash driver $(OUTPUT).elf + diff --git a/ecosflash/at91eb40a.elf b/ecosflash/at91eb40a.elf new file mode 100644 index 0000000000000000000000000000000000000000..451657a5a506ab1f60981b8b3627288c8950bc8f GIT binary patch literal 36832 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 literal 0 HcmV?d00001 diff --git a/ecosflash/debug_at91eb40a.elf b/ecosflash/debug_at91eb40a.elf new file mode 100644 index 0000000000000000000000000000000000000000..0bada05a877466fe8ece89e4f2937458491ccb1d GIT binary patch literal 49447 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 literal 0 HcmV?d00001 diff --git a/ecosflash/flash.S b/ecosflash/flash.S new file mode 100644 index 000000000..dc30d1633 --- /dev/null +++ b/ecosflash/flash.S @@ -0,0 +1,58 @@ +/* + Jump table for flash driver + + Registers in ARM callling convention is to place args in registers + starting at r0. + + So for: + + void foo(int a, int b, int c). + + a=r0 + b=r1 + c=r2 + + +*/ + .global _stack_base + .global _stack_start + .global _workarea + .global _start + .global _start_bss_clear +_start: + // offset=0 + // int erase(void *address, int len) + ldr sp,=_stack_start + bl erase + nop // Stop CPU here using hw breakpoint + + // offset=0xc + // int program(void *buffer, void *address, int len) + ldr sp,=_stack_start + bl program + nop // Stop CPU here using hw breakpoint + + // offset=0x18 + ldr r0,=_workarea + nop // Stop CPU here using hw breakpoint + + // offset=0x20 + // int init() - returns error message if the flash chip can't be detected + ldr sp,=_stack_start + bl init + nop // Stop CPU here using hw breakpoint + + .section ".bss" + .balign 4 +_stack_base: + .rept 4096 + .byte 0 + .endr +_stack_start: + .balign 4 +_workarea: + .rept 8192 + .byte 0 + .endr + // NB!!! we clear bss while the stack is in use, so we start BSS clearing here !!! :-) +_start_bss_clear: diff --git a/ecosflash/flash.c b/ecosflash/flash.c new file mode 100644 index 000000000..654273d30 --- /dev/null +++ b/ecosflash/flash.c @@ -0,0 +1,72 @@ +#include <string.h> +#define _FLASH_PRIVATE_ +#include <cyg/io/flash.h> + + + +int myprintf(char *format, ...) +{ + return 0; +} + +extern char _start_bss_clear; +extern char __bss_end__; + +int init() +{ + // set up runtime environment + char *t; + for (t=&_start_bss_clear; t<&__bss_end__; t++) + { + *t=0; + } + return flash_init((_printf *)&myprintf); + +} + + +int checkFlash(void *addr, int len) +{ + // Return error for illegal addresses + if ((addr<flash_info.start)||(addr>flash_info.end)) + return FLASH_ERR_INVALID; + if ((((cyg_uint8 *)addr)+len)>(cyg_uint8 *)flash_info.end) + return FLASH_ERR_INVALID; + return FLASH_ERR_OK; +} + + +int erase(void *address, int len) +{ + int retval; + void *failAddress; + + retval=checkFlash(address, len); + if (retval!=0) + return retval; + + retval=init(); + if (retval!=0) + return retval; + return flash_erase(address, len, &failAddress); +} + + + +extern char _end; + +// Data follows immediately after program, long word aligned. +int program(void *buffer, void *address, int len) +{ + int retval; + void *failAddress; + retval=checkFlash(address, len); + if (retval!=0) + return retval; + + retval=init(); + if (retval!=0) + return retval; + //int flash_program(void *_addr, void *_data, int len, void **err_addr) + return flash_program(address, buffer, len, &failAddress); +} diff --git a/ecosflash/flash.map b/ecosflash/flash.map new file mode 100644 index 000000000..d47258b7e --- /dev/null +++ b/ecosflash/flash.map @@ -0,0 +1,390 @@ +Archive member included because of file (symbol) + +/tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o (flash_init) +/tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) (flash_hwr_init) +/tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) (memcpy) +/tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) (memcmp) + +Memory Configuration + +Name Origin Length Attributes +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/cccPBW5f.o +LOAD /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o +LOAD /tmp/ecosboard/ecos/install/lib/libtarget.a + 0x00008000 PROVIDE (__executable_start, 0x8000) + 0x00008000 . = 0x8000 + +.interp + *(.interp) + +.hash + *(.hash) + +.dynsym + *(.dynsym) + +.dynstr + *(.dynstr) + +.gnu.version + *(.gnu.version) + +.gnu.version_d + *(.gnu.version_d) + +.gnu.version_r + *(.gnu.version_r) + +.rel.dyn + *(.rel.init) + *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) + *(.rel.fini) + *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) + *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) + *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) + *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) + *(.rel.ctors) + *(.rel.dtors) + *(.rel.got) + *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) + +.rela.dyn + *(.rela.init) + *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) + *(.rela.fini) + *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) + *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) + *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) + *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) + *(.rela.ctors) + *(.rela.dtors) + *(.rela.got) + *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) + +.rel.plt + *(.rel.plt) + +.rela.plt + *(.rela.plt) + +.init + *(.init) + +.plt + *(.plt) + +.text 0x00008000 0x6f8 + *(.text .stub .text.* .gnu.linkonce.t.*) + .text 0x00008000 0x34 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/cccPBW5f.o + 0x00008000 _start + .text.myprintf + 0x00008034 0x10 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + 0x00008034 myprintf + .text.init 0x00008044 0x50 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + 0x00008044 init + .text.erase 0x00008094 0xc0 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + 0x00008094 erase + .text.program 0x00008154 0xc8 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + 0x00008154 program + .text.flash_init + 0x0000821c 0x6c /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + 0x0000821c flash_init + .text.flash_dev_query + 0x00008288 0x20 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + 0x00008288 flash_dev_query + .text.flash_erase + 0x000082a8 0x140 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + 0x000082a8 flash_erase + .text.flash_program + 0x000083e8 0x154 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + 0x000083e8 flash_program + .text.flash_hwr_init + 0x0000853c 0xa4 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + 0x0000853c flash_hwr_init + .text.flash_hwr_map_error + 0x000085e0 0x4 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + 0x000085e0 flash_hwr_map_error + .text.__memcmp + 0x000085e4 0x114 /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + 0x000085e4 memcmp + 0x000085e4 __memcmp + *(.gnu.warning) + *(.glue_7t) + *(.glue_7) + +.2ram.flash_query + 0x000086f8 0x54 + .2ram.flash_query + 0x000086f8 0x54 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + 0x000086f8 flash_query + +.2ram.flash_erase_block + 0x0000874c 0x230 + .2ram.flash_erase_block + 0x0000874c 0x230 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + 0x0000874c flash_erase_block + +.2ram.flash_program_buf + 0x0000897c 0xe8 + .2ram.flash_program_buf + 0x0000897c 0xe8 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + 0x0000897c flash_program_buf + +.fini + *(.fini) + 0x00008a64 PROVIDE (__etext, .) + 0x00008a64 PROVIDE (_etext, .) + 0x00008a64 PROVIDE (etext, .) + +.rodata 0x00008a64 0x318 + *(.rodata .rodata.* .gnu.linkonce.r.*) + .rodata.str1.4 + 0x00008a64 0x1fb /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + 0x1fc (size before relaxing) + *fill* 0x00008c5f 0x1 00 + .rodata.supported_devices + 0x00008c60 0x11c /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + +.rodata1 + *(.rodata1) + +.eh_frame_hdr + *(.eh_frame_hdr) + 0x00008e7c . = (ALIGN (0x100) + (. & 0xff)) + 0x00008e7c . = ALIGN (0x4) + 0x00008e7c PROVIDE (__preinit_array_start, .) + +.preinit_array + *(.preinit_array) + 0x00008e7c PROVIDE (__preinit_array_end, .) + 0x00008e7c PROVIDE (__init_array_start, .) + +.init_array + *(.init_array) + 0x00008e7c PROVIDE (__init_array_end, .) + 0x00008e7c PROVIDE (__fini_array_start, .) + +.fini_array + *(.fini_array) + 0x00008e7c PROVIDE (__fini_array_end, .) + +.data 0x00008e7c 0x0 + 0x00008e7c __data_start = . + *(.data .data.* .gnu.linkonce.d.*) + +.data1 + *(.data1) + +.tdata + *(.tdata .tdata.* .gnu.linkonce.td.*) + +.tbss + *(.tbss .tbss.* .gnu.linkonce.tb.*) + *(.tcommon) + +.eh_frame + *(.eh_frame) + +.gcc_except_table + *(.gcc_except_table) + +.dynamic + *(.dynamic) + +.ctors + *crtbegin*.o(.ctors) + *(EXCLUDE_FILE(*crtend*.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + +.dtors + *crtbegin*.o(.dtors) + *(EXCLUDE_FILE(*crtend*.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + +.jcr + *(.jcr) + +.got + *(.got.plt) + *(.got) + 0x00008e7c _edata = . + 0x00008e7c PROVIDE (edata, .) + 0x00008e7c __bss_start = . + 0x00008e7c __bss_start__ = . + +.bss 0x00008e7c 0x3024 + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + .bss 0x00008e7c 0x3000 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/cccPBW5f.o + 0x00008e7c _stack_base + 0x0000be7c _start_bss_clear + 0x00009e7c _workarea + 0x00009e7c _stack_start + .bss.flash_info + 0x0000be7c 0x20 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + 0x0000be7c flash_info + .bss.flash_dev_info + 0x0000be9c 0x4 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + *(COMMON) + 0x0000bea0 . = ALIGN (0x4) + 0x0000bea0 . = ALIGN (0x4) + 0x0000bea0 _end = . + 0x0000bea0 _bss_end__ = . + 0x0000bea0 __bss_end__ = . + 0x0000bea0 __end__ = . + 0x0000bea0 PROVIDE (end, .) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment + *(.comment) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0x170 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/cccPBW5f.o + .debug_aranges + 0x00000020 0x48 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + .debug_aranges + 0x00000068 0x68 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + .debug_aranges + 0x000000d0 0x50 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + .debug_aranges + 0x00000120 0x28 /tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + .debug_aranges + 0x00000148 0x28 /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + +.debug_pubnames + 0x00000000 0x1e5 + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x4d /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + .debug_pubnames + 0x0000004d 0xca /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + .debug_pubnames + 0x00000117 0x91 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + .debug_pubnames + 0x000001a8 0x1e /tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + .debug_pubnames + 0x000001c6 0x1f /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + +.debug_info 0x00000000 0x1122 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x6e /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/cccPBW5f.o + .debug_info 0x0000006e 0x322 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + .debug_info 0x00000390 0x4f6 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + .debug_info 0x00000886 0x5b2 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + .debug_info 0x00000e38 0x1c7 /tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + .debug_info 0x00000fff 0x123 /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + +.debug_abbrev 0x00000000 0x67c + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x14 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/cccPBW5f.o + .debug_abbrev 0x00000014 0x17d /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + .debug_abbrev 0x00000191 0x15f /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + .debug_abbrev 0x000002f0 0x238 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + .debug_abbrev 0x00000528 0xb4 /tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + .debug_abbrev 0x000005dc 0xa0 /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + +.debug_line 0x00000000 0x8de + *(.debug_line) + .debug_line 0x00000000 0x3e /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/cccPBW5f.o + .debug_line 0x0000003e 0xf6 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + .debug_line 0x00000134 0x255 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + .debug_line 0x00000389 0x287 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + .debug_line 0x00000610 0x16c /tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + .debug_line 0x0000077c 0x162 /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + +.debug_frame 0x00000000 0x2c0 + *(.debug_frame) + .debug_frame 0x00000000 0xa4 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + .debug_frame 0x000000a4 0x110 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + .debug_frame 0x000001b4 0xac /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + .debug_frame 0x00000260 0x38 /tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + .debug_frame 0x00000298 0x28 /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + +.debug_str 0x00000000 0x508 + *(.debug_str) + .debug_str 0x00000000 0x131 /ecos-c/DOCUME~1/oyvind/LOCALS~1/Temp/ccM8Ftqt.o + 0x191 (size before relaxing) + .debug_str 0x00000131 0x152 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + 0x24e (size before relaxing) + .debug_str 0x00000283 0x194 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + 0x2c5 (size before relaxing) + .debug_str 0x00000417 0x7e /tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + 0x11e (size before relaxing) + .debug_str 0x00000495 0x73 /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) + 0x119 (size before relaxing) + +.debug_loc + *(.debug_loc) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.stack 0x00080000 0x0 + 0x00080000 _stack = . + *(.stack) + +.note.gnu.arm.ident + *(.note.gnu.arm.ident) + +/DISCARD/ + *(.note.GNU-stack) +OUTPUT(debug_eb40a.elf elf32-littlearm) + +.debug_ranges 0x00000000 0xb8 + .debug_ranges 0x00000000 0x18 /tmp/ecosboard/ecos/install/lib/libtarget.a(io_flash_flash.o) + .debug_ranges 0x00000018 0x48 /tmp/ecosboard/ecos/install/lib/libtarget.a(devs_flash_arm_eb40a_eb40a_flash.o) + .debug_ranges 0x00000060 0x30 /tmp/ecosboard/ecos/install/lib/libtarget.a(infra_memcpy.o) + .debug_ranges 0x00000090 0x28 /tmp/ecosboard/ecos/install/lib/libtarget.a(language_c_libc_string_memcmp.o) diff --git a/ecosflash/notes.txt b/ecosflash/notes.txt new file mode 100644 index 000000000..218391273 --- /dev/null +++ b/ecosflash/notes.txt @@ -0,0 +1,111 @@ +1. GDB startup script for debugging purposes. + +# startup script for debugging flash erase +target remote 10.0.0.56:2001 +monitor halt +monitor reset +load +# stack +monitor rm 13 0x7000 +# pc +monitor rm 15 0x8000 +# arg1 to erase() +monitor rm 0 0x1030000 +# arg2 to erase() +monitor rm 1 0x10000 +stepi + + + +2. Uploading flash driver via tftp + + +$ tftp 10.0.0.108 +tftp> binary +tftp> put at91fr40162.bin 10.0.0.108:/config/flashdriver.bin +Sent 4048 bytes in 0.1 seconds +tftp> + + +4. Programming flash + +eCosBoard_prog 0x1000000 /config/testdata.bin + + +tftp> put /cygdrive/c/workspace/ecosboard/ecosboard/phi/bootloader/images/bootloader.bin 10.0.0.108:/config/test.bin +Sent 165724 bytes in 3.9 seconds + + +halt +reg cpsr 0x000000D3 +mww 0xFFE00020 0x1 +mww 0xFFE00024 0x00000000 +mww 0xFFE00000 0x01002539 +eCosBoard_profile +eCosBoard_prog /config/test.bin 0x1000000 +eCosBoard_profile_done + + + + +set remote memory-write-packet-size fixed + + +set remote memory-write-packet-size 8192 +set remote memory-map-packet on +target remote 10.0.0.108:3333 +monitor halt +monitor reg cpsr 0x000000D3 +monitor mww 0xFFE00020 0x1 +monitor mww 0xFFE00024 0x00000000 +monitor mww 0xFFE00000 0x01002539 + + +monitor eCosBoard_profile +load +monitor eCosBoard_profile_done + + +source /tmp/ecosboard/packages/services/profile/gprof/current/host/gprof.gdb +gprof_dump +shell cp gmon.out /tmp/ecosboard/build/src +echo To view: cd /tmp/ecosboard/build/src && gprof openocd + + +Performance problems: + +It seems the problem is that the actual flash programming takes time. +hal_delay_us() is invoked between each time the +CPU is polled for whether flash programming has completed. + + +Flat profile: + +Each sample counts as 0.01 seconds. + % cumulative self self total + time seconds seconds calls Ts/call Ts/call name + 35.82 37.66 37.66 hal_delay_us + 11.90 50.17 12.51 arm7tdmi_clock_out + 9.86 60.54 10.37 gdb_get_packet + 5.36 66.17 5.63 memcpy + 4.34 70.73 4.56 target_buffer_get_u32 + 3.34 74.25 3.51 embeddedice_read_reg_w_che +ck + 1.39 75.71 1.46 arm7_9_write_memory + 1.34 77.11 1.40 cyg_tcp_output + 1.33 78.51 1.40 __udivsi3 + 1.11 79.68 1.17 cyg_tcp_input + 1.07 80.80 1.13 arm7tdmi_store_word_regs + 0.95 81.81 1.00 __udivdi3 + 0.95 82.80 1.00 __umodsi3 + 0.93 83.78 0.98 arm7tdmi_write_core_regs + 0.86 84.68 0.91 arm7_9_poll + 0.85 85.57 0.89 memset + 0.77 86.38 0.81 cyg_splx + 0.64 87.05 0.67 cyg_in_cksumdata + 0.63 87.71 0.66 openeth_deliver + 0.57 88.31 0.60 strstr + 0.51 88.85 0.53 eth_drv_recv + 0.49 89.36 0.52 cyg_splinternal + 0.49 89.88 0.52 cyg_splimp + 0.46 90.36 0.48 cyg_ip_input \ No newline at end of file diff --git a/src/flash/Makefile.am b/src/flash/Makefile.am index 90f009e91..4d0280f61 100644 --- a/src/flash/Makefile.am +++ b/src/flash/Makefile.am @@ -3,7 +3,7 @@ AM_CPPFLAGS = -DPKGLIBDIR=\"$(pkglibdir)\" @CPPFLAGS@ METASOURCES = AUTO noinst_LIBRARIES = libflash.a libflash_a_SOURCES = flash.c lpc2000.c cfi.c non_cfi.c at91sam7.c str7x.c str9x.c nand.c lpc3180_nand_controller.c \ - stellaris.c str9xpec.c stm32x.c tms470.c \ + stellaris.c str9xpec.c stm32x.c tms470.c ecos.c \ s3c24xx_nand.c s3c2410_nand.c s3c2412_nand.c s3c2440_nand.c s3c2443_nand.c noinst_HEADERS = flash.h lpc2000.h cfi.h non_cfi.h at91sam7.h str7x.h str9x.h nand.h lpc3180_nand_controller.h \ stellaris.h str9xpec.h stm32x.h tms470.h s3c24xx_nand.h s3c24xx_regs_nand.h diff --git a/src/flash/ecos.c b/src/flash/ecos.c new file mode 100644 index 000000000..6aec41d6a --- /dev/null +++ b/src/flash/ecos.c @@ -0,0 +1,481 @@ +/*************************************************************************** + * Copyright (C) 2008 �yvind Harboe * + * oyvind.harboe@zylin.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "replacements.h" + + +#include "flash.h" + +#include "target.h" + +#include "flash.h" +#include "target.h" +#include "log.h" +#include "binarybuffer.h" +#include "../target/embeddedice.h" +#include "types.h" + + + +int ecosflash_register_commands(struct command_context_s *cmd_ctx); +int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank); +int ecosflash_erase(struct flash_bank_s *bank, int first, int last); +int ecosflash_protect(struct flash_bank_s *bank, int set, int first, int last); +int ecosflash_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count); +int ecosflash_probe(struct flash_bank_s *bank); +int ecosflash_erase_check(struct flash_bank_s *bank); +int ecosflash_protect_check(struct flash_bank_s *bank); +int ecosflash_info(struct flash_bank_s *bank, char *buf, int buf_size); + +u32 ecosflash_get_flash_status(flash_bank_t *bank); +void ecosflash_set_flash_mode(flash_bank_t *bank,int mode); +u32 ecosflash_wait_status_busy(flash_bank_t *bank, u32 waitbits, int timeout); +int ecosflash_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); + +flash_driver_t ecosflash_flash = +{ + .name = "ecosflash", + .register_commands = ecosflash_register_commands, + .flash_bank_command = ecosflash_flash_bank_command, + .erase = ecosflash_erase, + .protect = ecosflash_protect, + .write = ecosflash_write, + .probe = ecosflash_probe, + .auto_probe = ecosflash_probe, + .erase_check = ecosflash_erase_check, + .protect_check = ecosflash_protect_check, + .info = ecosflash_info +}; + +typedef struct ecosflash_flash_bank_s +{ + struct target_s *target; + working_area_t *write_algorithm; + working_area_t *erase_check_algorithm; + char *driverPath; + u32 start_address; +} ecosflash_flash_bank_t; + +static const int sectorSize=0x10000; + +#define FLASH_ERR_OK 0x00 // No error - operation complete +#define FLASH_ERR_INVALID 0x01 // Invalid FLASH address +#define FLASH_ERR_ERASE 0x02 // Error trying to erase +#define FLASH_ERR_LOCK 0x03 // Error trying to lock/unlock +#define FLASH_ERR_PROGRAM 0x04 // Error trying to program +#define FLASH_ERR_PROTOCOL 0x05 // Generic error +#define FLASH_ERR_PROTECT 0x06 // Device/region is write-protected +#define FLASH_ERR_NOT_INIT 0x07 // FLASH info not yet initialized +#define FLASH_ERR_HWR 0x08 // Hardware (configuration?) problem +#define FLASH_ERR_ERASE_SUSPEND 0x09 // Device is in erase suspend mode +#define FLASH_ERR_PROGRAM_SUSPEND 0x0a // Device is in in program suspend mode +#define FLASH_ERR_DRV_VERIFY 0x0b // Driver failed to verify data +#define FLASH_ERR_DRV_TIMEOUT 0x0c // Driver timed out waiting for device +#define FLASH_ERR_DRV_WRONG_PART 0x0d // Driver does not support device +#define FLASH_ERR_LOW_VOLTAGE 0x0e // Not enough juice to complete job + + +char * +flash_errmsg(int err) +{ + switch (err) { + case FLASH_ERR_OK: + return "No error - operation complete"; + case FLASH_ERR_ERASE_SUSPEND: + return "Device is in erase suspend state"; + case FLASH_ERR_PROGRAM_SUSPEND: + return "Device is in program suspend state"; + case FLASH_ERR_INVALID: + return "Invalid FLASH address"; + case FLASH_ERR_ERASE: + return "Error trying to erase"; + case FLASH_ERR_LOCK: + return "Error trying to lock/unlock"; + case FLASH_ERR_PROGRAM: + return "Error trying to program"; + case FLASH_ERR_PROTOCOL: + return "Generic error"; + case FLASH_ERR_PROTECT: + return "Device/region is write-protected"; + case FLASH_ERR_NOT_INIT: + return "FLASH sub-system not initialized"; + case FLASH_ERR_DRV_VERIFY: + return "Data verify failed after operation"; + case FLASH_ERR_DRV_TIMEOUT: + return "Driver timed out waiting for device"; + case FLASH_ERR_DRV_WRONG_PART: + return "Driver does not support device"; + case FLASH_ERR_LOW_VOLTAGE: + return "Device reports low voltage"; + default: + return "Unknown error"; + } +} + + +/* flash bank ecosflash <base> <size> <chip_width> <bus_width> <target#> <driverPath> + */ +int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank) +{ + ecosflash_flash_bank_t *info; + + if (argc < 7) + { + WARNING("incomplete flash_bank ecosflash configuration"); + return ERROR_FLASH_BANK_INVALID; + } + + info = malloc(sizeof(ecosflash_flash_bank_t)); + if(info == NULL) + { + ERROR("no memory for flash bank info"); + exit(-1); + } + bank->driver_priv = info; + info->driverPath=strdup(args[6]); + + // eCos flash sector sizes are not exposed to OpenOCD, use 0x10000 as + // a way to improve impeadance matach between OpenOCD and eCos flash + // driver + int i = 0; + u32 offset = 0; + bank->num_sectors=bank->size/sectorSize; + bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors); + for (i = 0; i < bank->num_sectors; i++) + { + bank->sectors[i].offset = offset; + bank->sectors[i].size = sectorSize; + offset += bank->sectors[i].size; + bank->sectors[i].is_erased = -1; + bank->sectors[i].is_protected = 0; + } + + info->target = get_target_by_num(strtoul(args[5], NULL, 0)); + if (info->target == NULL) + { + ERROR("no target '%i' configured", (int)strtoul(args[5], NULL, 0)); + exit(-1); + } + return ERROR_OK; +} + + +int loadDriver(ecosflash_flash_bank_t *info) +{ + u32 buf_cnt; + u32 image_size; + image_t image; + + image.base_address_set = 0; + image.start_address_set = 0; + target_t *target=info->target; + + if (image_open(&image, info->driverPath, NULL) != ERROR_OK) + { + ERROR("load_image error: %s", image.error_str); + return ERROR_FLASH_BANK_INVALID; + } + + info->start_address=image.start_address; + + image_size = 0x0; + int i; + for (i = 0; i < image.num_sections; i++) + { + void *buffer = malloc(image.sections[i].size); + int retval; + if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK) + { + ERROR("image_read_section failed with error code: %i", retval); + free(buffer); + image_close(&image); + return ERROR_FLASH_BANK_INVALID; + } + target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer); + image_size += buf_cnt; + DEBUG("%u byte written at address 0x%8.8x", buf_cnt, image.sections[i].base_address); + + free(buffer); + } + + image_close(&image); + + return ERROR_OK; +} + + +static int const OFFSET_ERASE=0x0; +static int const OFFSET_ERASE_SIZE=0x8; +static int const OFFSET_FLASH=0xc; +static int const OFFSET_FLASH_SIZE=0x8; +static int const OFFSET_GET_WORKAREA=0x18; +static int const OFFSET_GET_WORKAREA_SIZE=0x4; + + +int runCode(ecosflash_flash_bank_t *info, + u32 codeStart, u32 codeStop, u32 r0, u32 r1, u32 r2, + u32 *result, + // timeout in ms + int timeout) +{ + target_t *target=info->target; + + reg_param_t reg_params[3]; + armv4_5_algorithm_t armv4_5_info; + armv4_5_info.common_magic = ARMV4_5_COMMON_MAGIC; + armv4_5_info.core_mode = ARMV4_5_MODE_SVC; + armv4_5_info.core_state = ARMV4_5_STATE_ARM; + + init_reg_param(®_params[0], "r0", 32, PARAM_IN_OUT); + init_reg_param(®_params[1], "r1", 32, PARAM_OUT); + init_reg_param(®_params[2], "r2", 32, PARAM_OUT); + + buf_set_u32(reg_params[0].value, 0, 32, r0); + buf_set_u32(reg_params[1].value, 0, 32, r1); + buf_set_u32(reg_params[2].value, 0, 32, r2); + + int retval; + if ((retval = target->type->run_algorithm(target, 0, NULL, 3, reg_params, + codeStart, + codeStop, timeout, + &armv4_5_info)) != ERROR_OK) + { + ERROR("error executing eCos flash algorithm"); + return retval; + } + + *result=buf_get_u32(reg_params[0].value, 0, 32); + + destroy_reg_param(®_params[0]); + destroy_reg_param(®_params[1]); + destroy_reg_param(®_params[2]); + + return ERROR_OK; +} + +int eCosBoard_erase(ecosflash_flash_bank_t *info, u32 address, u32 len) +{ + int retval; + int timeout = (len / 20480 + 1) * 1000; /*asume 20 KB/s*/ + + retval=loadDriver(info); + if (retval!=ERROR_OK) + return retval; + + u32 flashErr; + retval=runCode(info, + info->start_address+OFFSET_ERASE, + info->start_address+OFFSET_ERASE+OFFSET_ERASE_SIZE, + address, + len, + 0, + &flashErr, + timeout + ); + if (retval!=ERROR_OK) + return retval; + + if (flashErr != 0x0) + { + ERROR("Flash erase failed with %d (%s)\n", flashErr, flash_errmsg(flashErr)); + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; +} + +int eCosBoard_flash(ecosflash_flash_bank_t *info, void *data, u32 address, u32 len) +{ + target_t *target=info->target; + const int chunk=8192; + int retval=ERROR_OK; + int timeout = (chunk / 20480 + 1) * 1000; /*asume 20 KB/s + 1 second*/ + + retval=loadDriver(info); + if (retval!=ERROR_OK) + return retval; + + u32 buffer; + retval=runCode(info, + info->start_address+OFFSET_GET_WORKAREA, + info->start_address+OFFSET_GET_WORKAREA+OFFSET_GET_WORKAREA_SIZE, + 0, + 0, + 0, + &buffer, + 1000); + if (retval!=ERROR_OK) + return retval; + + + int i; + for (i=0; i<len; i+=chunk) + { + int t=len-i; + if (t>chunk) + { + t=chunk; + } + + int retval; + retval=target_write_buffer(target, buffer, t, ((char *)data)+i); + if (retval != ERROR_OK) + return retval; + + u32 flashErr; + retval=runCode(info, + info->start_address+OFFSET_FLASH, + info->start_address+OFFSET_FLASH+OFFSET_FLASH_SIZE, + buffer, + address+i, + t, + &flashErr, + timeout); + if (retval != ERROR_OK) + return retval; + + if (flashErr != 0x0) + { + ERROR("Flash prog failed with %d (%s)\n", flashErr, flash_errmsg(flashErr)); + return ERROR_JTAG_DEVICE_ERROR; + } + } + return ERROR_OK; +} + + +int ecosflash_probe(struct flash_bank_s *bank) +{ + return ERROR_OK; +} + + +int ecosflash_register_commands(struct command_context_s *cmd_ctx) +{ + register_command(cmd_ctx, NULL, "ecosflash", NULL, COMMAND_ANY, NULL); + + return ERROR_OK; +} + +/* +static void command(flash_bank_t *bank, u8 cmd, u8 *cmd_buf) +{ + ecosflash_flash_bank_t *info = bank->driver_priv; + int i; + + if (info->target->endianness == TARGET_LITTLE_ENDIAN) + { + for (i = bank->bus_width; i > 0; i--) + { + *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd; + } + } + else + { + for (i = 1; i <= bank->bus_width; i++) + { + *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd; + } + } +} +*/ + +u32 ecosflash_address(struct flash_bank_s *bank, u32 address) +{ + u32 retval = 0; + switch(bank->bus_width) + { + case 4: + retval = address & 0xfffffffc; + case 2: + retval = address & 0xfffffffe; + case 1: + retval = address; + } + + return retval + bank->base; +} + + +int ecosflash_erase(struct flash_bank_s *bank, int first, int last) +{ + struct flash_bank_s *c=bank; + ecosflash_flash_bank_t *info = bank->driver_priv; + return eCosBoard_erase(info, c->base+first*sectorSize, sectorSize*(last-first+1)); +} + +int ecosflash_protect(struct flash_bank_s *bank, int set, int first, int last) +{ + return ERROR_OK; +} + + +int ecosflash_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) +{ + ecosflash_flash_bank_t *info = bank->driver_priv; + struct flash_bank_s *c=bank; + return eCosBoard_flash(info, buffer, c->base+offset, count); +} + + +int ecosflash_erase_check(struct flash_bank_s *bank) +{ + return ERROR_OK; +} + +int ecosflash_protect_check(struct flash_bank_s *bank) +{ + return ERROR_OK; +} + +int ecosflash_info(struct flash_bank_s *bank, char *buf, int buf_size) +{ + ecosflash_flash_bank_t *info = bank->driver_priv; + snprintf(buf, buf_size, "eCos flash driver: %s", info->driverPath); + return ERROR_OK; +} + + +u32 ecosflash_get_flash_status(flash_bank_t *bank) +{ + return ERROR_OK; +} + +void ecosflash_set_flash_mode(flash_bank_t *bank,int mode) +{ + +} + +u32 ecosflash_wait_status_busy(flash_bank_t *bank, u32 waitbits, int timeout) +{ + return ERROR_OK; +} + +int ecosflash_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + return ERROR_OK; +} + + + + diff --git a/src/flash/flash.c b/src/flash/flash.c index 2fefb4cd7..f1710851c 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -64,6 +64,7 @@ extern flash_driver_t stellaris_flash; extern flash_driver_t str9xpec_flash; extern flash_driver_t stm32x_flash; extern flash_driver_t tms470_flash; +extern flash_driver_t ecosflash_flash; flash_driver_t *flash_drivers[] = { @@ -76,6 +77,7 @@ flash_driver_t *flash_drivers[] = &str9xpec_flash, &stm32x_flash, &tms470_flash, + &ecosflash_flash, NULL, }; -- GitLab