1

Some devs on our team have J-Link debuggers while others are working with ST-Link debuggers. All of us work on the same hardware with the same firmware, basically everything else is the same. The current setup requires to start OpenOCD with a different cfg file for each adapter. I would like to have this done automatically.

Is there a way to configure OpenOCD to automatically choose the correct cfg file based on the connected adapter?

Frant
  • 5,382
  • 1
  • 16
  • 22
Vlad
  • 25
  • 4
  • 1
    Are you developing on Windows or Linux ? – Frant Feb 02 '21 at 13:38
  • We are developing on Windows. But it should not matter if OpenOCD can be configured to detect connected debuggers – Vlad Feb 02 '21 at 14:36
  • I think it cannot, this is why I was asking, because I was more envisaging a wrapper command that would check which adapter is present, the way `jeb` is suggesting. – Frant Feb 02 '21 at 14:57

2 Answers2

2

I don't know if OpenOCD can do that (I don't think it can), but since you are using Windows, you could just use a small wrapper written in VBScript detecting which probe is available, and launch a different command depending on which probe was detected:

openocd.vbs:

' STLink: 
' idVendor:                        0x0483 = STMicroelectronics
' idProduct:                       0x3748
Dim strStlink
Dim stlinkPresent
Dim strStlinkCommand
strStlink = "VID_0483&PID_3748"
stlinkPresent=0
strStlinkCommand="cmd.exe /c D:\opt\openocd\0.10.0-14\stm32f103c8_blue_pill_stlink.cmd"

' Segger JLink'
' idVendor:                        0x1366 = SEGGER Microcontroller Systems GmbH
' idProduct:                       0x0101
Dim strJlink
Dim jlinkPresent
Dim strJlinkCommand
strJlink="VID_1366&PID_0101"
jlinkPresent=0
strJlinkCommand="cmd.exe /c D:\opt\openocd\0.10.0-14\stm32f103c8_blue_pill_jlink.cmd"

' Credits:
' https://stackoverflow.com/questions/3331043/get-list-of-connected-usb-devices
strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_PnPEntity",,48) 
For Each objItem in colItems 
 '   Wscript.Echo "-----------------------------------"
 '   Wscript.Echo "Win32_PnPEntity instance"
 '   Wscript.Echo "-----------------------------------"
'    Wscript.Echo "DeviceID: " & objItem.DeviceID
    If InStr(objItem.DeviceID, strStlink) Then
      WScript.Echo("Found STLink Device")
      stlinkPresent=1
    End If

    If InStr(objItem.DeviceID, strJlink) Then
      WScript.Echo("Found JLink Device")
      jlinkPresent=1
    End If
Next

If (jlinkPresent=1 And stlinkPresent=1) Then
    WScript.Echo("Found both JLink and STLink devices - terminating.")
    WScript.Quit(1)
End If

If (jlinkPresent=0 And stlinkPresent=0) Then
    WScript.Echo("No JLink/STLink devices were found - terminating.")
    WScript.Quit(2)
End If

Set WshShell = WScript.CreateObject("WScript.Shell")

If (stlinkPresent=1) Then
    WshShell.Run strStlinkCommand, 1, false
End If

If (jlinkPresent=1) Then
    WshShell.Run strJlinkCommand, 1, false
End If

Usage:

cscript.exe openocd.vbs

You will have to adapt the content of the strStlinkCommand and strJlinkCommand variables to your needs.

You can of course call it from a batch procedure:

launch-openocd.cmd:

@cscript.exe openocd.vbs

Tested on Windows 10 version 20H2 19042.746

Frant
  • 5,382
  • 1
  • 16
  • 22
1

With linux you could use the USB-VendorID/ProductID to choose the config file.

You could start via a shell script like

if lsusb | grep 1366:1015 > /dev/null; then 
  config=j-link.conf
else
  config=st-link.conf
fi
openocd -f $config
jeb
  • 78,592
  • 17
  • 171
  • 225