title: JTAG adapter ULINK-ME and openocd (on ArchLinux)
body: <p>I installed Openocd from opfficial Arch Linux repositories today and am now trying to use it with my JTAG adapter <a href="http://www.keil.com/support/man/docs/ulinkme/ulinkme_su_connecting.htm" rel="nofollow">ULINK-ME</a>. I found out that ULINK-ME uses CMSIS-DAP debugging firmware. Openocd has CMSIS-DAP drivers and should therefore be able to communicate with my adapter but after I wrote the command below I got an error. </p>
  
  <p>I am connecting ULINK-ME to the board <a href="http://www.embeddedartists.com/products/kits/lpc3141_kit.php" rel="nofollow">EA3141</a> which integrates microcontroller LPC3141 - a close relative to LPC3131 for whom I load the configuration file.</p>
  
  <pre><code>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 '&lt;global&gt;' 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
  </code></pre>
  
  <p>Does anyone know why I get the errors?</p>
  
  <hr>
  
  <p>I allso tried to start it in another way but again it prints errors. A bit difrently this time.</p>
  
  <pre><code>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 '&lt;global&gt;' 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'
  </code></pre>
  
  <hr>
  
  <p><strong>UPDATE:</strong></p>
  
  <p>Output of the `sudo lsusb -v command for ULINK-ME is: </p>
  
  <pre><code>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)
  </code></pre>
  
  <p>Because there is no string "CMSIS-DAP" in it I guess it means that I have an older ULINK-ME (bought before 2013) adapter which didn't have CMSIS-DAP firmware. I hope Keil offers some way of flashing CMSIS-DAP to my older ULINK-ME.</p>
  
  <hr>
  
  <p><strong>SOLUTION:</strong></p>
  
  <p>I wrote to Keil and they claimed that ULINK-ME's firmware can be updated and it is true. They pointed me to these three links: </p>
  
  <p><a href="http://www.keil.com/support/man/docs/ulink2/ulink2_boot_mode.htm" rel="nofollow">1. - check serial number</a></p>
  
  <p><a href="http://www.keil.com/support/man/docs/ulink2/ulink2_fw_upgrade.htm" rel="nofollow">2. - upgrade if Keil uVision hasn't done this by itself in point 1.</a></p>
  
  <p><a href="http://www.keil.com/support/man/docs/ulink2/ulink2_ctx_debugdrivercfg.htm" rel="nofollow">3. - manipulate your ULINK-ME even further</a></p>
  
  <p>I had to install MDK-ARM v5 on a Windows machine and then click on a very hidden icon (a magic wand) on a toolbar. There under debugging I chose the ULINK2/ME option and it updated my firmware by itself. Now I have a CMSIS-DAP on my ULINK-ME (older model) and I can confirm this with <code>sudo lsusb -v</code>: </p>
  
  <pre><code>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)
  </code></pre>
  
  <p>I tried to do this using Wine, but it wasn't possible. At least now I don't need Windows any more. </p>