JLINK刷写Proxmark3固件

来自RadioWar Wiki
跳转至: 导航搜索
  请注意,以下操作是基于Proxmark3因bootrom部分固件出现问题、或bootrom部分固件发生重大更新,需要使用J-link等工具通过JTAG接口进行bootrom部分固件刷写修复。
  平常的固件更新只需按住Proxmark3按钮,连上计算机,使用计算机上的flasher工具更新fpgaimage和osimage部分固件即可。

Windows下使用J-link官方驱动刷写固件

因为高版本的驱动和固件包加了验证,会导致一些稳定问题。这里推荐安装较低版本的驱动(JLinkARM_V428c驱动下载

安装完成后,打开j-flash ARM,如果有提示更新,确认跟新即可。

1、旧版本(原版)Proxmark3(不带电池,有标准的20PIN接口),用V8标准的20PIN的连接线连接Jlink与Proxmark3, 同时Proxmark3也要接入USB以供电。

2、新版本(定制版)Proxmark3(带电池,只有SV3接口)按照以下方法连接。

①:新版PM3的SV3接口的定义(左图),以及(右图)Jlink的接口定义。

Bb.jpg20PIN.jpg

Jlink V8 水平放,右上角第一个接口编号1,右下第一个编号2(下图)

Pai.jpg

②:拆下PM3的外壳,将排线连接好排针,插入PM3的SV3接口(可以将插入的排针用手按压弯曲,让排针与PM3接触更牢固)

③:参照①的图示,VCC—1 ;GND—4 ;TCK—9;TDO—13;TDI—5;TMS—7 。

3、打开软件j-flash ARM,然后选择Options-Project settings

Jtag01.jpg

选择Proxmark3的芯片CPU-Device选择Atmel AT91SAM7S256,Clock speed选择为Auto detection,其它默认确定保存

Jtag02.jpg

连接设备Target-Connect,连接成功这时proxmark3板上4个指示灯同时亮起。

Jtag03.jpg

不管是第一次烧录还是重新烧录最好是清除一次芯片数据,选择Target-Erase chip

Jtag04.jpg

选择烧录的文件File-Open data file

Jtag05.jpg

选择bootrom文件(elf.s19都可以)

Jtag06.jpg

图为最新编译的537版本

Jtag07.jpg

开始烧录Target-Auto烧录成功断电,取掉jlink重新通电,会识别出新硬件更新为proxmark3的驱动然后用USB更新其它两个Firmware就可以了。

Jtag08.jpg


在Linux下使用J-link和openocd刷写固件

  • 测试环境:64位Archlinux(20130422) J-link v4.08
openocd对J-link有版本限制,openocd v6.0能正常使用的最高J-link版本为v4.46f,切勿盲目升级J-link


在archlinux下安装openocd

 sudo pacman -Syu openocd


使用udev更改j-link设备权限

将以下文本保存更名为45-jlink.rules,复制到/etc/udev/rules.d/

\BUS!="usb", ACTION!="add", SUBSYSTEM!=="usb_device", GOTO="kcontrol_rules_end"
# Give owner and group "rw" (MODE=66) access. Give all users "r" (MODE=4) access.
ATTRS{idProduct}=="0101", ATTRS{idVendor}=="1366", MODE="664", GROUP="plugdev"
ATTRS{idProduct}=="0102", ATTRS{idVendor}=="1366", MODE="664", GROUP="plugdev"
ATTRS{idProduct}=="0103", ATTRS{idVendor}=="1366", MODE="664", GROUP="plugdev"
ATTRS{idProduct}=="0104", ATTRS{idVendor}=="1366", MODE="664", GROUP="plugdev"
# J-Link OBs with CDC functionality
ATTRS{idProduct}=="0105", ATTRS{idVendor}=="1366", MODE="664", GROUP="plugdev"
LABEL="kcontrol_rules_end"


配置openocd

将以下文本保存更名为proxmark3-jlink.cfg

#code start#
telnet_port 4444
gdb_port 3333
interface jlink
adapter_khz 12000

reset_config srst_only srst_pulls_trst

if { [info exists CHIPNAME] } {
  set _CHIPNAME $CHIPNAME
} else {
  set _CHIPNAME sam7x256
}

if { [info exists ENDIAN] } {
  set _ENDIAN $ENDIAN
} else {
  set _ENDIAN little
}

if { [info exists CPUTAPID] } {
  set _CPUTAPID $CPUTAPID
} else {
  set _CPUTAPID 0x3f0f0f0f
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
#jtag newtap xilinx tap -irlen 6 -ircapture 0x1 -irmask 0xf -expected-id 0x1c1a093
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi

$_TARGETNAME configure -event reset-init {
       soft_reset_halt
       # RSTC_CR: Reset peripherals
       mww 0xfffffd00 0xa5000004
   # WDT_MR: disable watchdog
   mww 0xfffffd44 0x00008000
   # RSTC_MR: enable user reset
   mww 0xfffffd08 0xa5000001
   # CKGR_MOR: enable the main oscillator
   mww 0xfffffc20 0x00000601
   sleep 10
   # CKGR_PLLR:  16 MHz * (5+1) /1 = 96Mhz
   mww 0xfffffc2c 0x00051c01
   sleep 10
   # PMC_MCKR : MCK = PLL / 2 = 48 MHz
   mww 0xfffffc30 0x00000007
   sleep 10
   # MC_FMR: flash mode (FWS=1,FMCN=60)
   mww 0xffffff60 0x003c0100
   sleep 100
}
gdb_memory_map enable
$_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x00200000 -work-area-size 0x10000 -work-area-backup 0
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME at91sam7 0 0 0 0 $_TARGETNAME 0 0 0 0 0 0 0 18432
#flash bank at91sam7 0 0 0 0 0

启动openocd

接上J-link和proxmark,在刚刚保存proxmark3-jlink.cfg的目录下执行


openocd -f proxmark3-jlink.cfg


如果一切顺利,终端会出现以下输出


Open On-Chip Debugger 0.6.1 (2012-12-01-10:12)
Licensed under GNU GPL v2
For bug reports, read
   http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 12000 kHz
srst_only srst_pulls_trst srst_gates_jtag srst_open_drain
Info : J-Link initialization started / target CPU reset initiated
Info : J-Link ARM V8 compiled Dec  1 2009 11:42:48
Info : J-Link caps 0xb9ff7bbf
Info : J-Link hw version 80000
Info : J-Link hw type J-Link
Info : J-Link max mem block 9576
Info : J-Link configuration
Info : USB-Address: 0xff
Info : Kickstart power on JTAG-pin 19: 0x0
Info : Vref = 3.319 TCK = 1 TDI = 0 TDO = 0 TMS = 0 SRST = 0 TRST = 0
Info : J-Link JTAG Interface ready
Info : clock speed 12000 kHz
Info : JTAG tap: sam7x256.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3)
Info : Embedded ICE version 1
Info : sam7x256.cpu: hardware has 2 breakpoint/watchpoint units

刷写bootrom

新开一个终端,连接openocd的控制端口4444

telnet localhost 4444


如果一切顺利,终端会产生以下输出


Trying ::1...
Connection failed: Connection refused
Trying ::1...
Connection failed: Connection refused
Trying ::1...
Connection failed: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> 

让目标板停止工作

halt

清除全部数据

flash erase_sector 0 0 last

写入新数据

flash write_image /foo/bar/bootrom.elf 0 elf


大功告成

关闭telnet终端,关闭openocd服务端,拔掉J-link,拔掉proxmark,然后重新连接proxmark,用flasher更新fpgaimage和osimage吧!

在Linux下使用Wiggler和openocd刷写固件

Wiggler价格比J-link便宜,配置比J-link要简单,且不存在固件误升级问题 以下附上openocd配置文件


telnet_port 4444
gdb_port 3333

interface parport
parport_port 0x378
parport_cable wiggler
jtag_speed 0
jtag_nsrst_delay 200
jtag_ntrst_delay 200

reset_config srst_only srst_pulls_trst

jtag newtap sam7x256 cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x3f0f0f0f
#jtag newtap xilinx tap -irlen 6 -ircapture 0x1 -irmask 0xf -expected-id 0x1c1a093

target create sam7x256.cpu arm7tdmi -endian little -chain-position sam7x256.cpu -variant arm7tdmi
sam7x256.cpu configure -event reset-init {
   # disable watchdog
   mww 0xfffffd44 0x00008000
   # enable user reset
   mww 0xfffffd08 0xa5000001
   # CKGR_MOR : enable the main oscillator
   mww 0xfffffc20 0x00000601
   sleep 10
   # CKGR_PLLR:  16 MHz * (5+1) /1 = 96Mhz
   mww 0xfffffc2c 0x00051c01
   sleep 10
   # PMC_MCKR : MCK = PLL / 2 = 48 MHz
   mww 0xfffffc30 0x00000007
   sleep 10
   # MC_FMR: flash mode (FWS=1,FMCN=60)
   mww 0xffffff60 0x003c0100
   sleep 100
}

gdb_memory_map enable

sam7x256.cpu configure -work-area-virt 0 -work-area-phys 0x00200000 -work-area-size 0x10000 -work-area-backup 0
flash bank at91sam7 0 0 0 0 0