eCos flash driver.
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 28 Feb 2008 08:25:46 +0000 (08:25 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 28 Feb 2008 08:25:46 +0000 (08:25 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@365 b42882b7-edfa-0310-969c-e2dbd0fdcd60

ecosflash/Makefile [new file with mode: 0644]
ecosflash/at91eb40a.elf [new file with mode: 0644]
ecosflash/debug_at91eb40a.elf [new file with mode: 0644]
ecosflash/flash.S [new file with mode: 0644]
ecosflash/flash.c [new file with mode: 0644]
ecosflash/flash.map [new file with mode: 0644]
ecosflash/notes.txt [new file with mode: 0644]
src/flash/Makefile.am
src/flash/ecos.c [new file with mode: 0644]
src/flash/flash.c

diff --git a/ecosflash/Makefile b/ecosflash/Makefile
new file mode 100644 (file)
index 0000000..dfff37c
--- /dev/null
@@ -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 (file)
index 0000000..451657a
Binary files /dev/null and b/ecosflash/at91eb40a.elf differ
diff --git a/ecosflash/debug_at91eb40a.elf b/ecosflash/debug_at91eb40a.elf
new file mode 100644 (file)
index 0000000..0bada05
Binary files /dev/null and b/ecosflash/debug_at91eb40a.elf differ
diff --git a/ecosflash/flash.S b/ecosflash/flash.S
new file mode 100644 (file)
index 0000000..dc30d16
--- /dev/null
@@ -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 (file)
index 0000000..654273d
--- /dev/null
@@ -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 (file)
index 0000000..d47258b
--- /dev/null
@@ -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 (file)
index 0000000..2183912
--- /dev/null
@@ -0,0 +1,111 @@
+1. GDB startup script for debugging purposes.\r
+\r
+# startup script for debugging flash erase\r
+target remote 10.0.0.56:2001\r
+monitor halt\r
+monitor reset\r
+load\r
+# stack\r
+monitor rm 13 0x7000\r
+# pc \r
+monitor rm 15 0x8000\r
+# arg1 to erase()\r
+monitor rm 0 0x1030000\r
+# arg2 to erase()\r
+monitor rm 1 0x10000\r
+stepi\r
+\r
+\r
+\r
+2. Uploading flash driver via tftp\r
+\r
+\r
+$ tftp 10.0.0.108\r
+tftp> binary\r
+tftp> put at91fr40162.bin 10.0.0.108:/config/flashdriver.bin\r
+Sent 4048 bytes in 0.1 seconds\r
+tftp>\r
+\r
+\r
+4. Programming flash\r
+\r
+eCosBoard_prog 0x1000000 /config/testdata.bin\r
\r
\r
+tftp> put /cygdrive/c/workspace/ecosboard/ecosboard/phi/bootloader/images/bootloader.bin 10.0.0.108:/config/test.bin\r
+Sent 165724 bytes in 3.9 seconds\r
+\r
+\r
+halt\r
+reg cpsr 0x000000D3\r
+mww 0xFFE00020 0x1\r
+mww 0xFFE00024 0x00000000\r
+mww 0xFFE00000 0x01002539\r
+eCosBoard_profile\r
+eCosBoard_prog /config/test.bin 0x1000000\r
+eCosBoard_profile_done\r
+\r
+\r
+\r
+\r
+set remote memory-write-packet-size fixed\r
+\r
+\r
+set remote memory-write-packet-size 8192\r
+set remote memory-map-packet on\r
+target remote 10.0.0.108:3333\r
+monitor halt\r
+monitor reg cpsr 0x000000D3\r
+monitor mww 0xFFE00020 0x1\r
+monitor mww 0xFFE00024 0x00000000\r
+monitor mww 0xFFE00000 0x01002539\r
+\r
+\r
+monitor eCosBoard_profile\r
+load\r
+monitor eCosBoard_profile_done\r
+\r
+\r
+source /tmp/ecosboard/packages/services/profile/gprof/current/host/gprof.gdb\r
+gprof_dump\r
+shell cp gmon.out /tmp/ecosboard/build/src\r
+echo To view: cd /tmp/ecosboard/build/src && gprof openocd\r
+\r
+\r
+Performance problems:\r
+\r
+It seems the problem is that the actual flash programming takes time. \r
+hal_delay_us() is invoked between each time the \r
+CPU is polled for whether flash programming has completed.\r
+\r
+\r
+Flat profile:\r
+\r
+Each sample counts as 0.01 seconds.\r
+  %   cumulative   self              self     total\r
+ time   seconds   seconds    calls  Ts/call  Ts/call  name\r
+ 35.82     37.66    37.66                             hal_delay_us\r
+ 11.90     50.17    12.51                             arm7tdmi_clock_out\r
+  9.86     60.54    10.37                             gdb_get_packet\r
+  5.36     66.17     5.63                             memcpy\r
+  4.34     70.73     4.56                             target_buffer_get_u32\r
+  3.34     74.25     3.51                             embeddedice_read_reg_w_che\r
+ck\r
+  1.39     75.71     1.46                             arm7_9_write_memory\r
+  1.34     77.11     1.40                             cyg_tcp_output\r
+  1.33     78.51     1.40                             __udivsi3\r
+  1.11     79.68     1.17                             cyg_tcp_input\r
+  1.07     80.80     1.13                             arm7tdmi_store_word_regs\r
+  0.95     81.81     1.00                             __udivdi3\r
+  0.95     82.80     1.00                             __umodsi3\r
+  0.93     83.78     0.98                             arm7tdmi_write_core_regs\r
+  0.86     84.68     0.91                             arm7_9_poll\r
+  0.85     85.57     0.89                             memset\r
+  0.77     86.38     0.81                             cyg_splx\r
+  0.64     87.05     0.67                             cyg_in_cksumdata\r
+  0.63     87.71     0.66                             openeth_deliver\r
+  0.57     88.31     0.60                             strstr\r
+  0.51     88.85     0.53                             eth_drv_recv\r
+  0.49     89.36     0.52                             cyg_splinternal\r
+  0.49     89.88     0.52                             cyg_splimp\r
+  0.46     90.36     0.48                             cyg_ip_input
\ No newline at end of file
index 90f009e9161f7eb25104b8a30f422965ad5eae05..4d0280f610b96858e605ec118ee6b36012a986db 100644 (file)
@@ -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 \
 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
                     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 (file)
index 0000000..6aec41d
--- /dev/null
@@ -0,0 +1,481 @@
+/***************************************************************************\r
+ *   Copyright (C) 2008 Ã˜yvind Harboe                                      *\r
+ *   oyvind.harboe@zylin.com                                               *\r
+ *                                                                         *\r
+ *   This program is free software; you can redistribute it and/or modify  *\r
+ *   it under the terms of the GNU General Public License as published by  *\r
+ *   the Free Software Foundation; either version 2 of the License, or     *\r
+ *   (at your option) any later version.                                   *\r
+ *                                                                         *\r
+ *   This program is distributed in the hope that it will be useful,       *\r
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
+ *   GNU General Public License for more details.                          *\r
+ *                                                                         *\r
+ *   You should have received a copy of the GNU General Public License     *\r
+ *   along with this program; if not, write to the                         *\r
+ *   Free Software Foundation, Inc.,                                       *\r
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
+ ***************************************************************************/\r
+#ifdef HAVE_CONFIG_H\r
+#include "config.h"\r
+#endif\r
+\r
+#include "replacements.h"\r
+\r
+\r
+#include "flash.h"\r
+\r
+#include "target.h"\r
+\r
+#include "flash.h"\r
+#include "target.h"\r
+#include "log.h"\r
+#include "binarybuffer.h"\r
+#include "../target/embeddedice.h"\r
+#include "types.h"\r
+\r
+\r
+\r
+int ecosflash_register_commands(struct command_context_s *cmd_ctx);\r
+int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);\r
+int ecosflash_erase(struct flash_bank_s *bank, int first, int last);\r
+int ecosflash_protect(struct flash_bank_s *bank, int set, int first, int last);\r
+int ecosflash_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count);\r
+int ecosflash_probe(struct flash_bank_s *bank);\r
+int ecosflash_erase_check(struct flash_bank_s *bank);\r
+int ecosflash_protect_check(struct flash_bank_s *bank);\r
+int ecosflash_info(struct flash_bank_s *bank, char *buf, int buf_size);\r
+\r
+u32 ecosflash_get_flash_status(flash_bank_t *bank);\r
+void ecosflash_set_flash_mode(flash_bank_t *bank,int mode);\r
+u32 ecosflash_wait_status_busy(flash_bank_t *bank, u32 waitbits, int timeout);\r
+int ecosflash_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);\r
+\r
+flash_driver_t ecosflash_flash =\r
+{\r
+       .name = "ecosflash",\r
+       .register_commands = ecosflash_register_commands,\r
+       .flash_bank_command = ecosflash_flash_bank_command,\r
+       .erase = ecosflash_erase,\r
+       .protect = ecosflash_protect,\r
+       .write = ecosflash_write,\r
+       .probe = ecosflash_probe,\r
+       .auto_probe = ecosflash_probe,\r
+       .erase_check = ecosflash_erase_check,\r
+       .protect_check = ecosflash_protect_check,\r
+       .info = ecosflash_info\r
+};\r
+\r
+typedef struct ecosflash_flash_bank_s\r
+{\r
+       struct target_s *target;\r
+       working_area_t *write_algorithm;\r
+       working_area_t *erase_check_algorithm;\r
+       char *driverPath;\r
+       u32 start_address;\r
+} ecosflash_flash_bank_t;\r
+\r
+static const int sectorSize=0x10000;\r
+\r
+#define FLASH_ERR_OK              0x00  // No error - operation complete\r
+#define FLASH_ERR_INVALID         0x01  // Invalid FLASH address\r
+#define FLASH_ERR_ERASE           0x02  // Error trying to erase\r
+#define FLASH_ERR_LOCK            0x03  // Error trying to lock/unlock\r
+#define FLASH_ERR_PROGRAM         0x04  // Error trying to program\r
+#define FLASH_ERR_PROTOCOL        0x05  // Generic error\r
+#define FLASH_ERR_PROTECT         0x06  // Device/region is write-protected\r
+#define FLASH_ERR_NOT_INIT        0x07  // FLASH info not yet initialized\r
+#define FLASH_ERR_HWR             0x08  // Hardware (configuration?) problem\r
+#define FLASH_ERR_ERASE_SUSPEND   0x09  // Device is in erase suspend mode\r
+#define FLASH_ERR_PROGRAM_SUSPEND 0x0a  // Device is in in program suspend mode\r
+#define FLASH_ERR_DRV_VERIFY      0x0b  // Driver failed to verify data\r
+#define FLASH_ERR_DRV_TIMEOUT     0x0c  // Driver timed out waiting for device\r
+#define FLASH_ERR_DRV_WRONG_PART  0x0d  // Driver does not support device\r
+#define FLASH_ERR_LOW_VOLTAGE     0x0e  // Not enough juice to complete job\r
+\r
+\r
+char *\r
+flash_errmsg(int err)\r
+{\r
+    switch (err) {\r
+    case FLASH_ERR_OK:\r
+        return "No error - operation complete";\r
+    case FLASH_ERR_ERASE_SUSPEND:\r
+        return "Device is in erase suspend state";\r
+    case FLASH_ERR_PROGRAM_SUSPEND:\r
+        return "Device is in program suspend state";\r
+    case FLASH_ERR_INVALID:\r
+        return "Invalid FLASH address";\r
+    case FLASH_ERR_ERASE:\r
+        return "Error trying to erase";\r
+    case FLASH_ERR_LOCK:\r
+        return "Error trying to lock/unlock";\r
+    case FLASH_ERR_PROGRAM:\r
+        return "Error trying to program";\r
+    case FLASH_ERR_PROTOCOL:\r
+        return "Generic error";\r
+    case FLASH_ERR_PROTECT:\r
+        return "Device/region is write-protected";\r
+    case FLASH_ERR_NOT_INIT:\r
+        return "FLASH sub-system not initialized";\r
+    case FLASH_ERR_DRV_VERIFY:\r
+        return "Data verify failed after operation";\r
+    case FLASH_ERR_DRV_TIMEOUT:\r
+        return "Driver timed out waiting for device";\r
+    case FLASH_ERR_DRV_WRONG_PART:\r
+        return "Driver does not support device";\r
+    case FLASH_ERR_LOW_VOLTAGE:\r
+        return "Device reports low voltage";\r
+    default:\r
+        return "Unknown error";\r
+    }\r
+}\r
+\r
+\r
+/* flash bank ecosflash <base> <size> <chip_width> <bus_width> <target#> <driverPath>\r
+ */\r
+int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank)\r
+{\r
+       ecosflash_flash_bank_t *info;\r
+       \r
+       if (argc < 7)\r
+       {\r
+               WARNING("incomplete flash_bank ecosflash configuration");\r
+               return ERROR_FLASH_BANK_INVALID;\r
+       }\r
+       \r
+       info = malloc(sizeof(ecosflash_flash_bank_t));\r
+       if(info == NULL)\r
+       {\r
+               ERROR("no memory for flash bank info");\r
+               exit(-1);\r
+       }\r
+       bank->driver_priv = info;\r
+       info->driverPath=strdup(args[6]);\r
+\r
+       // eCos flash sector sizes are not exposed to OpenOCD, use 0x10000 as \r
+       // a way to improve impeadance matach between OpenOCD and eCos flash\r
+       // driver\r
+       int i = 0;\r
+       u32 offset = 0;\r
+       bank->num_sectors=bank->size/sectorSize;\r
+       bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors);\r
+       for (i = 0; i < bank->num_sectors; i++)\r
+       {\r
+               bank->sectors[i].offset = offset;\r
+               bank->sectors[i].size = sectorSize;\r
+               offset += bank->sectors[i].size;\r
+               bank->sectors[i].is_erased = -1;\r
+               bank->sectors[i].is_protected = 0;\r
+       }\r
+       \r
+       info->target = get_target_by_num(strtoul(args[5], NULL, 0));\r
+       if (info->target == NULL)\r
+       {\r
+               ERROR("no target '%i' configured", (int)strtoul(args[5], NULL, 0));\r
+               exit(-1);\r
+       }\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+int loadDriver(ecosflash_flash_bank_t *info)\r
+{\r
+       u32 buf_cnt;\r
+       u32 image_size;\r
+       image_t image;  \r
+       \r
+       image.base_address_set = 0;\r
+       image.start_address_set = 0;\r
+       target_t *target=info->target;\r
+       \r
+       if (image_open(&image, info->driverPath, NULL) != ERROR_OK)\r
+       {\r
+               ERROR("load_image error: %s", image.error_str);\r
+               return ERROR_FLASH_BANK_INVALID;\r
+       }\r
+       \r
+       info->start_address=image.start_address;\r
+       \r
+       image_size = 0x0;\r
+       int i;\r
+       for (i = 0; i < image.num_sections; i++)\r
+       {\r
+               void *buffer = malloc(image.sections[i].size);\r
+               int retval;\r
+               if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)\r
+               {\r
+                       ERROR("image_read_section failed with error code: %i", retval);\r
+                       free(buffer);\r
+                       image_close(&image);\r
+                       return ERROR_FLASH_BANK_INVALID;\r
+               }\r
+               target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);\r
+               image_size += buf_cnt;\r
+               DEBUG("%u byte written at address 0x%8.8x", buf_cnt, image.sections[i].base_address);\r
+               \r
+               free(buffer);\r
+       }\r
+\r
+       image_close(&image);\r
+\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+static int const OFFSET_ERASE=0x0;\r
+static int const OFFSET_ERASE_SIZE=0x8;\r
+static int const OFFSET_FLASH=0xc;\r
+static int const OFFSET_FLASH_SIZE=0x8;\r
+static int const OFFSET_GET_WORKAREA=0x18;\r
+static int const OFFSET_GET_WORKAREA_SIZE=0x4;\r
+\r
+\r
+int runCode(ecosflash_flash_bank_t *info, \r
+               u32 codeStart, u32 codeStop, u32 r0, u32 r1, u32 r2, \r
+               u32 *result,\r
+               // timeout in ms\r
+               int timeout)\r
+{\r
+       target_t *target=info->target;\r
+\r
+       reg_param_t reg_params[3];\r
+       armv4_5_algorithm_t armv4_5_info;\r
+       armv4_5_info.common_magic = ARMV4_5_COMMON_MAGIC;\r
+       armv4_5_info.core_mode = ARMV4_5_MODE_SVC;\r
+       armv4_5_info.core_state = ARMV4_5_STATE_ARM;\r
+       \r
+       init_reg_param(&reg_params[0], "r0", 32, PARAM_IN_OUT);\r
+       init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);\r
+       init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);\r
+       \r
+       buf_set_u32(reg_params[0].value, 0, 32, r0);\r
+       buf_set_u32(reg_params[1].value, 0, 32, r1);\r
+       buf_set_u32(reg_params[2].value, 0, 32, r2);\r
+       \r
+       int retval;\r
+       if ((retval = target->type->run_algorithm(target, 0, NULL, 3, reg_params,\r
+                       codeStart,\r
+                       codeStop, timeout, \r
+                       &armv4_5_info)) != ERROR_OK)\r
+       {\r
+               ERROR("error executing eCos flash algorithm");\r
+               return retval;\r
+       }\r
+       \r
+       *result=buf_get_u32(reg_params[0].value, 0, 32);\r
+       \r
+       destroy_reg_param(&reg_params[0]);\r
+       destroy_reg_param(&reg_params[1]);\r
+       destroy_reg_param(&reg_params[2]);\r
+       \r
+       return ERROR_OK;\r
+}\r
+\r
+int eCosBoard_erase(ecosflash_flash_bank_t *info, u32 address, u32 len)\r
+{\r
+       int retval;\r
+       int timeout = (len / 20480 + 1) * 1000; /*asume 20 KB/s*/ \r
+\r
+       retval=loadDriver(info);\r
+       if (retval!=ERROR_OK)\r
+               return retval;\r
+       \r
+       u32 flashErr;\r
+       retval=runCode(info, \r
+                       info->start_address+OFFSET_ERASE,\r
+                       info->start_address+OFFSET_ERASE+OFFSET_ERASE_SIZE,\r
+                       address,\r
+                       len,\r
+                       0,\r
+                       &flashErr,\r
+                       timeout\r
+                       );\r
+       if (retval!=ERROR_OK)\r
+               return retval;\r
+       \r
+       if (flashErr != 0x0)\r
+       {\r
+               ERROR("Flash erase failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));\r
+               return ERROR_JTAG_DEVICE_ERROR;\r
+       }\r
+\r
+       return ERROR_OK;\r
+}\r
+\r
+int eCosBoard_flash(ecosflash_flash_bank_t *info, void *data, u32 address, u32 len)\r
+{\r
+       target_t *target=info->target;\r
+       const int chunk=8192;\r
+       int retval=ERROR_OK;\r
+       int timeout = (chunk / 20480 + 1) * 1000; /*asume 20 KB/s + 1 second*/\r
+       \r
+       retval=loadDriver(info);\r
+       if (retval!=ERROR_OK)\r
+               return retval;\r
+       \r
+       u32 buffer;\r
+       retval=runCode(info, \r
+                       info->start_address+OFFSET_GET_WORKAREA,\r
+                       info->start_address+OFFSET_GET_WORKAREA+OFFSET_GET_WORKAREA_SIZE,\r
+                       0,\r
+                       0,\r
+                       0,\r
+                       &buffer,\r
+                       1000);\r
+       if (retval!=ERROR_OK)\r
+               return retval;\r
+       \r
+       \r
+       int i;\r
+    for (i=0; i<len; i+=chunk)\r
+    {\r
+               int t=len-i;\r
+               if (t>chunk)\r
+               {\r
+                       t=chunk;\r
+               }\r
+               \r
+               int retval;\r
+       retval=target_write_buffer(target, buffer, t, ((char *)data)+i);\r
+       if (retval != ERROR_OK)\r
+               return retval;\r
+       \r
+       u32 flashErr;\r
+       retval=runCode(info, \r
+                       info->start_address+OFFSET_FLASH,\r
+                       info->start_address+OFFSET_FLASH+OFFSET_FLASH_SIZE,\r
+                       buffer,\r
+                       address+i,\r
+                       t,\r
+                       &flashErr,\r
+                       timeout);\r
+       if (retval != ERROR_OK)\r
+               return retval;\r
+\r
+               if (flashErr != 0x0)\r
+               {\r
+                       ERROR("Flash prog failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));\r
+                       return ERROR_JTAG_DEVICE_ERROR;\r
+               }\r
+    }\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+int ecosflash_probe(struct flash_bank_s *bank)\r
+{\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+int ecosflash_register_commands(struct command_context_s *cmd_ctx)\r
+{\r
+       register_command(cmd_ctx, NULL, "ecosflash", NULL, COMMAND_ANY, NULL);\r
+       \r
+       return ERROR_OK;\r
+}\r
+\r
+/*\r
+static void command(flash_bank_t *bank, u8 cmd, u8 *cmd_buf)\r
+{\r
+       ecosflash_flash_bank_t *info = bank->driver_priv;\r
+       int i;\r
+       \r
+       if (info->target->endianness == TARGET_LITTLE_ENDIAN)\r
+       {\r
+               for (i = bank->bus_width; i > 0; i--)\r
+               {\r
+                       *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               for (i = 1; i <= bank->bus_width; i++)\r
+               {\r
+                       *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd;\r
+               }\r
+       }\r
+}\r
+*/\r
+\r
+u32 ecosflash_address(struct flash_bank_s *bank, u32 address)\r
+{\r
+       u32 retval = 0;\r
+       switch(bank->bus_width)\r
+       {\r
+               case 4:\r
+                       retval = address & 0xfffffffc;\r
+               case 2:\r
+                       retval = address & 0xfffffffe;\r
+               case 1:\r
+                       retval = address;\r
+       }\r
+       \r
+       return retval + bank->base;\r
+} \r
+\r
+\r
+int ecosflash_erase(struct flash_bank_s *bank, int first, int last)\r
+{\r
+       struct flash_bank_s *c=bank;\r
+       ecosflash_flash_bank_t *info = bank->driver_priv;\r
+       return eCosBoard_erase(info, c->base+first*sectorSize, sectorSize*(last-first+1)); \r
+}\r
+\r
+int ecosflash_protect(struct flash_bank_s *bank, int set, int first, int last)\r
+{\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+int ecosflash_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)\r
+{\r
+       ecosflash_flash_bank_t *info = bank->driver_priv;\r
+       struct flash_bank_s *c=bank;\r
+       return eCosBoard_flash(info, buffer, c->base+offset, count);\r
+}\r
+\r
+\r
+int ecosflash_erase_check(struct flash_bank_s *bank)\r
+{\r
+       return ERROR_OK;\r
+}\r
+\r
+int ecosflash_protect_check(struct flash_bank_s *bank)\r
+{\r
+       return ERROR_OK;\r
+}\r
+\r
+int ecosflash_info(struct flash_bank_s *bank, char *buf, int buf_size)\r
+{\r
+       ecosflash_flash_bank_t *info = bank->driver_priv;\r
+       snprintf(buf, buf_size, "eCos flash driver: %s", info->driverPath);\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+u32 ecosflash_get_flash_status(flash_bank_t *bank)\r
+{\r
+       return ERROR_OK;\r
+}\r
+\r
+void ecosflash_set_flash_mode(flash_bank_t *bank,int mode)\r
+{\r
+       \r
+}\r
+\r
+u32 ecosflash_wait_status_busy(flash_bank_t *bank, u32 waitbits, int timeout)\r
+{\r
+       return ERROR_OK;\r
+}\r
+\r
+int ecosflash_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)\r
+{\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+\r
+\r
index 2fefb4cd7668586f403ea20b218554fb821961f7..f1710851cfd642f7493f8d234fb8ef72f4c813ca 100644 (file)
@@ -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 str9xpec_flash;
 extern flash_driver_t stm32x_flash;
 extern flash_driver_t tms470_flash;
+extern flash_driver_t ecosflash_flash;\r
 
 flash_driver_t *flash_drivers[] =
 {
 
 flash_driver_t *flash_drivers[] =
 {
@@ -76,6 +77,7 @@ flash_driver_t *flash_drivers[] =
        &str9xpec_flash,
        &stm32x_flash,
        &tms470_flash,
        &str9xpec_flash,
        &stm32x_flash,
        &tms470_flash,
+       &ecosflash_flash,\r
        NULL,
 };
 
        NULL,
 };
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)