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(&reg_params[0], "r0", 32, PARAM_IN_OUT);
+	init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
+	init_reg_param(&reg_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(&reg_params[0]);
+	destroy_reg_param(&reg_params[1]);
+	destroy_reg_param(&reg_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