diff --git a/mflash/flashloader/ramcode/mx1550.elf b/mflash/flashloader/ramcode/mx1550.elf new file mode 100644 index 0000000..d334599 Binary files /dev/null and b/mflash/flashloader/ramcode/mx1550.elf differ diff --git a/mflash/flashloader/scripts/cmd.tcl b/mflash/flashloader/scripts/cmd.tcl index 7e728e3..a8c110e 100644 --- a/mflash/flashloader/scripts/cmd.tcl +++ b/mflash/flashloader/scripts/cmd.tcl @@ -20,27 +20,37 @@ proc mflash_erase { addr size } { } proc mflash_write { file addr } { + set ffstr [string repeat \xff 4096] + set f [open $file r] set percent 0 set size [file size $file] set remain $size while {$remain > 0} { set n $($remain > $::mflash_buf_size ? $::mflash_buf_size : $remain) - mww $::MFLASH_CMD_LOC $::CMD_WRITE - mww $::MFLASH_ARG0_LOC $addr - mww $::MFLASH_ARG1_LOC $n - load_image_bin $file $($size - $remain) $::MFLASH_BUF_LOC $n - set remain $($remain - $n) - set addr $($addr + $n) - mflash_cmd_run 1000 + set data [read $f $n] + set need_download [string equal -length $n $data $ffstr] + if {$need_download == 0 } { + mww $::MFLASH_CMD_LOC $::CMD_WRITE + mww $::MFLASH_ARG0_LOC $addr + mww $::MFLASH_ARG1_LOC $n + load_image_bin $file $($size - $remain) $::MFLASH_BUF_LOC $n + + mflash_cmd_run 1000 + } + + set remain $($remain - $n) + set addr $($addr + $n) set percent_now $(($size - $remain) * 100 / $size) if { $percent_now > $percent } { set percent $percent_now puts "$percent%" } } + + close $f } proc mflash_read { file addr size } { @@ -86,4 +96,4 @@ proc mflash_unlock { } { mww $::MFLASH_CMD_LOC $::CMD_UNLOCK mflash_cmd_run 1000 -} \ No newline at end of file +} diff --git a/mflash/targets/mx1550.cfg b/mflash/targets/mx1550.cfg new file mode 100644 index 0000000..ddf76ec --- /dev/null +++ b/mflash/targets/mx1550.cfg @@ -0,0 +1,86 @@ +# +# OpenOCD setup script for mx1550 +# + +if { ![info exists CHIPNAME] } { + set CHIPNAME mx1550 +} + +if { ![info exists CPUTAPID] } { + set CPUTAPID 0x2ba01477 +} + +set T2_CHIP_VER {Unknown} + +proc mmio_rd {size addr} { + set val(0) 0 + mem2array val $size $addr 1 + return $val(0) +} + +proc mmio_wr {size addr val} { + set x(0) $val + array2mem x $size $addr 1 +} + +proc t2_detect_version {} { + global T2_CHIP_VER + set chipid [mmio_rd 32 0xfc016c] + set maskid [mmio_rd 8 0xfc0170] + + if {$chipid == [expr 0x790daf]} { + set T2_CHIP_VER {F1} + } else { + set chipid [mmio_rd 32 0xfc0170] + set maskid [mmio_rd 8 0xfc0174] + + if {$chipid == [expr 0x00790da0]} { + set T2_CHIP_VER {G0} + } elseif {$chipid == [expr 0x00790da1]} { + set T2_CHIP_VER {H0} + } else { + set T2_CHIP_VER [format "UNKNOWN:%08x:%02x" $chipid $maskid] + } + } +} + +proc t2_reset_pre {} { + # RESET_DEVICE: Sysrstreq = CPU RESET + mmio_wr 32 0xfc0104 8 + # CLKSEL=0 + mmio_wr 8 0xfc0106 0 +} + +proc t2_reset_end {} { + # Clear RESET_REASON (to give the apperance of a power-on reset) + mmio_wr 8 0xfc0100 0 +} + +adapter_khz 10000 +set _TARGETNAME $CHIPNAME.cpu + +swd newdap $CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $CPUTAPID +target create $_TARGETNAME cortex_m -endian little -chain-position $_TARGETNAME +#transport select jtag +#jtag newtap $CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $CPUTAPID + +#if { [llength [info commands dap]] == 0 } { + # OpenOCD version 0.10 and older that doesn't have a 'dap' command +# target create $CHIPNAME.cpu cortex_m -endian little -chain-position $CHIPNAME.cpu +#} else { + # Newer versions of OpenOCD needs the DAP created explicitly +# dap create $CHIPNAME.dap -chain-position $CHIPNAME.cpu +# target create $CHIPNAME.cpu cortex_m -endian little -dap $CHIPNAME.dap +#} + +$CHIPNAME.cpu configure -event examine-end { t2_detect_version } +$CHIPNAME.cpu configure -event reset-assert-pre { t2_reset_pre } +$CHIPNAME.cpu configure -event reset-end { t2_reset_end } + +cortex_m reset_config sysresetreq + +proc flash_alg_pre_init { } { + reset halt +} + +set FLASH_ALG_CONFIG_START 0x000000000004ad28 \ No newline at end of file