aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO1
-rw-r--r--doc/openocd.texi7
-rw-r--r--ecosflash/Makefile41
-rwxr-xr-xecosflash/debug_at91eb40a.elfbin49447 -> 0 bytes
-rw-r--r--ecosflash/flash.S90
-rw-r--r--ecosflash/flash.c104
-rw-r--r--ecosflash/flash.map390
-rw-r--r--ecosflash/notes.txt6
-rw-r--r--src/flash/nor/Makefile.am1
-rw-r--r--src/flash/nor/drivers.c2
-rw-r--r--src/flash/nor/ecos.c425
-rw-r--r--src/helper/options.c2
-rw-r--r--src/target/Makefile.am2
-rw-r--r--src/target/ecos/at91eb40a.elfbin36832 -> 0 bytes
-rw-r--r--tcl/board/at91eb40a.cfg2
-rw-r--r--testing/testcases.html14
16 files changed, 2 insertions, 1085 deletions
diff --git a/TODO b/TODO
index aa2277c1..8aac1575 100644
--- a/TODO
+++ b/TODO
@@ -214,7 +214,6 @@ https://lists.berlios.de/pipermail/openocd-development/2009-October/011506.html
- finish documentation for the following flash drivers:
- avr
- - ecosflash
- pic32mx
- ocl
- str9xpec
diff --git a/doc/openocd.texi b/doc/openocd.texi
index 323136f3..0f24f859 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -4654,13 +4654,6 @@ The AVR 8-bit microcontrollers from Atmel integrate flash memory.
@comment - defines mass_erase ... pointless given flash_erase_address
@end deffn
-@deffn {Flash Driver} ecosflash
-@emph{No idea what this is...}
-The @var{ecosflash} driver defines one mandatory parameter,
-the name of a modules of target code which is downloaded
-and executed.
-@end deffn
-
@deffn {Flash Driver} lpc2000
Most members of the LPC1700 and LPC2000 microcontroller families from NXP
include internal flash and use Cortex-M3 (LPC1700) or ARM7TDMI (LPC2000) cores.
diff --git a/ecosflash/Makefile b/ecosflash/Makefile
deleted file mode 100644
index 8a879ad5..00000000
--- a/ecosflash/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-#####ECOSGPLCOPYRIGHTBEGIN####
-## -------------------------------------------
-## This file is part of eCos, the Embedded Configurable Operating System.
-## Copyright (C) 2008 Øyvind Harboe
-##
-## eCos 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 or (at your option) any later version.
-##
-## eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
-## 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-##
-## As a special exception, if other files instantiate templates or use macros
-## or inline functions from this file, or you compile this file and link it
-## with other works to produce a work based on this file, this file does not
-## by itself cause the resulting work to be covered by the GNU General Public
-## License. However the source code for this file must still be made available
-## in accordance with section (3) of the GNU General Public License.
-##
-## This exception does not invalidate any other reasons why a work based on
-## this file might be covered by the GNU General Public License.
-## -------------------------------------------
-#####ECOSGPLCOPYRIGHTEND####
-
-# 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/debug_at91eb40a.elf b/ecosflash/debug_at91eb40a.elf
deleted file mode 100755
index 0bada05a..00000000
--- a/ecosflash/debug_at91eb40a.elf
+++ /dev/null
Binary files differ
diff --git a/ecosflash/flash.S b/ecosflash/flash.S
deleted file mode 100644
index b6e6fccb..00000000
--- a/ecosflash/flash.S
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
-#####ECOSGPLCOPYRIGHTBEGIN####
-## -------------------------------------------
-## This file is part of eCos, the Embedded Configurable Operating System.
-## Copyright (C) 2008 Øyvind Harboe
-##
-## eCos 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 or (at your option) any later version.
-##
-## eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
-## 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-##
-## As a special exception, if other files instantiate templates or use macros
-## or inline functions from this file, or you compile this file and link it
-## with other works to produce a work based on this file, this file does not
-## by itself cause the resulting work to be covered by the GNU General Public
-## License. However the source code for this file must still be made available
-## in accordance with section (3) of the GNU General Public License.
-##
-## This exception does not invalidate any other reasons why a work based on
-## this file might be covered by the GNU General Public License.
-## -------------------------------------------
-#####ECOSGPLCOPYRIGHTEND####
-*/
-
-/*
- 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
deleted file mode 100644
index c8ac353f..00000000
--- a/ecosflash/flash.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-#####ECOSGPLCOPYRIGHTBEGIN####
-## -------------------------------------------
-## This file is part of eCos, the Embedded Configurable Operating System.
-## Copyright (C) 2008 Øyvind Harboe
-##
-## eCos 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 or (at your option) any later version.
-##
-## eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
-## 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-##
-## As a special exception, if other files instantiate templates or use macros
-## or inline functions from this file, or you compile this file and link it
-## with other works to produce a work based on this file, this file does not
-## by itself cause the resulting work to be covered by the GNU General Public
-## License. However the source code for this file must still be made available
-## in accordance with section (3) of the GNU General Public License.
-##
-## This exception does not invalidate any other reasons why a work based on
-## this file might be covered by the GNU General Public License.
-## -------------------------------------------
-#####ECOSGPLCOPYRIGHTEND####
-*/
-
-#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
deleted file mode 100644
index d47258b7..00000000
--- a/ecosflash/flash.map
+++ /dev/null
@@ -1,390 +0,0 @@
-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
deleted file mode 100644
index bf456bbc..00000000
--- a/ecosflash/notes.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Some of these binaries are build & linked using eCos.
-
-For source for the flash drivers, see:
-
-http://ecos.sourceware.org/
-
diff --git a/src/flash/nor/Makefile.am b/src/flash/nor/Makefile.am
index d5832ca2..0b219a9b 100644
--- a/src/flash/nor/Makefile.am
+++ b/src/flash/nor/Makefile.am
@@ -13,7 +13,6 @@ NOR_DRIVERS = \
at91sam7.c \
avrf.c \
cfi.c \
- ecos.c \
em357.c \
faux.c \
lpc2000.c \
diff --git a/src/flash/nor/drivers.c b/src/flash/nor/drivers.c
index 06de0c66..746b55b8 100644
--- a/src/flash/nor/drivers.c
+++ b/src/flash/nor/drivers.c
@@ -37,7 +37,6 @@ extern struct flash_driver stm32f1x_flash;
extern struct flash_driver stm32f2x_flash;
extern struct flash_driver stm32lx_flash;
extern struct flash_driver tms470_flash;
-extern struct flash_driver ecosflash_flash;
extern struct flash_driver ocl_flash;
extern struct flash_driver pic32mx_flash;
extern struct flash_driver avr_flash;
@@ -69,7 +68,6 @@ static struct flash_driver *flash_drivers[] = {
&stm32f2x_flash,
&stm32lx_flash,
&tms470_flash,
- &ecosflash_flash,
&ocl_flash,
&pic32mx_flash,
&avr_flash,
diff --git a/src/flash/nor/ecos.c b/src/flash/nor/ecos.c
deleted file mode 100644
index c7458596..00000000
--- a/src/flash/nor/ecos.c
+++ /dev/null
@@ -1,425 +0,0 @@
-/***************************************************************************
- * Copyright (C) 2007,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 "imp.h"
-#include <target/embeddedice.h>
-#include <target/algorithm.h>
-#include <target/image.h>
-
-#if 0
-static uint32_t ecosflash_get_flash_status(struct flash_bank *bank);
-static void ecosflash_set_flash_mode(struct flash_bank *bank, int mode);
-static uint32_t ecosflash_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout);
-static int ecosflash_handle_gpnvm_command(struct command_context *cmd_ctx,
- char *cmd, char **args, int argc);
-#endif
-
-struct ecosflash_flash_bank {
- struct target *target;
- struct working_area *write_algorithm;
- struct working_area *erase_check_algorithm;
- char *driverPath;
- uint32_t start_address;
-};
-
-static const int sectorSize = 0x10000;
-
-char *flash_errmsg(int err);
-
-#ifndef __ECOS
-#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";
- }
-}
-#endif
-
-/* flash bank ecosflash <base> <size> <chip_width> <bus_width> <target#> <driverPath>
- */
-FLASH_BANK_COMMAND_HANDLER(ecosflash_flash_bank_command)
-{
- struct ecosflash_flash_bank *info;
-
- if (CMD_ARGC < 7)
- return ERROR_COMMAND_SYNTAX_ERROR;
-
- info = malloc(sizeof(struct ecosflash_flash_bank));
- if (info == NULL) {
- LOG_ERROR("no memory for flash bank info");
- exit(-1);
- }
- bank->driver_priv = info;
- info->driverPath = strdup(CMD_ARGV[6]);
-
- /* eCos flash sector sizes are not exposed to OpenOCD, use 0x10000 as
- * a way to improve impedance match between OpenOCD and eCos flash
- * driver.
- */
- int i = 0;
- uint32_t offset = 0;
- bank->num_sectors = bank->size/sectorSize;
- bank->sectors = malloc(sizeof(struct flash_sector) * 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(CMD_ARGV[5]);
- if (info->target == NULL) {
- LOG_ERROR("target '%s' not defined", CMD_ARGV[5]);
- return ERROR_FAIL;
- }
- return ERROR_OK;
-}
-
-static int loadDriver(struct ecosflash_flash_bank *info)
-{
- size_t buf_cnt;
- size_t image_size;
- struct image image;
-
- image.base_address_set = 0;
- image.start_address_set = 0;
- struct target *target = info->target;
- int retval;
-
- retval = image_open(&image, info->driverPath, NULL);
- if (retval != ERROR_OK)
- return retval;
-
- 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);
- retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt);
- if (retval != ERROR_OK) {
- free(buffer);
- image_close(&image);
- return retval;
- }
- target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);
- image_size += buf_cnt;
- LOG_DEBUG("%zu bytes written at address 0x%8.8" PRIx32 "",
- buf_cnt, image.sections[i].base_address);
-
- free(buffer);
- }
-
- image_close(&image);
-
- return ERROR_OK;
-}
-
-static int const OFFSET_ERASE;
-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;
-
-static int runCode(struct ecosflash_flash_bank *info,
- uint32_t codeStart, uint32_t codeStop, uint32_t r0, uint32_t r1, uint32_t r2,
- uint32_t *result,
- /* timeout in ms */
- int timeout)
-{
- struct target *target = info->target;
-
- struct reg_param reg_params[3];
- struct arm_algorithm armv4_5_info;
- armv4_5_info.common_magic = ARM_COMMON_MAGIC;
- armv4_5_info.core_mode = ARM_MODE_SVC;
- armv4_5_info.core_state = ARM_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 = target_run_algorithm(target, 0, NULL, 3, reg_params,
- codeStart, codeStop, timeout, &armv4_5_info);
- if (retval != ERROR_OK) {
- LOG_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;
-}
-
-static int eCosBoard_erase(struct ecosflash_flash_bank *info, uint32_t address, uint32_t len)
-{
- int retval;
- int timeout = (len / 20480 + 1) * 1000; /*asume 20 KB/s*/
-
- retval = loadDriver(info);
- if (retval != ERROR_OK)
- return retval;
-
- uint32_t 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) {
- LOG_ERROR("Flash erase failed with %d (%s)", (int)flashErr, flash_errmsg(flashErr));
- return ERROR_FAIL;
- }
-
- return ERROR_OK;
-}
-
-static int eCosBoard_flash(struct ecosflash_flash_bank *info,
- void *data,
- uint32_t address,
- uint32_t len)
-{
- struct target *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;
-
- uint32_t 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;
-
-
- uint32_t i;
- for (i = 0; i < len; i += chunk) {
- int t = len-i;
- if (t > chunk)
- t = chunk;
-
- retval = target_write_buffer(target, buffer, t, ((uint8_t *)data) + i);
- if (retval != ERROR_OK)
- return retval;
-
- uint32_t 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) {
- LOG_ERROR("Flash prog failed with %d (%s)", (int)flashErr,
- flash_errmsg(flashErr));
- return ERROR_FAIL;
- }
- }
- return ERROR_OK;
-}
-
-static int ecosflash_probe(struct flash_bank *bank)
-{
- return ERROR_OK;
-}
-
-#if 0
-static void command(struct flash_bank *bank, uint8_t cmd, uint8_t *cmd_buf)
-{
- struct ecosflash_flash_bank *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;
- }
-}
-#endif
-
-#if 0
-static uint32_t ecosflash_address(struct flash_bank *bank, uint32_t address)
-{
- uint32_t retval = 0;
- switch (bank->bus_width) {
- case 4:
- retval = address & 0xfffffffc;
- case 2:
- retval = address & 0xfffffffe;
- case 1:
- retval = address;
- }
-
- return retval + bank->base;
-}
-#endif
-
-static int ecosflash_erase(struct flash_bank *bank, int first, int last)
-{
- struct flash_bank *c = bank;
- struct ecosflash_flash_bank *info = bank->driver_priv;
- return eCosBoard_erase(info, c->base + first*sectorSize, sectorSize*(last-first + 1));
-}
-
-static int ecosflash_protect(struct flash_bank *bank, int set, int first, int last)
-{
- return ERROR_OK;
-}
-
-static int ecosflash_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
- uint32_t count)
-{
- struct ecosflash_flash_bank *info = bank->driver_priv;
- struct flash_bank *c = bank;
- return eCosBoard_flash(info, buffer, c->base + offset, count);
-}
-
-static int ecosflash_protect_check(struct flash_bank *bank)
-{
- return ERROR_OK;
-}
-
-static int ecosflash_info(struct flash_bank *bank, char *buf, int buf_size)
-{
- struct ecosflash_flash_bank *info = bank->driver_priv;
- snprintf(buf, buf_size, "eCos flash driver: %s", info->driverPath);
- return ERROR_OK;
-}
-
-#if 0
-static uint32_t ecosflash_get_flash_status(struct flash_bank *bank)
-{
- return ERROR_OK;
-}
-
-static void ecosflash_set_flash_mode(struct flash_bank *bank, int mode)
-{
-
-}
-
-static uint32_t ecosflash_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout)
-{
- return ERROR_OK;
-}
-
-static int ecosflash_handle_gpnvm_command(struct command_context *cmd_ctx,
- char *cmd,
- char **args,
- int argc)
-{
- return ERROR_OK;
-}
-#endif
-
-struct flash_driver ecosflash_flash = {
- .name = "ecosflash",
- .flash_bank_command = ecosflash_flash_bank_command,
- .erase = ecosflash_erase,
- .protect = ecosflash_protect,
- .write = ecosflash_write,
- .read = default_flash_read,
- .probe = ecosflash_probe,
- .auto_probe = ecosflash_probe,
- .erase_check = default_flash_blank_check,
- .protect_check = ecosflash_protect_check,
- .info = ecosflash_info
-};
diff --git a/src/helper/options.c b/src/helper/options.c
index e31066d7..98cd634b 100644
--- a/src/helper/options.c
+++ b/src/helper/options.c
@@ -60,8 +60,6 @@ static void add_default_dirs(void)
* Directory layout:
* bin\openocd.exe
* lib\openocd
- * event\at91eb40a_reset.cfg
- * target\at91eb40a.cfg
*/
{
char strExePath[MAX_PATH];
diff --git a/src/target/Makefile.am b/src/target/Makefile.am
index b98aacc0..19100c72 100644
--- a/src/target/Makefile.am
+++ b/src/target/Makefile.am
@@ -165,6 +165,6 @@ noinst_HEADERS = \
avr32_regs.h
ocddatadir = $(pkglibdir)
-nobase_dist_ocddata_DATA = ecos/at91eb40a.elf
+nobase_dist_ocddata_DATA =
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
diff --git a/src/target/ecos/at91eb40a.elf b/src/target/ecos/at91eb40a.elf
deleted file mode 100644
index 451657a5..00000000
--- a/src/target/ecos/at91eb40a.elf
+++ /dev/null
Binary files differ
diff --git a/tcl/board/at91eb40a.cfg b/tcl/board/at91eb40a.cfg
index 8b058731..d8a82a59 100644
--- a/tcl/board/at91eb40a.cfg
+++ b/tcl/board/at91eb40a.cfg
@@ -45,7 +45,7 @@ arm7_9 dcc_downloads enable
#flash driver
set _FLASHNAME $_CHIPNAME.flash
-flash bank $_FLASHNAME ecosflash 0x01000000 0x200000 2 2 $_TARGETNAME ecos/at91eb40a.elf
+flash bank $_FLASHNAME cfi 0x01000000 0x200000 2 2 $_TARGETNAME
# required for usable performance. Used for lots of
# other things than flash programming.
diff --git a/testing/testcases.html b/testing/testcases.html
index a3d65b91..a151e9f6 100644
--- a/testing/testcases.html
+++ b/testing/testcases.html
@@ -485,20 +485,6 @@ Note: these tests are not designed to test/debug the target, but to test functio
<td>Pass/Fail</td>
</tr>
<tr>
- <td><a name="FLA001"/>FLA001</td>
- <td>Fill in!</td>
- <td>Fill in!</td>
- <td>Flash probe</td>
- <td>Reset init is working</td>
- <td>On the telnet interface:<br>
- <code> > flash probe 0</code>
- </td>
- <td>The command should execute without error. The output should state the name of the flash and the starting address. An example of output:<br>
- <code>flash 'ecosflash' found at 0x01000000</code>
- </td>
- <td>PASS/FAIL</td>
- </tr>
- <tr>
<td><a name="FLA002"/>FLA002</td>
<td>Fill in!</td>
<td>Fill in!</td>