{"id":133,"date":"2005-03-20T15:44:45","date_gmt":"2005-03-20T13:44:45","guid":{"rendered":"http:\/\/blogs.bl0rg.net\/netzstaub\/?p=133"},"modified":"2005-03-20T15:44:45","modified_gmt":"2005-03-20T13:44:45","slug":"usb-host-entwicklung","status":"publish","type":"post","link":"https:\/\/blogs.bl0rg.net\/netzstaub\/2005\/03\/20\/usb-host-entwicklung\/","title":{"rendered":"Usb Host-Entwicklung"},"content":{"rendered":"<p>Ich durfte in den letzten Tagen eine USB-Host-Applikation entwickeln. Dazu wurde ein EZ-OTG Kontroller von Cypress eingesetzt. F&#252;rs erste keinen Code, weil der nicht mir geh&#246;rt.<\/p>\n<h3>Der EZ-OTG Kontroller<\/h3>\n<p>Der EZ-OTG ist ein kleiner, netter USB-OTG Kontroller. OTG heisst &#8220;On-The-Go&#8221;, und bezeichnet die F&#228;higkeit, sowohl USB-Host als auch USB-Device zu sein. Der EZ-OTG kann also im Betrieb seine Funktion wechseln. Der Chip verf&#252;gt &#252;ber 2 sogenannte SIE (Serial Interface Engine), die beide Host oder Device sein k&#246;nnen. Nur die erste SIE kann allerdings OTG. Der EZ-OTG ist allerdings nicht nur ein &#8220;stumpfer&#8221; Kontroller, sondern hat eine eigene 16-Bit CPU, f&#252;r die man auch Programmcode nachladen kann. Man kann den EZ-OTG also in zwei verschiedenen Modi fahren: in dem einen &#8220;Slave&#8221;-Modus wird der EZ-OTG praktisch als Kontroller eingesetzt, in dem &#8220;Standalone&#8221;-Modus ist er CPU und Kontroller zugleich. In beiden F&#228;llen kann man den &#8220;BIOS&#8221; des EZ-OTG verwenden. Der BIOS besteht aus 8 kB Assembler Code, der sich &#252;ber Interrupts ansprechen l&#228;sst (ganz wie der alte PC-Bios). Er &#252;bernimmt schon die meiste Hardware-Funktionalit&#228;t (z.B. UART Handling), man kann aber jederzeit die Interrupt-Eintr&#228;ge des BIOS &#252;berschreibe, um seinen eigenen Code da reinzufrimeln.<\/p>\n<p>In dem Standalone Modus kann der Kontroller Code aus einem EEPROM laden, oder z.B. &#252;ber USB laden (wie die anderen USB-Device Kontroller von Cypress, dem EZ-FX und EZ-FX2). In dem Slave Modus bietet der Cypress verschiedene Schnittstellen an, &#252;ber die die eigentliche CPU mit dem LCP Protokoll Kommandos an den Cypress absetzen kann (z.B. BIOS Funktionen aufrufen, oder im RAM rumschreiben). In dem Fall meiner Applikation habe ich den Standalone-Modus verwendet.<\/p>\n<h3>Die Entwicklungsumgebung<\/h3>\n<p>Das Entwicklungsboard von Cypress zu dem EZ-OTG hat einen EZ-OTG, 4 EEPROMS, eine ganze Reihe an Pins zum Anschliessen von Hardware an den Kontroller, ein paar Taster, ein LED-Display, und 2 SIE-Schnittstellen. An jeder SIE Schnittstelle kann man 2 USB-Devices anschliessen, oder einen USB-Host. Die erste SIE wird standardm&#228;ssig zum Debuggen verwendet, der BIOS l&#228;sst da normalerweise Code laufen, mit dem der GDB dann die CPU steuern kann (so eine Art JTAG f&#252;r Arme). Die zweite SIE kann man dann frei verwenden.<\/p>\n<p>Software-m&#228;ssig liefert Cypress eine Cygwin-Umgebung mit Crosscompiler Toolchain f&#252;r die 16-Bit CPU auf dem EZ-OTG (mal sehen, ob ich irgendwo den Source dazu finde, unter Linux entwickeln w&#228;r schick0r). Zum Debuggen kommt ein GDB mit einer anstrengenden Tk-Oberfl&#228;che (namens Insight), die &#252;ber TCP mit einer Zwischensoftware kommuniziert, die dann USB-Kommandos an den Cypress absetzt. Bei dem Entwicklungsboard liegt auch ein Buch bei, das &#8220;Developing Multi-Role USB Applications&#8221; heisst, von John Hyde, der auch ein <a href=\"http:\/\/www.usb-by-example.com\/\">Buch &#252;ber USB-Entwicklung<\/a> geschrieben hat. Dieses Buch beschreibt, wie man mit dem EZ-Host (der grosse Bruder des EZ-OTGs) und dem EZ-OTG Applikationen baut. Das in einer ziemlich angenehmen Hands-On Art. Ich steh ja normalerweise nicht wirklich auf B&#252;cher, die an eine spezielle Technologie gebunden sind, aber in dem Fall war es recht angenehm. In einem Kapitel stellt er kurz vor, wie man die LEDs blinken l&#228;sst (also eher ein Tutorial, wie man &#252;berhaupt den GCC und den GDB und so verwendet), wie man ein kleines HID-Device baut, dass die Tastendr&#252;cke als Tastatur weiterleitet. Dann kommt ein Kapitel &#252;ber Host-Entwicklung, in der gerade diese HID-Device jetzt als Host kontrolliert wird. Zu den ganzen Applikationen haben Hyde und seine Kumpanen einen riesigen Framework gebaut, der sage und schreibe 20000 Zeilen Code umfasst. Die Host-Applikation ist dadurch, trotz extensiver Unterst&#252;tzung durch den BIOS immerhin 16 kB gross (!).<\/p>\n<p>Ich muss jetzt wirklich ein bisschen ruml&#228;stern. Den dieses Framework w&#228;r ja vielleicht noch ganz nett, wenn es a) gut dokumentiert w&#228;re, und b), noch viel wichtiger, keine groben Bugs beinhalten w&#252;rde. Scheinbar haben Cypress und Hyde den Code aber nie &#8220;wirklich&#8221; verwendet, denn es ist z.B. unm&#246;glich, in der Form ein dual-Host Device zu schreiben, oder BULK-Transfers sauber zu machen. In dem ersten Fall hat ein scheinbar dummer Fehler beim Copy\/Paste Code die Auswirkung, dass ein zweites Ger&#228;t nicht erkannt wird, und daf&#252;r den Zustand des ersten kaputt-schreibt. Bei BULK-Transfers resettet ein Lesen immer das Data-Toggle-bit vom Schreiben, so dass die DATA0 und DATA1-Pakete Abwechslung, die bei USB notwendig ist, nicht mehr passiert. Ich finde das wirklich sehr peinlich, und es gingen ein paar Stunden aufgeregtes Debuggen drauf, diese Fehler zu finden. Der GDB, der f&#252;r jeden Singlestep 5 Sekunden braucht, ist da auch keine wirklich Hilfe. Ich musste ziemlich schnell auf das alt-bew&#228;hrte Mittel des printf-Debuggings zur&#252;ckgreifen.<\/p>\n<p>Ich frage mich also, wieso Cypress mit dem EZ-OTG und EZ-Host dieses Framework vertreibt (man kann nat&#252;rlich ohne programmieren, daf&#252;r gibt es aber keine Application Notes). Viel sch&#246;ner w&#228;re es doch gewesen, kleine Standalone-Applikationen zu bauen, die zwar dann komplizierter zu verstehen sind, weil sie das ganze Host-Handling selber machen. Daf&#252;r aber kein 16 kB-grosses Code-Monstrum mit sich schleppen (mit, achtung, dynamischer Speicheralloziierung, verketteten Listen in jede Richtung, einer Treiber-Infrastruktur, und was weiss ich noch alles geile). Nun gut, vielleicht werde ich da noch was sch&#246;nes schreiben, wenn ich an die passende Hardware komme. In dem Umfeld w&#228;re es auch denke ich ganz schick, Protothreads zu verwenden, anstatt riesige Callback-basierte State-Machines zu verwenden, wie es im Moment der Fall ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich durfte in den letzten Tagen eine USB-Host-Applikation entwickeln. Dazu wurde ein EZ-OTG Kontroller von Cypress eingesetzt. F&#252;rs erste keinen Code, weil der nicht mir geh&#246;rt. Der EZ-OTG Kontroller Der EZ-OTG ist ein kleiner, netter USB-OTG Kontroller. OTG heisst &#8220;On-The-Go&#8221;, &hellip; <a href=\"https:\/\/blogs.bl0rg.net\/netzstaub\/2005\/03\/20\/usb-host-entwicklung\/\">Continue reading <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":[5,17],"tags":[],"class_list":["post-133","post","type-post","status-publish","format-standard","hentry","category-bastelstaub","category-computerstaub"],"_links":{"self":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts\/133","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/comments?post=133"}],"version-history":[{"count":0,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts\/133\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/media?parent=133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/categories?post=133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/tags?post=133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}