]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - doc/procfs.tex
Add kernel version depency for Kernel 3.1.x which extended __rtnl_register().
[socketcan-devel.git] / doc / procfs.tex
1 % $Id$
2
3 \newpage
4 \section{\LL-Status im /proc-Filesystem}
5 \label{procfs}
6
7 Das \LLCF\ unterstützt das /proc-Filesystem und stellt darüber Statistiken
8 und Informationen über interne Strukturen und Stati in lesbarer Form zur
9 Verfügung. Die Informationen können vom Benutzer beispielsweise mit\\
10
11 \verb+cat /proc/net/can/stats+\\
12
13 abgefragt werden. Im Folgenden werden die einzelnen Einträge erläutert.
14
15 \subsection{Versionsinformation /proc/net/can/version}
16
17 Die \LL-Versionsinformationen können für eine Anwendung z.B. durch das
18 Öffnen der Datei \verb+/proc/net/can/version+ ausgelesen werden. Dazu werden
19 die ersten 6 Zeichen in einen Puffer kopiert und mit 
20 \verb+ llcf_version_code = strtoul(mybuffer, (char **)NULL, 16);+
21 in den LLCF\_VERSION\_CODE überführt. Der LLCF\_VERSION\_CODE wird
22 nach der Regel\\
23
24 \verb-LLCF_VERSION_CODE = (((MAJORVERSION) << 16) + ((MINORVERSION) << 8) + (PATCHLEVEL))-\\
25
26 berechnet.
27
28 \begin{code}
29 hartko@pplinux1:~> cat /proc/net/can/version 
30 010000 [ Volkswagen AG - Low Level CAN Framework (LLCF) v1.0.0-rc1 ]
31 \end{code}
32
33 \subsection{Statistiken /proc/net/can/stats}
34
35 Über die angebotenen Statistiken kann man sich über das aktuelle
36 Datenaufkommen informieren und wie beispielsweise der Anteil der von
37 Applikationen benötigten (matched) CAN-Frames im Verhältnis aller vom CAN-Bus
38 empfangener CAN-Frames ist.\\
39
40 Die Informationen werden mit dem Start des \LL\ jede Sekunde aktualisiert.
41
42 \begin{code}
43 hartko@pplinux1:~> cat /proc/net/can/stats 
44
45       811 transmitted frames (TXF)
46    319427 received frames (RXF)
47     69504 matched frames (RXMF)
48
49        21 % total match ratio (RXMR)
50         0 frames/s total tx rate (TXR)
51         0 frames/s total rx rate (RXR)
52
53       100 % current match ratio (CRXMR)
54         2 frames/s current tx rate (CTXR)
55       166 frames/s current rx rate (CRXR)
56
57       100 % max match ratio (MRXMR)
58         2 frames/s max tx rate (MTXR)
59       167 frames/s max rx rate (MRXR)
60
61         6 current receive list entries (CRCV)
62         6 maximum receive list entries (MRCV)
63
64 \end{code}
65 \subsection{Zurücksetzen von Statistiken /proc/net/can/reset\_stats}
66
67 Das Zurücksetzen der statistischen Informationen kann durch interne
68 Überläufe von Zählern oder vom Benutzer selbst initiiert werden. Über
69 das Zurücksetzen der statistischen Informationen informiert eine
70 zusätzliche Zeile (STR). An diesem Beispiel sind die Auswirkungen in
71 einem laufenden System bezüglich der obigen Ausgabe der Statistiken
72 gut zu erkennen.
73 \begin{code}
74 hartko@pplinux1:~> cat /proc/net/can/reset_stats 
75 LLCF statistic reset #1 done.
76 hartko@pplinux1:~> cat /proc/net/can/stats 
77
78        31 transmitted frames (TXF)
79      2585 received frames (RXF)
80      2585 matched frames (RXMF)
81
82       100 % total match ratio (RXMR)
83         1 frames/s total tx rate (TXR)
84       165 frames/s total rx rate (RXR)
85
86       100 % current match ratio (CRXMR)
87         2 frames/s current tx rate (CTXR)
88       165 frames/s current rx rate (CRXR)
89
90       100 % max match ratio (MRXMR)
91         2 frames/s max tx rate (MTXR)
92       167 frames/s max rx rate (MRXR)
93
94         6 current receive list entries (CRCV)
95         6 maximum receive list entries (MRCV)
96
97         1 statistic resets (STR)
98
99
100 \end{code}
101
102 \subsection{Interne Empfangslisten des RX-Dispatchers}
103
104 \LL-Module können sich beim \LL-RX-Dispatcher für den Empfang von
105 einzelnen CAN-IDs (oder Bereichen von CAN-IDs) von bestimmten 
106 CAN-Netzwerk-Interfaces registrieren. Diese Registrierung führt zu
107 einem Eintrag in einer zugehörigen Empfangsliste, bei der 
108 zu jeder registrierten CAN-ID eine Funktion mit einem Parameter
109 (z.B. eine modulspezifische Referenz wie 'userdata' oder 'sk')
110 aufgerufen wird, wenn das entsprechende CAN-Frame empfangen 
111 wurde. In der Spalte 'ident' trägt sich das
112 registrierende Protokoll-Modul namentlich ein. Zusammen mit der
113 Debug-Funktionalität (siehe Kapitel \ref{modparms}) kann man anhand
114 dieser Informationen die Funktionsweise des \LL\ einfach nachvollziehen.\\
115
116 Zur schnellen Verarbeitung empfangener CAN-Frames sind im
117 RX-Dispatcher des \LL\ verschiedenartige Empfangslisten (für jedes
118 CAN-Netzwerk-Interface) realisiert:
119
120 \begin{description}
121 \item[rcvlist\_all] In dieser Liste sind Registrierungen eingetragen,
122 die von einem CAN-Bus alle empfangenen CAN-Frames
123 benötigen. Typischerweise sind dieses die so genannten RAW-Sockets
124 ohne aktiven Filter (siehe Kapitel \ref{rawsocket}). 
125 \item[rcvlist\_fil] In dieser Liste sind Registrierungen eingetragen,
126 die nur einen über Bitmasken definierten Bereich von CAN-Frames
127 benötigen (z.B. 0x200 - 0x2FF).
128 \item[rcvlist\_inv] In dieser Liste sind Registrierungen eingetragen,
129 die einen über Bitmasken definierten Bereich von CAN-Frames ausblenden
130 wollen - also die Umkehrung von 'rcvlist\_fil'.
131 \item[rcvlist\_eff] In dieser Liste sind Registrierungen für einzelne
132 CAN-Frames im Extended Frame Format (29 Bit Identifier) eingetragen.
133 \item[rcvlist\_sff] In dieser Liste sind Registrierungen für einzelne
134 CAN-Frames im Standard Frame Format (11 Bit Identifier) eingetragen.
135 \end{description}
136
137 Durch das Aufteilen der Empfangslisten, wird der Aufwand zum Suchen
138 und Vergleichen des empfangenen CAN-Frames mit den registrierten
139 Empfangsfiltern minimiert.\\
140
141 So wurde z.B. die Liste 'rcvlist\_sff' als Array mit 2048 Einträgen (11 Bit
142 CAN-ID) mit einer einfach verketteten Liste für die jeweiligen CAN-IDs
143 realisiert. Auf eine Überprüfung von Filtern und Inhalten kann hier
144 beim Empfang einer passenden Nachricht verzichtet werden.\\
145
146 Derzeit
147 wird die Funktionalität der Extended CAN-Frames in aktuellen Projekten
148 nicht genutzt, weshalb die Registrierungen für einzelne EFF-Frames in
149 eine einfach verkettete Liste eingetragen werden. Bei intensiverer
150 Nutzung der Extended CAN-Frames sollte man als 'rcvlist\_eff' eine
151 Hash-Tabelle (analog zur 'rcvlist\_sff') im \LL\ realisieren, um eine
152 effiziente Verarbeitung zu gewährleisten.\\ 
153
154 Möchte man alle Empfangslisten auf einmal ansehen, kann man zur
155 Vereinfachung folgendes eingeben:
156
157 \begin{code}
158 hartko@pplinux1:~> cat /proc/net/can/rcvlist_*
159
160 receive list 'rx_all':
161   device   can_id   can_mask  function  userdata   matches  ident
162    can1      000    00000000  f8c995ac  f0e59280     42726  raw
163   device   can_id   can_mask  function  userdata   matches  ident
164    can0      000    00000000  f8c995ac  f0e59800     55240  raw
165
166
167 receive list 'rx_eff':
168   (can1: no entry)
169   (can0: no entry)
170
171
172 receive list 'rx_fil':
173   device   can_id   can_mask  function  userdata   matches  ident
174    can1      200    00000700  f8c995ac  f0e5b380         0  raw
175   (can0: no entry)
176
177
178 receive list 'rx_inv':
179   (can1: no entry)
180   (can0: no entry)
181
182
183 receive list 'rx_sff':
184   (can1: no entry)
185   device   can_id   can_mask  function  userdata   matches  ident
186    can0      123    000007ff  f8c86bec  e2e14380        29  bcm
187    can0      456    000007ff  f8c86bec  ea954880         0  bcm
188    can0      789    000007ff  f8c86bec  e30e6200       130  bcm
189    can0      3FF    000007ff  f8c86bec  deaf2580        14  bcm
190    can0      740    000007ff  f8c93680  e48322c4       178  tp20
191
192 \end{code}
193
194 Es geht natürlich auch so:
195
196 \begin{code}
197 hartko@pplinux1:~> cat /proc/net/can/rcvlist_sff
198
199 receive list 'rx_sff':
200   (can1: no entry)
201   device   can_id   can_mask  function  userdata   matches  ident
202    can0      123    000007ff  f8c86bec  e2e14380        29  bcm
203    can0      456    000007ff  f8c86bec  ea954880         0  bcm
204    can0      789    000007ff  f8c86bec  e30e6200       130  bcm
205    can0      3FF    000007ff  f8c86bec  deaf2580        14  bcm
206    can0      740    000007ff  f8c93680  e48322c4       178  tp20
207
208 \end{code}
209
210 \newpage
211 \subsection{CAN Network-Devices im Verzeichnis /proc/net/drivers}
212
213 In dieses Verzeichnis sollen sich CAN-Netzwerk-Treiber mit ihren
214 Proc-Filesystem-Einträgen registrieren. Derzeit ist dieses nur für den
215 mitgelieferten SJA1000-Treiber auf \verb+src/drivers/sja1000+
216 realisiert, dessen Ausgaben kurz beschrieben werden.\\
217
218 Im Beispiel wird der SJA1000-Netzwerk-Treiber auf dem iGate (Jaybrain
219 GW2) gezeigt. Beim ISA-Treiber (sja1000-isa) sind die ausgelesenen
220 Informationen analog.
221  
222 \subsubsection{Treiberstatus /proc/net/drivers/sja1000-xxx}
223
224 Hier wird der Zustand der CAN-Controller und des jeweils zugehörigen
225 CAN-Busses angezeigt (siehe dazu die Dokumentation zum Philips
226 SJA1000).
227
228 \begin{code}
229 hartko@pplinux1:~> cat /proc/net/drivers/sja1000-gw2
230 CAN bus device statistics:
231        errwarn  overrun   wakeup   buserr   errpass  arbitr   restarts clock        baud
232 can0:        0        0        0        0        0        0        0   20000000      500
233 can0: bus status: OK, RXERR: 0, TXERR: 0
234 can1:        0        0        0        0        0        0        0   20000000      100
235 can1: bus status: OK, RXERR: 0, TXERR: 0
236 can2:        0        0        0        0        0        0        0   20000000      100
237 can2: bus status: OK, RXERR: 0, TXERR: 0
238 can3:        0        0        0        0        0        0        0   20000000      500
239 can3: bus status: OK, RXERR: 0, TXERR: 0
240 \end{code}
241
242 \subsubsection{Registeranzeige /proc/net/drivers/sja1000-xxx\_regs}
243
244 Hier werden die 32 Register der SJA1000-CAN-Controller angezeigt
245 (siehe dazu die Dokumentation zum Philips SJA1000).
246
247 \begin{code}
248 hartko@pplinux1:~> cat /proc/net/drivers/sja1000-gw2_regs 
249 SJA1000 registers:
250 can0 SJA1000 registers:
251 00: 02 00 0c 00 05 00 40 4d 1a 1a 00 00 00 60 00 00
252 10: 65 ef d3 5f a2 08 01 05 fa ff 0e 7f 0c 00 00 cf
253 can1 SJA1000 registers:
254 00: 02 00 0c 00 05 00 43 ff 1a 1a 00 00 00 60 00 00
255 10: 61 ff de 3d 80 00 10 45 d7 ef fb 4a 06 00 00 cf
256 can2 SJA1000 registers:
257 00: 02 00 0c 00 05 00 43 ff 1a 1a 00 00 00 60 00 00
258 10: 61 fb ee 87 a0 4a 80 10 76 ff da bd 00 00 00 cf
259 can3 SJA1000 registers:
260 00: 02 00 0c 00 05 00 40 4d 1a 1a 00 00 00 60 00 00
261 10: 61 ef 7f ff 21 1c 42 08 32 df 57 6f a1 00 00 cf
262 \end{code}
263
264 \subsubsection{Zurücksetzen des Treibers /proc/net/drivers/sja1000-xxx\_reset}
265
266 Das Lesen dieses Eintrages führt einen Reset der SJA1000-CAN-Controller
267 durch. Wie man im Beispiel sieht, ist die Anzahl der 'restarts' danach
268 um 1 erhöht.
269
270 \begin{code}
271 hartko@pplinux1:~> cat /proc/net/drivers/sja1000-gw2_reset 
272 resetting can0 can1 can2 can3 done
273 hartko@pplinux1:~> cat /proc/net/drivers/sja1000-gw2
274 CAN bus device statistics:
275        errwarn  overrun   wakeup   buserr   errpass  arbitr   restarts clock        baud
276 can0:        0        0        0        0        0        0        1   20000000      500
277 can0: bus status: OK, RXERR: 0, TXERR: 0
278 can1:        0        0        0        0        0        0        1   20000000      100
279 can1: bus status: OK, RXERR: 0, TXERR: 0
280 can2:        0        0        0        0        0        0        1   20000000      100
281 can2: bus status: OK, RXERR: 0, TXERR: 0
282 can3:        0        0        0        0        0        0        1   20000000      500
283 can3: bus status: OK, RXERR: 0, TXERR: 0
284 \end{code}
285
286 \subsubsection{Testprogramme}
287
288 \begin{description}
289 \item[tst-proc] Öffnet bis zu 800 RAW-Sockets, um einen Überlauf bei
290 der Ausgabe von \verb+/proc/net/can/rcvlist_all+ zu provozieren.
291 \end{description}