You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

114 lines
3.3 KiB

  1. echo "\n\nFirmware recovery helpers"
  2. echo "Use -c firmware_help to get help\n"
  3. set known_boards {
  4. "asus-rt-n16 ASUS RT-N16"
  5. "asus-rt-n66u ASUS RT-N66U"
  6. "linksys-wag200g Linksys WAG200G"
  7. "linksys-wrt54gl Linksys WRT54GL v1.1"
  8. "netgear-dg834v3 Netgear DG834G v3"
  9. "tp-link_tl-mr3020 TP-LINK TL-MR3020"
  10. "bt-homehubv1 BT HomeHub v1"
  11. }
  12. proc firmware_help { } {
  13. echo "
  14. Your OpenOCD command should look like this:
  15. openocd -f interface/<jtag adapter>.cfg -f tools/firmware-recovery.tcl -c \"<commands>*; shutdown\"
  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. 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 speed <freq> set JTAG clock frequency in kHz
  29. For example, to clear nvram and reflash CFE on an RT-N16 using TUMPA, run:
  30. openocd -f interface/ftdi/tumpa.cfg -f tools/firmware-recovery.tcl \\
  31. -c \"board asus-rt-n16; erase_part nvram; flash_part CFE cfe-n16.bin; shutdown\"
  32. \n\n"
  33. shutdown
  34. }
  35. # set default, can be overriden later
  36. adapter speed 1000
  37. proc get_partition { name } {
  38. global partition_list
  39. dict get $partition_list $name
  40. }
  41. proc partition_desc { name } { lindex [get_partition $name] 0 }
  42. proc partition_start { name } { lindex [get_partition $name] 1 }
  43. proc partition_size { name } { lindex [get_partition $name] 2 }
  44. proc list_boards { } {
  45. global known_boards
  46. echo "List of the supported boards:\n"
  47. echo "Board name\t\tDescription"
  48. echo "-----------------------------------"
  49. foreach i $known_boards {
  50. echo $i
  51. }
  52. echo "\n\n"
  53. }
  54. proc board { name } {
  55. script [find board/$name.cfg]
  56. }
  57. proc list_partitions { } {
  58. global partition_list
  59. set fstr "%-16s%-14s%-14s%s"
  60. echo "\nThe currently selected board is known to have these partitions:\n"
  61. echo [format $fstr Name Start Size Description]
  62. echo "-------------------------------------------------------"
  63. for {set i 0} {$i < [llength $partition_list]} {incr i 2} {
  64. set key [lindex $partition_list $i]
  65. echo [format $fstr $key [partition_start $key] [partition_size $key] [partition_desc $key]]
  66. }
  67. echo "\n\n"
  68. }
  69. # Magic to work with any targets, including semi-functional
  70. proc prepare_target { } {
  71. init
  72. catch {halt}
  73. catch {reset init}
  74. catch {halt}
  75. }
  76. proc dump_part { name filename } {
  77. prepare_target
  78. dump_image $filename [partition_start $name] [partition_size $name]
  79. }
  80. proc erase_part { name } {
  81. prepare_target
  82. flash erase_address [partition_start $name] [partition_size $name]
  83. }
  84. proc flash_part { name filename } {
  85. prepare_target
  86. flash write_image erase $filename [partition_start $name] bin
  87. echo "Verifying:"
  88. verify_image $filename [partition_start $name]
  89. }
  90. proc ram_boot { filename } {
  91. global ram_boot_address
  92. prepare_target
  93. load_image $filename $ram_boot_address bin
  94. resume $ram_boot_address
  95. }
  96. echo ""