{"id":472,"date":"2017-05-09T23:09:05","date_gmt":"2017-05-09T21:09:05","guid":{"rendered":"https:\/\/www.anginf.de\/?p=472"},"modified":"2017-05-10T00:49:09","modified_gmt":"2017-05-09T22:49:09","slug":"arduino-als-jtag-programmer","status":"publish","type":"post","link":"https:\/\/www.anginf.de\/?p=472","title":{"rendered":"Arduino als JTAG Programmer"},"content":{"rendered":"<p>Ich w\u00fcrde gerne meine <a href=\"https:\/\/www.amazon.de\/gp\/product\/B000KNE738\/ref=as_li_tl?ie=UTF8&amp;camp=1638&amp;creative=6742&amp;creativeASIN=B000KNE738&amp;linkCode=as2&amp;tag=unwichtig09-21&amp;linkId=d017348d485a68cdc68dd7ec9b1817af\" target=\"_blank\" rel=\"noopener noreferrer\">Honeywell Heizk\u00f6rperregler HR-20 Rondostat zeitgesteuert<\/a><img loading=\"lazy\" decoding=\"async\" style=\"border: none !important; margin: 0px !important;\" src=\"\/\/ir-de.amazon-adsystem.com\/e\/ir?t=unwichtig09-21&amp;l=am2&amp;o=3&amp;a=B000KNE738\" alt=\"\" width=\"1\" height=\"1\" border=\"0\" \/> nicht nur <a href=\"https:\/\/github.com\/plerup\/espsoftwareserial\/\">passiv auslesen<\/a> (das geht auch schon mit der nativen Firmware), sondern auch \u00fcber einen ESP8266 steuern. Das wurde schon von schlauen Leuten vorgedacht, und daher gibt es mit <a href=\"https:\/\/github.com\/OpenHR20\/OpenHR20\">OpenHR20<\/a> auch eine neue Firmware, welche man mittels JTAG-Interface auf das HR20 flashen kann.<\/p>\n<p>Ich habe nur kein JTAG-Programmierer zur Hand, aber daf\u00fcr einen Arduino Uno. Ich habe den Ansatz eines\u00a0<a href=\"https:\/\/github.com\/balau\/JTAGduino\">JTAGduino<\/a> gefunden. Die notwendigen L\u00f6tarbeiten waren schnell erledigt, ich habe die nachfolgende Steckerbelegung (<a href=\"https:\/\/piontecsmumble.wordpress.com\/\">Quelle<\/a>) ber\u00fccksichtigt, um den JTAGduino zu versorgen. Um eine durchgehende Stiftleiste am Arduino Uno verwenden zu k\u00f6nnen, habe ich die gesamte Kommunikation auf die Analogen Ports A0 bis A4 gelegt.<a href=\"https:\/\/www.anginf.de\/wp-content\/uploads\/steckerbelegung.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-473 alignnone\" src=\"https:\/\/www.anginf.de\/wp-content\/uploads\/steckerbelegung-1024x828.jpg\" alt=\"\" width=\"604\" height=\"488\" srcset=\"https:\/\/www.anginf.de\/wp-content\/uploads\/steckerbelegung-1024x828.jpg 1024w, https:\/\/www.anginf.de\/wp-content\/uploads\/steckerbelegung-300x242.jpg 300w, https:\/\/www.anginf.de\/wp-content\/uploads\/steckerbelegung-768x621.jpg 768w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>Die ersten Tests mit den von JTAGduino mitgelieferten Skripten verliefen erfolgreich, wenn ich das JTAG-Interface vom Arduino an den HR20 angeschlossen habe und mein Arduino an meinen Linux-Rechner per USB verbunden ist, kommt folgende Ausgabe:<\/p>\n<pre lang=\"bash\">user@host:~\/work\/JTAGduino$ .\/host_test.py \r\nif_ver_major = 0; if_ver_minor = 1\r\nfw_ver_major = 0; fw_ver_minor = 1\r\nset_serial_speed(115200) = 0\r\nclear pin TDI rsp = 1\r\nset pin TDI rsp = 0\r\nget pin TDO rsp = 0; val = 0\r\njtag_clock(1,1): rsp = 1; tdo = 0\r\njtag_clock(1,0): rsp = 0; tdo = 1\r\njtag_sequence([1,1,1,1], [1, 1, 0, 1]), rsp = 0; tdo_seq = [1, 0, 0, 0]\r\njtag_sequence([1] * 255, [1] * 255), rsp = 0; tdo_seq = [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\r\ndevice.set_jtag_speed(1) = 255\r\njtag_sequence([1] * 255, [1] * 255), rsp = 127; tdo_seq = []\r\nuser@host:~\/work\/JTAGduino$ .\/readid.py \r\nTraceback (most recent call last):\r\n  File \".\/readid.py\", line 81, in \r\n    if rsp != 0: raise Exception('error: set_jtag_speed returned %d' % rsp)\r\nException: error: set_jtag_speed returned 191\r\nuser@host:~\/work\/JTAGduino$ .\/readid.py \r\n#Taps = 1\r\nDevice identifier registers (beginning from closest to TDO):\r\n0x6940503F\r\n<\/pre>\n<p>Die Fehlermeldung habe ich absichtlich drin gelassen, damit man auch andere den Grund f\u00fcr den Fehler finden k\u00f6nnen. Man muss vor JEDEM Ansprechen des JTAGduino diesen manuell auf durch einen Druck auf den Reset-Button am Arduino zur\u00fccksetzen.<\/p>\n<p>Die ID <code>0x6940503F<\/code> ist bereits die vom HR20, wir k\u00f6nnen also grunds\u00e4tzlich per JTAG bereits mit ihm kommunizieren.<\/p>\n<p>Als n\u00e4chstes muss ich noch herausfinden, wie avrdude mit dem so gebauten &#8222;Programmer&#8220; sprechen kann, bisher habe ich nur ermitteln k\u00f6nnen, dass es eine m\u00f6gliche Liste von Programmern in avrdude vordefiniert gibt: (Der Pfad zur Arduino-Installation muss nat\u00fcrlich angepasst werden)<\/p>\n<pre lang=\"bash\">user@host:~\/work\/JTAGduino$ PATH=$PATH:\/arduino-1.8.1\/hardware\/tools\/avr\/bin avrdude -c dslfkj -C \/arduino-1.8.1\/hardware\/tools\/avr\/etc\/avrdude.conf 2&lt;&amp;1 | grep -i jtag\r\n  atmelice         = Atmel-ICE (ARM\/AVR) in JTAG mode (avrdude: jtag3_open_common(): JTAGICE3\/EDBG port names must start with \"usb\")\r\n  dragon_jtag      = Atmel AVR Dragon in JTAG mode\r\n  jtag1            = Atmel JTAG ICE (mkI)\r\n  jtag1slow        = Atmel JTAG ICE (mkI)\r\n  jtag2            = Atmel JTAG ICE mkII\r\n  jtag2avr32       = Atmel JTAG ICE mkII im AVR32 mode\r\n  jtag2dw          = Atmel JTAG ICE mkII in debugWire mode\r\n  jtag2fast        = Atmel JTAG ICE mkII\r\n  jtag2isp         = Atmel JTAG ICE mkII in ISP mode\r\n  jtag2pdi         = Atmel JTAG ICE mkII PDI mode\r\n  jtag2slow        = Atmel JTAG ICE mkII\r\n  jtag3            = Atmel AVR JTAGICE3 in JTAG mode\r\n  jtag3dw          = Atmel AVR JTAGICE3 in debugWIRE mode\r\n  jtag3isp         = Atmel AVR JTAGICE3 in ISP mode\r\n  jtag3pdi         = Atmel AVR JTAGICE3 in PDI mode\r\n  jtagkey          = Amontec JTAGKey, JTAGKey-Tiny and JTAGKey2\r\n  jtagmkI          = Atmel JTAG ICE (mkI)\r\n  jtagmkII         = Atmel JTAG ICE mkII\r\n  jtagmkII_avr32   = Atmel JTAG ICE mkII im AVR32 mode\r\n  o-link           = O-Link, OpenJTAG from www.100ask.net (avrdude: Error: no libftdi or libusb support. Install libftdi1\/libusb-1.0 or libftdi\/libusb and run configure\/make again.)\r\n  xil              = Xilinx JTAG cable (tested - avrdude: can't claim device \"\/dev\/ttyACM0\": Inappropriate ioctl for device)\r\n  xplainedpro      = Atmel AVR XplainedPro in JTAG mode\r\n<\/pre>\n<p>Den nachfolgenden Befehl nutze ich zum Test, ob der jeweilige Programmer-Typ funktioniert, er sollte bei erfolgreicher Kommunikation nur Backups von fuses anlegen, also f\u00fchrt noch keine schreibenden Operationen aus:<\/p>\n<pre lang=\"bash\">user@host:~\/work\/JTAGduino$ PATH=$PATH:\/arduino-1.8.1\/hardware\/tools\/avr\/bin avrdude -p m169 -c xil -P \/dev\/ttyACM0 -C \/arduino-1.8.1\/hardware\/tools\/avr\/etc\/avrdude.conf -U lfuse:r:backup\/unknown\/`date  \"+%F_%T\"`\/lfuse.hex:h -U hfuse:r:backup\/unknown\/`date  \"+%F_%T\"`\/hfuse.hex:h -U efuse:r:backup\/unknown\/`date  \"+%F_%T\"`\/efuse.hex:h\r\n<\/pre>\n<p>So wie es aussieht, ist die Library nicht komplett, und f\u00fcr meinen Anwendungszweck vielleicht gar nicht geeignet. Ich bin dadurch \u00fcber eine JTAG-Library gesto\u00dfen, welche man direkt \u00fcber die Arduino-IDE nachinstallieren kann: <a href=\"https:\/\/github.com\/mrjimenez\/JTAG\">https:\/\/github.com\/mrjimenez\/JTAG<\/a><\/p>\n<p>Nach dem Upload des JTAGTest-Programms (wird als Beispiel in der ArduinoIDE bereitgestellt, wenn man die Bibliothek installiert hat) auf dem Arduino kann man das python-Programm &#8222;xsvf&#8220; nutzen, um erste Tests durchzuf\u00fchren:<\/p>\n<pre lang=\"bash\">\r\nuser@host:~\/work\/JTAG\/extras\/python$ .\/xsvf ..\/xsvf\/all\/idcode_simpler.xsvf\r\nFile: \/work\/JTAG\/extras\/xsvf\/all\/idcode_simpler.xsvf\r\nReady to send 18 bytes.\r\nSent:       18 bytes,        0 remaining\r\nIMPORTANT: ********\r\nIMPORTANT: Success!\r\nIMPORTANT: ********\r\nIMPORTANT: Last TDO: FF FF FF FF\/32 bits\r\nIMPORTANT: Processed 5 instructions.\r\nIMPORTANT: Checksum:  0xC2\/18.\r\nIMPORTANT: Sum: 0x0000003E\/18.\r\nQuit: No error (0).\r\n  Expected checksum:  0xC2\/18.\r\n  Expected sum: 0x0000003E\/18.\r\nElapsed time: 0.02 seconds.\r\n<\/pre>\n<p>Mit der neuen JTAG-Library alle m\u00f6glichen Programmiermodi des avrdude durchgegangen:<\/p>\n<pre>\r\natmelice         = Atmel-ICE (ARM\/AVR) in JTAG mode (avrdude: jtag3_open_common(): JTAGICE3\/EDBG port names must start with \"usb\")\r\n  dragon_jtag      = Atmel AVR Dragon in JTAG mode (no response)\r\n  jtag1            = Atmel JTAG ICE (mkI) (avrdude: jtagmkI_open(): failed to synchronize to ICE)\r\n  jtag1slow        = Atmel JTAG ICE (mkI) (avrdude: jtagmkI_open(): failed to synchronize to ICE)\r\n  jtag2            = Atmel JTAG ICE mkII (no response)\r\n  jtag2avr32       = Atmel JTAG ICE mkII im AVR32 mode (avrdude: jtagmkII_recv_frame(): timeout     avrdude: jtagmkII_getsync(): sign-on command: status -1)\r\n  jtag2dw          = Atmel JTAG ICE mkII in debugWire mode\r\n  jtag2fast        = Atmel JTAG ICE mkII\r\n  jtag2isp         = Atmel JTAG ICE mkII in ISP mode\r\n  jtag2pdi         = Atmel JTAG ICE mkII PDI mode\r\n  jtag2slow        = Atmel JTAG ICE mkII\r\n  jtag3            = Atmel AVR JTAGICE3 in JTAG mode\r\n  jtag3dw          = Atmel AVR JTAGICE3 in debugWIRE mode\r\n  jtag3isp         = Atmel AVR JTAGICE3 in ISP mode\r\n  jtag3pdi         = Atmel AVR JTAGICE3 in PDI mode\r\n  jtagkey          = Amontec JTAGKey, JTAGKey-Tiny and JTAGKey2\r\n  jtagmkI          = Atmel JTAG ICE (mkI)\r\n  jtagmkII         = Atmel JTAG ICE mkII\r\n  jtagmkII_avr32   = Atmel JTAG ICE mkII im AVR32 mode\r\n  o-link           = O-Link, OpenJTAG from www.100ask.net (avrdude: Error: no libftdi or libusb support. Install libftdi1\/libusb-1.0 or libftdi\/libusb and run configure\/make again.)\r\n  xil              = Xilinx JTAG cable (avrdude: can't claim device \"\/dev\/ttyACM0\": Inappropriate ioctl for device)\r\n  xplainedpro      = Atmel AVR XplainedPro in JTAG mode (avrdude: jtag3_open_common(): JTAGICE3\/EDBG port names must start with \"usb\")\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich w\u00fcrde gerne meine Honeywell Heizk\u00f6rperregler HR-20 Rondostat zeitgesteuert nicht nur passiv auslesen (das geht auch schon mit der nativen Firmware), sondern auch \u00fcber einen ESP8266 steuern. Das wurde schon von schlauen Leuten vorgedacht, und daher gibt es mit OpenHR20 auch eine neue Firmware, welche man mittels JTAG-Interface auf das HR20 flashen kann. Ich habe &hellip; <a href=\"https:\/\/www.anginf.de\/?p=472\" class=\"more-link\"><span class=\"screen-reader-text\">Arduino als JTAG Programmer<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-472","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=472"}],"version-history":[{"count":9,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/472\/revisions"}],"predecessor-version":[{"id":482,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/472\/revisions\/482"}],"wp:attachment":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}