FAQ

How to fix libusb_open() failed with LIBUSB_ERROR_ACCESS when running OpenOCD?

If you seeing a log like this:

Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2
For bug reports, read
  http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 2000 kHz
adapter_nsrst_delay: 100
none separate
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : clock speed 1800 kHz
Error: libusb_open() failed with LIBUSB_ERROR_ACCESS
Error: open failed
in procedure 'init'
in procedure 'ocd_bouncer'

Solution is to either re-run OpenOCD with sudo, as described in How to run OpenOCD with root privileges under Nix shell? section, or configure udev to let OpenOCD connect without requiring root privileges, using Running OpenOCD without root privileges guide.

I get plain Error: open failed when running OpenOCD with my STM32F4 Discovery board. What should I do?

Most likely, you are running wrong OpenOCD script. Log in that case may look like this:

$ openocd -f board/stm32f4discovery.cfg
Open On-Chip Debugger 0.9.0 (2018-01-24-01:05)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 2000 kHz
adapter_nsrst_delay: 100
none separate
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : clock speed 1800 kHz
Error: open failed
in procedure 'init'
in procedure 'ocd_bouncer'

Solution is to run appropriate OpenOCD script:

  1. Determine the board revision using How to check STM32F4 Discovery board revision? section.

  2. Run correct script.

    For old STM32F407G boards, with STLINK/V2:

    openocd -f board/stm32f4discovery.cfg
    

    For new STM32F407G-DISC1 boards, with STLINK/V2.1:

    openocd -f board/stm32f429disc1.cfg
    

How to run OpenOCD with root privileges under Nix shell?

Nix modifies the PATH environment variable. But running sudo, drops PATH environment variable, so you need a full path to executable, installed by Nix.

Thus, instead of running:

sudo openocd [openocd_arguments]

You should run:

sudo $(which openocd) [openocd_arguments]

How to run arbitrary command with root privileges under Nix shell?

Approach is similar, as in How to run OpenOCD with root privileges under Nix shell? section. Suppose you want to run command called foo, you need to execute:

sudo $(which foo) [foo_arguments]

How to run OpenOCD without root privileges?

Complete the Running OpenOCD without root privileges guide.

How to check STM32F4 Discovery board revision?

Run lsusb in your console.

For old Discovery board with ST-LINK/V2, you should see:

Bus 002 Device 125: ID 0483:3748 STMicroelectronics ST-LINK/V2

For new Discovery board with ST-LINK/V2-A (labeled as STM32F407G-DISC1):

Bus 001 Device 002: ID 0483:374b STMicroelectronics ST-LINK/V2.1 (Nucleo-F103RB)