--- /dev/null
+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)
--- /dev/null
+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
--- /dev/null
+/***************************************************************************\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(®_params[0], "r0", 32, PARAM_IN_OUT);\r
+ init_reg_param(®_params[1], "r1", 32, PARAM_OUT);\r
+ init_reg_param(®_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(®_params[0]);\r
+ destroy_reg_param(®_params[1]);\r
+ destroy_reg_param(®_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