我今天从官方 Arch Linux 存储库安装了 Openocd,现在正尝试将它与我的 JTAG 适配器ULINK-ME一起使用。我发现ULINK-ME使用CMSIS-DAP调试固件。Openocd 有 CMSIS-DAP 驱动程序,因此应该能够与我的适配器通信,但是在我编写下面的命令后,我得到了一个错误。
我将 ULINK-ME 连接到集成了微控制器 LPC3141 的板EA3141 - 与我为其加载配置文件的 LPC3131 近亲。
sudo openocd -f /usr/local/share/openocd/scripts/interface/cmsis-dap.cfg -f /usr/local/share/openocd/scripts/target/lpc3131.cfg -d3
Open On-Chip Debugger 0.8.0-dev-00175-g8b7acca-dirty (2014-10-14-19:53)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
User : 13 1 command.c:549 command_print(): debug_level: 3
Debug: 14 1 configuration.c:45 add_script_search_dir(): adding /root/.openocd
Debug: 15 1 configuration.c:45 add_script_search_dir(): adding /usr/local/share/openocd/site
Debug: 16 1 configuration.c:45 add_script_search_dir(): adding /usr/local/share/openocd/scripts
Debug: 17 1 configuration.c:86 find_file(): found /usr/local/share/openocd/scripts/interface/cmsis-dap.cfg
Debug: 18 1 command.c:145 script_debug(): command - ocd_command ocd_command type ocd_interface cmsis-dap
Debug: 19 2 command.c:145 script_debug(): command - interface ocd_interface cmsis-dap
Debug: 21 2 command.c:369 register_command_handler(): registering 'ocd_cmsis-dap'...
Debug: 22 2 command.c:369 register_command_handler(): registering 'ocd_cmsis_dap_vid_pid'...
Debug: 23 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 24 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 25 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 26 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 27 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 28 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 29 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 30 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 31 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Info : 32 2 transport.c:118 allow_transports(): only one transport option; autoselect 'cmsis-dap'
Debug: 33 2 adi_v5_cmsis_dap.c:246 cmsis_dap_select(): CMSIS-ADI: cmsis_dap_select
Debug: 34 2 command.c:404 register_command(): command 'cmsis-dap' is already registered in '<global>' context
Debug: 35 2 command.c:369 register_command_handler(): registering 'ocd_cmsis-dap'...
Error: 36 7 cmsis_dap_usb.c:175 cmsis_dap_usb_open(): unable to open CMSIS-DAP device
Error: 37 7 adi_v5_cmsis_dap.c:266 cmsis_dap_select(): unable to init CMSIS-DAP driver
Error: 38 7 transport.c:83 transport_select(): Error selecting 'cmsis-dap' as transport
Debug: 39 7 command.c:631 run_command(): Command failed with error code -4
User : 40 7 command.c:669 command_run_line(): Runtime Error: /usr/local/share/openocd/scripts/interface/cmsis-dap.cfg:7:
in procedure 'script'
at file "embedded:startup.tcl", line 58
in procedure 'interface' called at file "/usr/local/share/openocd/scripts/interface/cmsis-dap.cfg", line 7
有谁知道我为什么会收到错误消息?
我也尝试以另一种方式启动它,但它再次打印错误。这次有点不同。
sudo openocd -c "interface cmsis-dap" -f /usr/local/share/openocd/scripts/target/lpc3131.cfg -d3
Open On-Chip Debugger 0.8.0-dev-00175-g8b7acca-dirty (2014-10-14-19:53)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
User : 13 2 command.c:549 command_print(): debug_level: 3
Debug: 14 2 configuration.c:45 add_script_search_dir(): adding /root/.openocd
Debug: 15 2 configuration.c:45 add_script_search_dir(): adding /usr/local/share/openocd/site
Debug: 16 2 configuration.c:45 add_script_search_dir(): adding /usr/local/share/openocd/scripts
Debug: 17 2 command.c:145 script_debug(): command - ocd_command ocd_command type ocd_interface cmsis-dap
Debug: 18 2 command.c:145 script_debug(): command - interface ocd_interface cmsis-dap
Debug: 20 2 command.c:369 register_command_handler(): registering 'ocd_cmsis-dap'...
Debug: 21 2 command.c:369 register_command_handler(): registering 'ocd_cmsis_dap_vid_pid'...
Debug: 22 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 23 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 24 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 25 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 26 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 27 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 28 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 29 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Debug: 30 2 command.c:369 register_command_handler(): registering 'ocd_jtag'...
Info : 31 2 transport.c:118 allow_transports(): only one transport option; autoselect 'cmsis-dap'
Debug: 32 2 adi_v5_cmsis_dap.c:246 cmsis_dap_select(): CMSIS-ADI: cmsis_dap_select
Debug: 33 2 command.c:404 register_command(): command 'cmsis-dap' is already registered in '<global>' context
Debug: 34 2 command.c:369 register_command_handler(): registering 'ocd_cmsis-dap'...
Error: 35 7 cmsis_dap_usb.c:175 cmsis_dap_usb_open(): unable to open CMSIS-DAP device
Error: 36 7 adi_v5_cmsis_dap.c:266 cmsis_dap_select(): unable to init CMSIS-DAP driver
Error: 37 7 transport.c:83 transport_select(): Error selecting 'cmsis-dap' as transport
Debug: 38 7 command.c:631 run_command(): Command failed with error code -4
User : 39 7 command.c:669 command_run_line(): in procedure 'interface'
更新:
ULINK-ME 的 `sudo lsusb -v 命令的输出是:
Bus 005 Device 018: ID c251:2721 Keil Software, Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0xc251 Keil Software, Inc.
idProduct 0x2721
bcdDevice 1.00
iManufacturer 4 Keil Software
iProduct 32 Keil ULINK-ME
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 41
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.00
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 25
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Device Status: 0x0000
(Bus Powered)
因为其中没有字符串“CMSIS-DAP”,我猜这意味着我有一个没有 CMSIS-DAP 固件的旧 ULINK-ME(2013 年之前购买)适配器。我希望 Keil 提供一些将 CMSIS-DAP 刷新到我的旧 ULINK-ME 的方法。
解决方案:
我写信给 Keil,他们声称 ULINK-ME 的固件可以更新,这是真的。他们向我指出了这三个链接:
2. - 如果 Keil uVision 在第 1 点中没有自行完成,则升级。
我必须在 Windows 机器上安装 MDK-ARM v5,然后单击工具栏上一个非常隐藏的图标(魔杖)。在调试中,我选择了 ULINK2/ME 选项,它自己更新了我的固件。现在我的 ULINK-ME(旧型号)上有一个 CMSIS-DAP,我可以通过以下方式确认sudo lsusb -v
:
Bus 005 Device 026: ID c251:2723 Keil Software, Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0xc251 Keil Software, Inc.
idProduct 0x2723
bcdDevice 1.00
iManufacturer 1 Keil Software
iProduct 2 Keil ULINK-ME CMSIS-DAP
iSerial 3 M0489MAE
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 41
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 4 CMSIS-DAP
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.00
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 33
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Device Status: 0x0000
(Bus Powered)
我尝试使用 Wine 来做到这一点,但这是不可能的。至少现在我不再需要 Windows。