]> git.gag.com Git - fw/openocd/blob - tcl/tools/firmware-recovery.tcl
doc: Add Gerrit to the Developer resources section
[fw/openocd] / tcl / tools / firmware-recovery.tcl
1 echo "\n\nFirmware recovery helpers"
2 echo "Use -c firmware_help to get help\n"
3
4 set known_boards {
5     "asus-rt-n16                ASUS RT-N16"
6     "linksys-wrt54gl            Linksys WRT54GL v1.1"
7     "netgear-dg834v3            Netgear DG834G v3"
8 }
9
10 proc firmware_help { } {
11     echo "
12 Your OpenOCD command should look like this:
13 openocd -f interface/<jtag adapter>.cfg -f tools/firmware-recovery.tcl -c \"<commands>*; shutdown\"
14
15 Where:
16 <jtag adapter> is one of the supported devices, e.g. ftdi/jtagkey2
17 <commands> are firmware-recovery commands separated by semicolon
18
19 Supported commands:
20 firmware_help                   get this help
21 list_boards                     list known boards and exit
22 board <name>                    select board you work with
23 list_partitions                 list partitions of the currently selected board
24 dump_part <name> <filename>     save partition's contents to a file
25 erase_part <name>               erase the given partition
26 flash_part <name> <filename>    erase, flash and verify the given partition
27 ram_boot <filename>             load binary file to RAM and run it
28 adapter_khz <freq>              set JTAG clock frequency in kHz
29
30 For example, to clear nvram and reflash CFE on an RT-N16 using TUMPA, run:
31 openocd -f interface/ftdi/tumpa.cfg -f tools/firmware-recovery.tcl \\
32         -c \"board asus-rt-n16; erase_part nvram; flash_part CFE cfe-n16.bin; shutdown\"
33 \n\n"
34     shutdown
35 }
36
37 # set default, can be overriden later
38 adapter_khz 1000
39
40 proc get_partition { name } {
41     global partition_list
42     dict get $partition_list $name
43 }
44
45 proc partition_desc { name } { lindex [get_partition $name] 0 }
46 proc partition_start { name } { lindex [get_partition $name] 1 }
47 proc partition_size { name } { lindex [get_partition $name] 2 }
48
49 proc list_boards { } {
50     global known_boards
51     echo "List of the supported boards:\n"
52     echo "Board name\t\tDescription"
53     echo "-----------------------------------"
54     foreach i $known_boards {
55         echo $i
56     }
57     echo "\n\n"
58 }
59
60 proc board { name } {
61     script [find board/$name.cfg]
62 }
63
64 proc list_partitions { } {
65     global partition_list
66     set fstr "%-16s%-14s%-14s%s"
67     echo "\nThe currently selected board is known to have these partitions:\n"
68     echo [format $fstr Name Start Size Description]
69     echo "-------------------------------------------------------"
70     for {set i 0} {$i < [llength $partition_list]} {incr i 2} {
71         set key [lindex $partition_list $i]
72         echo [format $fstr $key [partition_start $key] [partition_size $key] [partition_desc $key]]
73     }
74     echo "\n\n"
75 }
76
77 # Magic to work with any targets, including semi-functional
78 proc prepare_target { } {
79     init
80     catch {halt}
81     catch {reset init}
82     catch {halt}
83 }
84
85 proc dump_part { name filename } {
86     prepare_target
87     dump_image $filename [partition_start $name] [partition_size $name]
88 }
89
90 proc erase_part { name } {
91     prepare_target
92     flash erase_address [partition_start $name] [partition_size $name]
93 }
94
95 proc flash_part { name filename } {
96     prepare_target
97     flash write_image erase $filename [partition_start $name] bin
98     echo "Verifying:"
99     verify_image $filename [partition_start $name]
100 }
101
102 proc ram_boot { filename } {
103     global ram_boot_address
104     prepare_target
105     load_image $filename $ram_boot_address bin
106     resume $ram_boot_address
107 }
108
109 echo ""