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