📄 main.tex
字号:
\documentclass{scrartcl}\usepackage[latin1]{inputenc}\usepackage[T1]{fontenc}\usepackage[ngerman]{babel}\usepackage{amsmath}\usepackage{listings}\title{usbPort - USB Stack f黵 Embedded Systeme}\author{Benedikt Sauter}\date{29. Oktober 2006}\begin{document}\maketitle\tableofcontents\section{Einleitung}\subsection{Anwendungsbereich}usbPort ist ein USB Stack f"ur Rechnersysteme mit wenig Ressourcen (RAM und CPU, meist Mikrocontroller).Die Struktur der Software wurde nach der Spezifikation der USB Organisation erstellt.\subsection{"Ubersicht}Der USB Stack ist nicht f"ur einen bestimmten USB Host Controller geschrieben, sondernbietet eine Schnittstelle f"ur USB Host Controller Treiber an. Da der Stack in der Programmiersprache C geschrieben worden ist,kann man ihn leicht auf verschiedene Prozessoren portieren.In der ersten Version gibt es einen Treiber f"ur den Host Controller SL811 von Cypress.\newline\newline Der Stack kann in verschiedenen Betriebsarten angesteuert werden. F"ur Programme ohne parallele Programmpfade, gibt es den sogenannten {\bf Single Modus}. Dieser geht mit dem Arbeitsspeicher sehr sparend um, aberist daf"ur bei der bei der Verteilung der Transferrate auf die verschiedenen Verbindungen nicht ausgewogen, wodurch es zu engp"assen kommenkann. Im Gegensatz zum Single Mode gibt es den {\bf Queue Modus}, welcher mehr Speicher ben"otigt, dadurch aber mit einemflexibleren Algorithmus den Zugriff auf den USB Bus steuert.\section{USB Stack}\subsection{Struktur Beschreibung}Der Stack ist in drei Schichten aufgeteilt. Die Hardware kann man als vierte Schicht ansehen,wobei die API dieser Schicht durch den eingesetzten USB Baustein vorgegeben ist.Jede weitere Schicht bietet eine von usbPort angebotene API f"ur die Nachbarschichten an.\begin{center}USB Treiber / Direkter Zugriff auf USB Ger"ate \\USB Kern \\USB Host Controller Treiber \\USB Host Controller (Baustein)\end{center}\subsection{Verzeichnistruktur}\begin{itemize}\item boards \item COPYING \item core \item dbgmonitor \item debug.h \item devices \item doc \item drivers \item examples \item lib \item misc \item README \item types.h \item usbspec \end{itemize}\newpage\subsection{USB Treiber / Direkter Zugriff auf USB Ger"ate}\subsubsection{USB Treiber API}Die USB Ger"ate Treiber dienen zur Kommunukation mit den Ger"aten. Es gibt einen allgemeinenTreiber, mit dem man direkt auf jedes USB Ger"at zugreifen kann. Dazu gibt es eineReihe von fertigen Klassen Treibern f"ur verschiedene Ger"ate wie Hubs, Tastaturen, Massenspeicher und einige mehr.Diese Treiber befinden sich in dem Unterordner drivers/classes.\newline\newline\noindent Die API der USB Ger"ate Treiber Schicht:\begin{figure}[h]\begin{center}\begin{tabular}{|l|l|}\hlineFunktion & Beschreibung\\ \hlineusb\_open() & mitte\\ \hlineusb\_close() & mitte\\ \hlineusb\_set\_configuration() & mitte\\ \hlineusb\_reset() & mitte\\ \hlineusb\_control\_msg() & mitte\\ \hlineusb\_get\_string() & mitte\\ \hlineusb\_get\_string\_simple() & mitte\\ \hlineusb\_get\_descriptor() & mitte\\ \hlineusb\_bulk\_write() & mitte\\ \hlineusb\_bulk\_read() & mitte\\ \hlineusb\_interrupt\_write() & mitte\\ \hlineusb\_interrupt\_read() & mitte\\ \hlineusb\_isochron\_write() & mitte\\ \hlineusb\_isochron\_read() & mitte\\ \hline\end{tabular}\end{center}\caption{USB Treiber API} \end{figure}\newpage\subsection{USB Kern}\subsubsection{USB Kern API}Die prim"are Aufgabe des Kerns ist die Vermittlung von USB Anfragen der Ger"ate Treibernzu den Host Controller Treibern. Die Anfragen werden mit Hilfe von USB Request Blocks (kurz URB) get"atigt.\newline\newline\noindentWeitere Aufgaben des Kerns sind:\begin{itemize}\item Erkennung und Konfiguartion von neuen Ger"aten\item Laden und Entladen der Treiber\item API f"ur Ger"ate Treiber\item API f"ur Host Controller Treiber\end{itemize}\begin{figure}[h]\begin{center}\begin{tabular}{|l|l|}\hlineFunktion & Beschreibung\\ \hlineusb\_core\_init() & mitte\\ \hlineusb\_add\_device() & mitte\\ \hlineusb\_remove\_device() & mitte\\ \hlineusb\_register\_driver() & mitte\\ \hlineusb\_core\_process() & mitte\\ \hlineusb\_alloc\_urb() & mitte\\ \hlineusb\_free\_urb() & mitte\\ \hlineusb\_submit\_urb() & mitte\\ \hlineusb\_fill\_control\_urb() & mitte\\ \hlineusb\_fill\_bulk\_urb() & mitte\\ \hlineusb\_fill\_int\_urb() & mitte\\ \hlineusb\_fill\_iso\_urb() & mitte\\ \hline\end{tabular}\end{center}\caption{USB Kern API} \end{figure}\noindentDie Hauptfunktion des USB Stacks ist {\bf usb\_core\_process}.Sie muss zyklisch immer wieder aufgerufen werden, damit der USB Stack{\it am Leben} gehalten wird. Dies kann "uber verschiedene Weisen geschehen:\begin{itemize}\item eine einfache Endlosschleife im Hauptprogramm\item einem Z"ahlerinterrupt (ausgel"ost von einer RTC)\item Funktion l"auft in einem Thread (eventuell http://www.sics.se/~adam/pt/)\end{itemize}\noindentFalls der USB Controller "uber eine Interruptleitung verf"ugt,kann in der dazugeh"origen Routine direkt die Funktion usb\_core\_processaufgerufen werden. Aber sobald ein Hub angeschlossen wird, reicht der alleinigeAufruf in der Interruptroutine nicht mehr, es muss ebenfalls daf"ur gesorgtwerden, dass die Funktion regelm"assig aufgerufen wird. Nur so kannder Kern mitbekommen was auf dem USB Bus hinter dem Hub passiert.\subsubsection{Datenstrukturen und Arbeitsweise}Der Kern ist wie er schon vom Namen her verr"at das zentrale Elementin dem USB Stack. Er wird durch die Datenstruktur struct usb\_core dargestellt.\lstset{language=C}\begin{lstlisting}struct usb_core{ /* zuletzt verwendete Ger"ate Adresse */ uint8 nextaddress; /* aktuelles Ereigniss des Root Ports am Host */ uint8 hcd_event; /* aktuelle am Bus sich befindende Ger"ate */ struct usb_device * devices; /* angemeldete Treiber */ struct usb_drivers * drivers;};\end{lstlisting}\noindentGenauso wie f"ur den Kern, gibt es f"ur jedes angesteckte Ger"at eine Datenstruktur:\lstset{language=C}\begin{lstlisting}struct usb_device{ /* Adresse des Ger"ats */ uint8 address; /* Produkt ID */ uint32 product_id; /* Hersteller ID */ uint32 vendor_id; /* zugeh"orige Kern */ struct usb_core *core; /* aktuellen Endpunkte der Konfiguration */ struct usb_endpoint *endpoints;};\end{lstlisting}\noindentIn der Ger"ate Datenstruktur befindet sich eine Liste mit Endpunkten.Bei einem Endpunkt wird nur die Fifo Gr"osse gespeichert,da diese f"ur die Kommunikation wichtig ist. Es wird in diesem Absatz noch darauf eingegangen wo diese genau ben"otigt wird.\lstset{language=C}\begin{lstlisting}struct usb_endpoint{ /* verkettete Liste mit Endpunkten */ struct usb_endpoint * next; /* Endpunkt Adresse */ uint8 address; /* phsikalische Speicher im Ger"at f"ur diesen Endpunkt */ uint8 fifosize;};\end{lstlisting}\noindentDas waren im wesentlichen alle Datenstrukturen, die den BusZustand beschreiben. Zus"atzlich zu diesen gibt es nochwelche die die Nachrichten auf dem USB Bus wiederspiegeln.\newline\newline\noindentMit USB Request Blocks (URB) k"onnen Nachrichten versendet werden.Ein URB sieht wie folgt aus:\lstset{language=C}\begin{lstlisting}struct urb{ struct usb_device * dev; /* tells if packet is an isochronous */ u8 iso; /* tells if packet is an setup packet */ u8 setup; /* endpoint address */ u8 endpoint; /* buffer for incoming and outgoing data */ char* buf; /* max buffer length */ u16 buflen; /* pointer for function after complete */ void * complete;};\end{lstlisting}\noindentDadurch kann eine Nachricht eindeutig identifiziert werden.Es ist genau definiert mit welcher "Ubertragungsmethodedie Nachricht an wen in welcher Richtung gesendet wird.\newlineDie USB Kern API bietet entsprechende Funktionen an,um URBs zu erstellen und versenden.\newline\newlineIm USB Kern werden URBs noch einmal in kleinere Teilepartitioniert, den Transfer Deskriptoren.USB Host Controller Treiber m"ussen diese Deskriptorendann nur noch auf den USB Bus legen und "ubertragen.\newline\newlineTansfer Deskriptoren sehen wie folgt aus:\lstset{language=C}\begin{lstlisting}struct usb_transferdescr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -