Files
rtl8710_openocd/script/rtl8710.ocd

303 lines
12 KiB
Plaintext

source [find target/swj-dp.tcl]
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME rtl8710
}
if { [info exists ENDIAN] } {
set _ENDIAN $ENDIAN
} else {
set _ENDIAN little
}
if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE $WORKAREASIZE
} else {
set _WORKAREASIZE 0x800
}
if { [info exists CPUTAPID] } {
set _CPUTAPID $CPUTAPID
} else {
set _CPUTAPID 0x2ba01477
}
swd newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID
set _TARGETNAME $_CHIPNAME.cpu
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap
# todo: get work area from makefile
$_TARGETNAME configure -work-area-phys 0x10001500 -work-area-size $_WORKAREASIZE -work-area-backup 0
adapter speed 4000
adapter srst delay 100
if {![using_hla]} {
cortex_m reset_config sysresetreq
}
$_TARGETNAME configure -event reset-init {amebaz_init}
set rtl8710_flasher_firmware_ptr 0x10001500
set rtl8710_flasher_buffer 0x10008000
set rtl8710_flasher_buffer_size 204800
set rtl8710_flasher_sector_size 4096
set rtl8710_flasher_code [list 0x489fe92d 0x2300b673 0xf04f9303 0x4e604380 0x3210f8d3 0x0f10f013 0x485ed001 0x4c5e47b0 0x4f5f4d5e 0xf44f2200 0x20107180 0x4b5d47a0 0x47982000 0xf44f2201 0x20107180 0x220147a0 0x4b592100 0x200a4c59 0x4b594798 0x47984628 0x20024b58 0xf8954798 0xaa030049 0x47a02103 0x300ef89d 0x200df89d 0x100cf89d 0x47b04852 0x48526829 0x68ab47b0 0x7929796a 0x47b04850 0x7f6a7feb 0x93007f29 0x7fab484e 0x4b4e47b0 0x201c2100 0x484d4798 0x46a147b0 0xf04f4c4c 0xf8c40a00 0x6823a000 0x6863b193 0xd86c2b05 0xf852a201 0xbf00f023 0x100015d5 0x100015e5 0x100015f3 0x10001619 0x1000161d 0x10001685 0xe7e8bf00 0x0049f895 0x2104aa03 0x9b0347c8 0xe7de60e3 0x46082100 0x47984b3a 0x47b0483a 0x6921e7d7 0x20024b37 0xe7d24798 0xf1026922 0x58d16200 0x5280f103 0x4200f502 0x62113304 0x429a6962 0xe7c4d8f2 0xe7f92300 0x482f6961 0xf8df6922 0x47b0b0bc 0x0800f04f 0x45436963 0x482cd801 0x6920e7db 0x0207eb08 0x21044440 0xf10847d8 0xe7f10804 0x0820f108 0x45436963 0x6963d9a7 0x0308eba3 0xbf982b04 0x69206962 0xf1004b21 0xbf946000 0x0208eba2 0xeb082204 0x44400107 0x28004798 0x2301d0e6 0xf8c460a3 0xe78e800c 0x0800f04f 0x2301e7e0 0xe78860a3 0x000004dd 0x10001748 0x00009b65 0x10000dec 0x10008020 0x00007d15 0x000042fd 0x00007465 0x00007b81 0x00007ca1 0x10001778 0x1000179b 0x100017b3 0x100017e6 0x0000784d 0x1000181e 0x10008000 0x00007755 0x10001840 0x10001865 0x00007661 0x1000189c 0x100016ed 0xb4302a03 0xea41d912 0x07a40400 0x460b4684 0x4619d121 0xf8534660 0xf85c4b04 0x42a55b04 0x3a04d119 0xd8f42a03 0x46194660 0xb17a1e54 0x39011e43 0xe0011902 0xd009429a 0x0f01f813 0xcf01f811 0xd0f74560 0x000ceba0 0x4770bc30 0xbc302000 0x1e544770 0xbf00e7ea 0x414c465b 0x52454853 0x6c46205d 0x20687361 0x69726570 0x72656870 0x61206c61 0x6165726c 0x65207964 0x6c62616e 0x2e2e6465 0x000a3f2e 0x414c465b 0x205d4853 0x69766544 0x49206563 0x25203a44 0x20583230 0x58323025 0x32302520 0x5b000a58 0x53414c46 0x56205d48 0x6f646e65 0x30203a72 0x38302578 0x5b000a58 0x53414c46 0x43205d48 0x69666e6f 0x4d203a67 0x3d65646f 0x202c6425 0x636f6c43 0x64253d6b 0x6552202c 0x6d436461 0x78303d64 0x58323025 0x465b000a 0x4853414c 0x6954205d 0x676e696d 0x6153203a 0x656c706d 0x616c6544 0x64253d79 0x7544202c 0x43796d6d 0x656c6379 0x255b3d73 0x64252c64 0x5d64252c 0x465b000a 0x4853414c 0x6c42205d 0x206b636f 0x746f7270 0x69746365 0x63206e6f 0x7261656c 0x000a6465 0x414c465b 0x52454853 0x7546205d 0x63206c6c 0x20706968 0x73617265 0x6f632065 0x656c706d 0x0a646574 0x4c465b00 0x45485341 0x53205d52 0x74726174 0x20676e69 0x74697277 0x666f2065 0x20642520 0x65747962 0x74612073 0x66666f20 0x20746573 0x30257830 0x000a5838 0x414c465b 0x52454853 0x7257205d 0x20657469 0x706d6f63 0x6574656c 0x75732064 0x73656363 0x6c756673 0x000a796c ]
set rtl8710_flasher_command_read_id 0
set rtl8710_flasher_command_mass_erase 1
set rtl8710_flasher_command_sector_erase 2
set rtl8710_flasher_command_read 3
set rtl8710_flasher_command_write 4
set rtl8710_flasher_command_verify 5
set rtl8710_flasher_mac_address_offset 0xA088
set rtl8710_flasher_ready 0
set rtl8710_flasher_capacity 0
set rtl8710_flasher_auto_erase 0
set rtl8710_flasher_auto_verify 0
set rtl8710_flasher_auto_erase_sector 0xFFFFFFFF
proc rtl8710_flasher_init {} {
global rtl8710_flasher_ready rtl8710_flasher_firmware_ptr
global rtl8710_flasher_buffer rtl8710_flasher_capacity
global rtl8710_flasher_code
if {!$rtl8710_flasher_ready} {
set buf_ctrl [expr {$rtl8710_flasher_buffer + 0x00}]
set buf_status [expr {$rtl8710_flasher_buffer + 0x08}]
set buf_id [expr {$rtl8710_flasher_buffer + 0x0C}]
halt
# init buffer control regs
mww $buf_status 0
mww $buf_ctrl 1
# load and start flasher
write_memory $rtl8710_flasher_firmware_ptr 32 $rtl8710_flasher_code
reg faultmask 1
reg sp 0x1003ef00
reg pc $rtl8710_flasher_firmware_ptr
resume
rtl8710_flasher_wait
set id [rtl8710_flasher_mrw $buf_id]
set rtl8710_flasher_capacity [expr {1 << (($id >> 16) & 0xFF)}]
set rtl8710_flasher_ready 1
}
}
proc rtl8710_flasher_mrw {reg} {
read_memory $reg 32 1
}
proc rtl8710_flasher_wait {} {
global rtl8710_flasher_buffer
set addr [expr {$rtl8710_flasher_buffer + 0x00}]
while {[rtl8710_flasher_mrw $addr]} {}
}
proc rtl8710_flasher_load_block {local_filename offset length} {
global rtl8710_flasher_buffer
set buffer_addr [expr {$rtl8710_flasher_buffer + 0x20}]
load_image $local_filename [expr {$buffer_addr - $offset}] bin $buffer_addr $length
}
proc rtl8710_flasher_block {command offset len} {
global rtl8710_flasher_buffer
global rtl8710_flasher_command_read rtl8710_flasher_command_write rtl8710_flasher_command_verify
# select command type
switch $command {
"read" {set cmd_type $rtl8710_flasher_command_read}
"write" {set cmd_type $rtl8710_flasher_command_write}
"verify" {set cmd_type $rtl8710_flasher_command_verify}
default {error "Unknown command type: $command"}
}
mww [expr {$rtl8710_flasher_buffer + 0x04}] $cmd_type
mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000
mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset
mww [expr {$rtl8710_flasher_buffer + 0x14}] $len
mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001
rtl8710_flasher_wait
set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x08}]]
if {[expr {$status > 0}]} {
if {$command eq "verify"} {
set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x0C}]]
set status [expr {$status + $offset}]
}
error "$command error, offset $status"
}
}
proc rtl8710_flasher_read_block {offset len} {
rtl8710_flasher_block "read" $offset $len
}
proc rtl8710_flasher_write_block {offset len} {
rtl8710_flasher_block "write" $offset $len
}
proc rtl8710_flasher_verify_block {offset len} {
rtl8710_flasher_block "verify" $offset $len
}
proc rtl8710_flash_read_id {} {
global rtl8710_flasher_buffer rtl8710_flasher_capacity
global rtl8710_flasher_command_read_id
rtl8710_flasher_init
# send read ID command
mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_read_id
mww [expr {$rtl8710_flasher_buffer + 0x08}] 0
mww [expr {$rtl8710_flasher_buffer + 0x00}] 1
rtl8710_flasher_wait
set id [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x0C}]]
set manufacturer_id [format "0x%02X" [expr {$id & 0xFF}]]
set memory_type [format "0x%02X" [expr {($id >> 8) & 0xFF}]]
set memory_capacity [expr {2 ** (($id >> 16) & 0xFF)}]
echo "manufacturer ID: $manufacturer_id, memory type: $memory_type, memory capacity: $memory_capacity bytes"
}
proc rtl8710_flash_erase {type {offset 0}} {
global rtl8710_flasher_buffer
global rtl8710_flasher_command_mass_erase rtl8710_flasher_command_sector_erase
rtl8710_flasher_init
if {$type eq "mass"} {
set cmd $rtl8710_flasher_command_mass_erase
} elseif {$type eq "sector"} {
set cmd $rtl8710_flasher_command_sector_erase
mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset
} else {
error "Unknown erase type: $type"
}
mww [expr {$rtl8710_flasher_buffer + 0x04}] $cmd
mww [expr {$rtl8710_flasher_buffer + 0x08}] 0
mww [expr {$rtl8710_flasher_buffer + 0x00}] 1
rtl8710_flasher_wait
}
proc rtl8710_flash_mass_erase {} {
rtl8710_flash_erase "mass"
}
proc rtl8710_flash_sector_erase {offset} {
rtl8710_flash_erase "sector" $offset
}
proc rtl8710_flash_read {local_filename loc size} {
global rtl8710_flasher_buffer rtl8710_flasher_buffer_size
rtl8710_flasher_init
set tmp "/tmp/_rtl8710_flasher.bin"
for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} {
set len [expr {($size - $offset) < $rtl8710_flasher_buffer_size ? ($size - $offset) : $rtl8710_flasher_buffer_size}]
set flash_offset [expr {$loc + $offset}]
echo "read $flash_offset"
rtl8710_flasher_read_block $flash_offset $len
dump_image $tmp [expr {$rtl8710_flasher_buffer + 0x20}] $len
exec dd conv=notrunc if=$tmp of=$local_filename bs=1 seek=$offset
echo "read $len bytes"
}
file delete -force $tmp
}
proc rtl8710_flash_write {local_filename loc} {
global rtl8710_flasher_buffer_size rtl8710_flasher_sector_size
global rtl8710_flasher_auto_erase rtl8710_flasher_auto_verify
global rtl8710_flasher_auto_erase_sector
rtl8710_flasher_init
set size [file size $local_filename]
for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} {
set len [expr {($size - $offset) < $rtl8710_flasher_buffer_size ? ($size - $offset) : $rtl8710_flasher_buffer_size}]
set flash_offset [expr {$loc + $offset}]
echo "write offset $flash_offset"
rtl8710_flasher_load_block $local_filename $offset $len
if {$rtl8710_flasher_auto_erase} {
set start_sector [expr {$flash_offset / $rtl8710_flasher_sector_size}]
set end_sector [expr {($flash_offset + $len - 1) / $rtl8710_flasher_sector_size}]
# erase any new sectors we encounter
for {set sector $start_sector} {$sector <= $end_sector} {incr sector} {
if {$rtl8710_flasher_auto_erase_sector != $sector} {
echo "erase sector $sector"
rtl8710_flash_sector_erase [expr {$sector * $rtl8710_flasher_sector_size}]
set rtl8710_flasher_auto_erase_sector $sector
}
}
}
rtl8710_flasher_write_block $flash_offset $len
echo "wrote $len bytes"
if {$rtl8710_flasher_auto_verify} {
echo "verify offset $flash_offset"
rtl8710_flasher_verify_block $flash_offset $len
}
}
}
proc rtl8710_flash_verify {local_filename loc} {
global rtl8710_flasher_buffer_size
rtl8710_flasher_init
set size [file size $local_filename]
for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} {
set len [expr {$size - $offset}]
if {[expr {$len > $rtl8710_flasher_buffer_size}]} {
set len $rtl8710_flasher_buffer_size
}
set flash_offset [expr {$loc + $offset}]
echo "read offset $flash_offset"
rtl8710_flasher_load_block $local_filename $offset $len
echo "verify offset $flash_offset"
rtl8710_flasher_verify_block $flash_offset $len
}
}
proc rtl8710_flash_read_mac {} {
global rtl8710_flasher_mac_address_offset rtl8710_flasher_buffer
rtl8710_flasher_init
rtl8710_flasher_read_block $rtl8710_flasher_mac_address_offset 6
set mac [read_memory [expr {$rtl8710_flasher_buffer + 0x20}] 8 6]
set mac_str [join [lmap byte $mac {format %02X $byte}] ":"]
echo "MAC address: $mac_str"
}
proc rtl8710_flash_auto_erase {on} {
global rtl8710_flasher_auto_erase
set rtl8710_flasher_auto_erase [expr {$on != 0}]
echo "auto erase [expr {$on ? "on" : "off"}]"
}
proc rtl8710_flash_auto_verify {on} {
global rtl8710_flasher_auto_verify
set rtl8710_flasher_auto_verify [expr {$on != 0}]
echo "auto verify [expr {$on ? "on" : "off"}]"
}
proc rtl8710_reboot {} {
mww 0xE000ED0C 0x05FA0007
}