Jim M. schrieb:
> Ich lese in der Doku Kapitel 2.4.3:
>
>> All other USB JTAG adapters can be supported only if libusb is installed. There
is a libusb-win32
>
> Mit anderen Worten: Das Ganze funktioniert nur wenn man mit zadig die
> LibUSB-Win32 (Filter-)Treiber für den entsprechenden Adapter installiert
> hat. Per default werden sowohl beim JLink als auch beim ARM-USB-OCD
> andere Treiber installiert.
>
> Das dürfte übrigens auch Dein Problem bei OpenOCD sein, das ähnliche
> Limitation hat. IIRC ging da auch Zadig WinUSB, aber YMMV.
Ok, vermutlich stehe ich mit dem USB-Treiberzeugs noch auf Kriegsfuß...
Durch die Installation der Segger J-Link-Software wurde ein eigener
Treiber installiert. Das Gerät findet sich im Gerätemanager unter
"USB-Controller -> J-Link driver". Über die "Treiberdetails" erkenne ich
das er "JLinkx64.sys" verwendet. Die Hardware-ID lautet
USB\VID_1366&PID_0101. Damit läuft J-Link.exe und JFlash.exe
einwandfrei.
Der URJtag (jtag.exe) erkennt das Gerät also nicht weil es diesen
Treiber nicht verwenden kann. Nach langem suchen habe ich auch die von
Dir zitierte Stelle gefunden. Besagte libusb-win32 gibt es hier:
https://sourceforge.net/projects/libusb-win32/
Als Features dieses Treibers ist angegeben:
* 32bit/64bit Windows support
=> Sehr gut!
* KMCS digital signed kernel driver libusb0.sys
=> Signierter Treiber. Ebenfalls wichtig, damit Windows 7/10 nicht
meckert bei der Installation!
* User space library libusb0.dll
=> Wenn ichs richtig verstanden hab kann ein von einem User ohne lokale
Adminrechte gestartetes Programm nicht ohne weiteres direkt auf einen
USB-Port zugreifen. Damit das doch geht und man diese Software nicht als
Admin starten muss, gibt es diese "Wrapper" oder "Middleware" DLL. Die
wird geladen und bietet Funktionsaufrufe an um auf den USB-Treiber und
damit den Port zuzugreifen.
* libusb-win32 device driver and filter driver
=> Hier verstehe ich noch Bahnhof. Was ist der Unterschied zwischen
"device driver" (das kenne ich) und "filter driver" (noch nie von
gehört). In den Docus von libusb-win32 meine ich herausgelesen zu haben
das man den "device filter" nicht nutzen sollte.
Jedenfalls habe ich mir diesen Treiber heruntergeladen. Im
/bin-Verzeichnis finde ich für meine CPU (AMD 64Bit) den "amd64" Ordner.
Dort liegt einmal der Kernel-Treiber:
amd64\libusb0.sys: x64 64-bit driver.
Installs to Windows\system32\drivers\libusb0.sys
und einmal das User-Space-DLL:
amd64\libusb0.dll: x64 64-bit library.
Installs to Windows\system32\libusb0.dll
sowie eine "install-filter.exe" für die Kommandozeile und eine
"install-filter-win.exe" als GUI-Applikation.
Ich gehe mal davon aus das jtag.exe von URjtag die DLL braucht um auf
den Segger J-Link zugreifen zu können?!
Nach dem Start der "install-filter-win.exe" wird man gefragt für welches
Gerät man den Treiber installieren möchte. Ich verstehe das so, das
grundsätzlich die Treiberdateien (*.sys und *.dll) ins Betriebssystem
kopiert werden und zusätzlich der Treiber dann diesem Gerät zugewiesen
wird.
Die Installation selbst klappte schnell und problemlos. Anschließend
finde ich in den Treiberdetails neben dem "JLinkx64.sys" auch noch den
"libusb0.sys", zusätzlich. jlink.exe und jflash.exe funktionieren
weiterhin.
Nach dem Start von jtag.exe (URjtag) und der Eingabe von "cable jlink"
bekomme ich diese Ausgabe:
1 | jtag> cable jlink
|
2 | J-Link initial read failed, don't worry (result=-116)
|
3 | Vref = 0.0 TCK=1 TDI=1 TDO=1 TMS=1 TRES=1 TRST=1
|
4 | Vref too low. Eventually the target isn't powered or disconnected?
|
5 | Resetting J-Link. Please retry the cable command.
|
6 | Error: Cable initialization failed!
|
7 | jtag>
|
Soweit, so gut! :-) Zumindest wird der Adapter nun gefunden. Es fehlte
also scheinbar wirklich dieser Teil. Dafür erstmal VIELEN DANK für den
Tipp!
Die obige Ausgabe war ohne angeschlossenes JTAG-Gerät. Mit
angeschlossenem bekomme ich das:
1 | jtag> cable jlink
|
2 | J-Link initial read failed, don't worry (result=-116)
|
3 | Vref = 3.371 TCK=1 TDI=1 TDO=0 TMS=1 TRES=1 TRST=0
|
4 | J-Link JTAG Interface ready
|
5 | jtag>
|
Bis auf diesen "initial read failed" sieht das gut aus. Was auch immer
der Fehler "-116" ist...
Nun würde ich laut Doku einen "detect" Befehl absetzen und der sollte
mir eigentlich die JTAG-IDs der einzelnen TAPs auflisten können.
Stattdessen kommt aber:
1 | jtag> detect
|
2 | Warning: TDO seems to be stuck at 0
|
3 | jtag>
|
Kurz zuvor habe ich aber in derselben Betriebsbedingung den Jlink.exe
laufen lassen und der konnte problemlos zugriefen.
Was stimmt denn nun wieder nicht?
Auch ist mir noch unklar wie ich die JTAG-Geschwindigkeit einstellen
sollte. Zwar hat der TAP auf dem Board ein RCLK aber woher soll urjtag
das wissen? Habe daher mal mit "frequency 4000" einen 4khz Takt
eingestellt. Aber das änderte auch nichts. Detect zeigt nichts an.