ˇ e vysok´e uˇcen´ı technick´e v Praze Cesk´ Fakulta elektrotechnick´a Katedra ˇr´ıdic´ı techniky
Diplomov´a pr´ace
CAN - USB pˇ revodn´ık pro integraci do operaˇ cn´ıho syst´ emu GNU/Linux Bc. Jiˇr´ı Vanˇek
Vedouc´ı pr´ace: Ing. Pavel P´ıˇsa, Ph.D.
Studijn´ı program: Otevˇren´a informatika, Navazuj´ıc´ı magistersk´ y Obor: Poˇc´ıtaˇcov´e inˇzen´ yrstv´ı 11. kvˇetna 2012
iv
Podˇ ekov´ an´ı Chtˇel bych podˇekovat zejm´ena vedouc´ımu m´e pr´ace Ing. Pavlu P´ıˇsovi, Ph.D. za uˇziteˇcn´e rady, pˇripom´ınky a konzultace. D´ ale bych chtˇel podˇekovat sv´e rodinˇe a pˇr´ıtelkyni za podporu v pr˚ ubˇehu m´e pr´ ace.
Abstract This diploma thesis implements the firmware for delivered hardware device that represents the CAN-USB converter. The firmware uses mechanisms from the LinCAN project. The work also includes design and implementation of the driver for the operating system GNU/Linux, which is based on SocketCAN, the current CAN Linux kernel subsystem. The implemented firmware is tested with both the character device driver LinCAN and the implemented driver using SocketCAN. There is also a comparison of these two drivers. The work also includes a brief overview and analysis of suitable microprocessors based on ARM architecture, which are suitable for the implementation of the CAN-USB converter.
Abstrakt Diplomov´ a pr´ ace implementuje firmware pro dodan´e hardwarov´e zaˇr´ızen´ı pˇredstavuj´ıc´ı pˇrevodn´ık CAN-USB. Firmware vyuˇz´ıv´a mechanismy projektu LinCAN. Pr´ace d´ale obsahuje n´avrh a implementaci ovladaˇce pro operaˇcn´ı syst´em GNU/Linux, kter´ y je zaloˇzen na SocketCAN, coˇz je souˇcasn´ y CAN subsyst´em Linuxov´eho j´adra. Realizovan´ y firmware je otestov´an jak se znakov´ ym ovladaˇcem LinCAN, tak s realizovan´ ym ovladaˇcem vyuˇz´ıvaj´ıc´ım SocketCAN a je uvedeno srovn´ an´ı obou ovladaˇc˚ u. Souˇc´ast´ı pr´ ace je i struˇcn´ y rozbor a pˇrehled vhodn´ ych mikroprocesorov´ ych obvod˚ u zaloˇzen´ ych na architektuˇre ARM, kter´e jsou vhodn´e pro realizaci CAN-USB pˇrevodn´ıku.
vi
Obsah ´ 1 Uvod
1
2 Sbˇ ernice CAN 2.1 Obecn´e principy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ˇ 2.2 Casov´ an´ı komunikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Pˇr´ıklad fyzick´e vrstvy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 2 3 4
3 Sbˇ ernice USB
5
4 Architektura ARM 4.1 Obecnˇe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Popis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Historie spoleˇcnosti . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Vhodn´e ˇreˇsen´ı pro realizaci pˇrevodn´ıku . . . . . . . . . . . . . . . . . 4.2.1 Moˇznosti realizace . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Porovn´ an´ı procesorov´ ych ˇrad . . . . . . . . . . . . . . . . . . 4.2.3 V´ ybˇer vhodn´eho procesorov´eho j´adra . . . . . . . . . . . . . . 4.2.4 V´ ybˇer vhodn´eho mikrokontrol´eru s j´adrem ARM Cortex-M3 5 Firmware pˇ revodn´ıku CAN-USB 5.1 Anal´ yza u ´kolu . . . . . . . . . . . . . . . . ˇ c CAN . . . . . . . . . . . . . . . . . 5.2 Radiˇ 5.3 Implementace . . . . . . . . . . . . . . . . 5.3.1 Funkcionalita a struktura LinCAN 5.3.2 Uˇzivatelsk´e poˇzadavky . . . . . . . 6 SocketCAN 6.1 Linux a jeho s´ıt’ov´ y subsyst´em . 6.2 CAN a s´ıt’ov´ y pˇr´ıstup . . . . . 6.3 Rodina protokol˚ u PF CAN . . 6.3.1 Struktura . . . . . . . . 6.3.2 Local loopback . . . . . 6.3.3 Datov´ a cesta . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
vii
. . . . . .
. . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . .
7 7 7 7 8 8 8 10 12
. . . . .
15 15 15 17 17 19
. . . . . .
20 20 21 22 22 22 23
viii
OBSAH
7 Ovladaˇ c pˇ revodn´ıku CAN-USB 7.1 Jadern´e moduly . . . . . . . . . . . . . . . . . . . . . 7.2 Ovladaˇce . . . . . . . . . . . . . . . . . . . . . . . . 7.3 USB ovladaˇce . . . . . . . . . . . . . . . . . . . . . . 7.3.1 Struktura USB ovladaˇc˚ u. . . . . . . . . . . . 7.3.2 USB v j´ adˇre Linux . . . . . . . . . . . . . . . 7.3.2.1 Koncov´e body (Endpoints) . . . . . 7.3.2.2 Rozhran´ı (Interfaces) . . . . . . . . 7.3.2.3 Konfigurace (Configurations) . . . . 7.3.2.4 Zaˇr´ızen´ı (Devices) . . . . . . . . . . 7.3.2.5 USB Request Blocks . . . . . . . . . 7.3.3 USB v GNU/Linux . . . . . . . . . . . . . . . 7.4 Imlementace ovladaˇce pˇrevodn´ıku . . . . . . . . . . . 7.4.1 Registrace . . . . . . . . . . . . . . . . . . . . 7.4.2 Priv´ atn´ı data . . . . . . . . . . . . . . . . . . 7.4.3 Pˇripojen´ı a odpojen´ı zaˇr´ızen´ı . . . . . . . . . 7.4.3.1 Funkce probe() . . . . . . . . . . . 7.4.3.2 Funkce disconnect() . . . . . . . . 7.4.4 Funkce s´ıt’ov´eho rozhran´ı . . . . . . . . . . . 7.4.5 Nastaven´ı, povolen´ı a zak´az´an´ı CAN zaˇr´ızen´ı 7.4.5.1 Nastaven´ı . . . . . . . . . . . . . . . 7.4.5.2 Povolen´ı . . . . . . . . . . . . . . . 7.4.5.3 Zak´ az´ an´ı . . . . . . . . . . . . . . . 7.4.6 Obsluˇzn´e vl´ akno a fronty . . . . . . . . . . . 7.4.7 Pˇr´ıjem . . . . . . . . . . . . . . . . . . . . . . 7.4.8 Odes´ıl´ an´ı . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
24 24 26 27 28 28 29 29 30 30 30 33 35 35 38 39 39 40 41 41 42 42 43 43 44 46
8 Testov´ an´ı 48 8.1 Pr˚ ubˇeh test˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 8.2 Zhodnocen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 9 Z´ avˇ er
53
A Seznam pouˇ zit´ ych zkratek
55
B Obsah pˇ riloˇ zen´ eho CD
56
Seznam obr´ azk˚ u 2.1 2.2 2.3 2.4
Uk´ azka arbitr´ aˇze CAN sbˇernice ˇ Casov´ an´ı CAN sbˇernice . . . . Podoba zapojen´ı ISO11898-2 . Napˇet’ov´e u ´rovnˇe ISO11898-2 .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
3 3 4 4
3.1
Pˇrehled hierarchie USB zaˇr´ızen´ı . . . . . . . . . . . . . . . . . . . . . . . . . .
6
4.1 4.2
Rozdˇelen´ı procesor˚ u ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rozdˇelen´ı procesor˚ u ARM ˇrady Cortex-M . . . . . . . . . . . . . . . . . . . .
10 11
5.1
Blokov´e sch´ema ˇradiˇce CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
6.1 6.2
S´ıt’ov´ y subsyt´em Linuxu a funkce PF CAN . . . . . . . . . . . . . . . . . . . Rozd´ıln´ y koncept adresace u Ethernetu a CAN . . . . . . . . . . . . . . . . .
21 22
7.1 7.2 7.3 7.4
Rozdˇelen´ı j´ adra . . . . . . . . . . . . Struktura USB ovladaˇc˚ u v Linuxu . Vytv´ aˇren´ı pipes . . . . . . . . . . . . Struktura datov´eho bloku pro pˇrenos
8.1 8.2 8.3 8.4 8.5
Sestava hardware pro v´ yvoj a testov´an´ı . . . . . . . Round trip time - 1 vl´ akno, nulov´a prodleva . . . . . Round trip time historie - 1 vl´akno, nulov´a prodleva Round trip time - 3 vl´ akna, nulov´a prodleva . . . . . Round trip time - 1 vl´ akno, prodleva 0, 1 a 2 ms . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CAN zpr´avy po USB
ix
. . . . .
. . . . .
. . . . .
. . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
26 28 32 35
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
49 50 50 51 51
Seznam tabulek 4.1 4.2 4.3 4.4 4.5
NXP . . . . . . . . STMicroelectronics Texas Instruments Fujitsu . . . . . . . Toshiba . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
x
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
13 13 13 14 14
Kapitola 1
´ Uvod CAN (Controller Area Network) je komunikaˇcn´ı sbˇernice ˇsiroce rozˇs´ıˇren´a v automobilov´ ych syst´emech a v pr˚ umyslov´ ych ˇr´ıdic´ıch odvˇetv´ıch obecnˇe. Nejˇcastˇeji komunikuje prostˇrednictv´ım dvojice vodiˇc˚ u a zjednoduˇsuje tak rozvody. Poskytuje deterministick´ y zp˚ usob pˇr´ıstupu k m´ediu a je tak vhodn´ a i pro pouˇzit´ı v ˇcasovˇe kritick´ ych aplikac´ıch. CAN pˇredstavuje spolehliv´e, levn´e, osvˇedˇcen´e a dobˇre zn´ am´e s´ıt’ov´e ˇreˇsen´ı. D´ıky tˇemto nesporn´ ym kvalit´am je nepravdˇepodobn´e, ˇze bude nasazov´ an´ı CAN v dohledn´e dobˇe omezeno a to i pˇres to, ˇze jsou k dispozici modern´ı ˇreˇsen´ı jako FlexRay ˇci r˚ uzn´e standardy pro pr˚ umyslov´ y Ethernet. ˇ Casto je nutn´e ke sbˇernici CAN pˇr´ıpojit poˇc´ıtaˇc pro u ´ˇcely konfigurace, monitorov´an´ı nebo diagnostiky. To lze realizovat napˇr. pomoc´ı speci´aln´ıch pˇr´ıdavn´ ych karet pro PCI rozhran´ı. Pro snadn´e a levn´e pˇripojen´ı poˇc´ıtaˇce ke sbˇernici CAN je vˇsak vhodn´ y CAN-USB pˇrevodn´ık. Rozhran´ım USB jsou v dneˇsn´ı dobˇe vybaveny t´emˇer veˇsker´e osobn´ı poˇc´ıtaˇce. Naopak instalace speci´ aln´ı karty napˇr. pro notebook ˇcasto nen´ı ani moˇzn´a. Pr´ace po struˇcn´em pˇredstaven´ı sbˇernic USB a CAN pˇrin´aˇs´ı informace o archituktuˇre ARM. Stˇeˇzejn´ı je pˇrehled souˇcasn´e nab´ıdky mikroprocesorov´ ych obvod˚ u zaloˇzen´ ych na t´eto architektuˇre a tak´e v´ ybˇer vhodn´eho ˇreˇsen´ı pro realizaci CAN-USB pˇrevodn´ıku. Je tak´e k dispozici pˇrehled nab´ıdek od nˇekolika v´ yrobc˚ u. N´asleduje ˇc´ ast t´ ykaj´ıc´ı se u ´kolu implementace firmware pro CAN-USB pˇrevodn´ık s mikrokontrol´erem LPC1768, kter´ y vyuˇz´ıv´ a zdrojov´ ych k´od˚ u projektu LinCAN. Po anal´ yze tohoto u ´kolu n´asleduje popis zprovoznen´ı itegrovan´eho CAN ˇradiˇce mikrokontrol´eru a d´ale popis zaˇclenˇen´ı funkcionality do struktury LinCAN. Nejrozs´ ahlejˇs´ı ˇc´ ast tvoˇr´ı nejdˇr´ıve popis souˇcasn´eho CAN subsyst´emu Linuxov´eho j´adra SocketCAN a pot´e popis v´ yvoje ovladaˇce pro pˇrevodn´ık. Tato ˇc´ast zahrnuje sezn´amen´ı s principem ovladaˇc˚ u v Linuxu a jejich implementace jako jadern´ ych modul˚ u. N´asleduje nˇekolik obecn´ ych vˇec´ı t´ ykaj´ıc´ıch se USB ovladaˇc˚ u v j´adru Linux a pak jiˇz kompletn´ı popis v´ yvoje s´ıt’ov´eho ovladaˇce CAN-USB pˇrevodn´ıku zaloˇzen´eho na SocketCAN. Pr´aci uzav´ır´ a kapitola vˇenovan´ a testov´an´ı, kde je zhodnocena souˇcinnost implementace firmware jak se znakov´ ym ovladaˇcem LinCAN, tak s vytvoˇren´ ym s´ıt’ov´ ym ovladaˇcem zaloˇzen´em na SocketCAN. Tak´e je n´ azornˇe pˇredvedeno porovn´an´ı obou ˇreˇsen´ı.
1
Kapitola 2
Sbˇ ernice CAN 2.1
Obecn´ e principy
CAN je s´eriov´ a sbˇernice typu multi-master pˇredstaven´a v roce 1986 Robert Bosh GmbH. Standard CAN definuje pouze spojovou (linkovou) vrstvu tedy ˇr´ızen´ı pˇr´ıstupu k m´ediu, k´odov´an´ı a dek´ odov´ an´ı r´ amc˚ u atd. Varianty fyzick´e vrstvy (parametry veden´ı, u ´rovnˇe sign´al˚ u, konektory atd.) mohou b´ yt r˚ uzn´e. Definuj´ı je napˇr. standardy ISO11898-2 nebo ISO11898-3. Z´akladn´ı poˇzadavek na fyzickou vrstvu je podpora pˇrenosu dvou stav˚ u - dominantn´ıho a recesivn´ıho. Pokud ˇz´ adn´ y uzel nevys´ıl´a dominantn´ı stav, sbˇernice z˚ ust´av´a v recesivn´ım stavu. Kdykoliv nˇejak´ y uzel vys´ıl´ a dominantn´ı stav, sbˇernice je v dominantn´ım stavu. Tato vlastnost je pouˇz´ıv´ ana ve vrstvˇe pˇr´ıstupu k m´ediu (MAC) pro dosaˇzen´ı nedestruktivn´ıho arbitr´ aˇzn´ıho mechanismu. Ten zajiˇst’uje pˇr´ıstup k m´ediu zpr´avˇe s nejvyˇsˇs´ı prioritou bez jak´ ychkoliv zpoˇzdˇen´ı. Priorita zpr´avy je urˇcena jej´ım identifik´atorem, kter´ y identifikuje obsah zpr´avy sp´ıˇs neˇz adresu vys´ılaˇce nebo pˇrij´ımaˇce. Vˇsechny uzly vys´ılaj´ı bity synchronnˇe a pˇri vys´ıl´ an´ı zpr´ avy u f´ aze arbitr´ aˇze uzel kontroluje rozd´ıl mezi t´ım co vyslal a t´ım co skuteˇcnˇe je na sbˇernici. Pokud uzel zaznamen´a rozd´ıl, odpoj´ı se. Identifik´ator zpr´avy, kter´ y je vys´ıl´an ve f´ azi arbitr´ aˇze je bud’ 11 nebo 29 bit˚ u dlouh´ y v z´avislosti na tom, zda je pouˇz´ıv´an rozˇs´ıˇren´ y form´ at zpr´ avy. Pˇr´ıklad na arbitr´aˇz sbˇernice lze vidˇet na obr´azku 2.1 (pˇrevzat´em z [5]1 ). Zde 3 uzly zaˇc´ınaj´ı vys´ılat v jeden okamˇzik. Arbitr´aˇz vyhraje posledn´ı z nich, jelikoˇz j´ım vys´ılan´ a zpr´ ava m´ a identifik´ ator s nejvyˇsˇs´ı prioritou (nejniˇzˇs´ı hodnotou). Vzhledem k tomu, ˇze arbitr´ aˇz sbˇernice vyˇzaduje synchronn´ı bitov´ y pˇrenos a rychlost ˇs´ıˇren´ı sign´alu veden´ım je koneˇcn´ a, je omezena d´elka veden´ı sbˇernice. Pro 125 kbit/s je maxim´aln´ı d´elka sbˇernice je 500 m, pro maxim´ aln´ı rychlost 1 Mbit/s to je 30 m [6]. D´elka skuteˇcn´ ych dat (payload) m˚ uˇze b´ yt aˇz 8 byt˚ u a kaˇzd´a zpr´ava je chr´anˇena 15 bitov´ ym CRC. Kaˇzd´a zpr´ava je potvrzena bitem ACK. Vys´ılaˇc vys´ıl´a tento bit jako recesivn´ı. Vˇsechny pˇrij´ımaˇce, kter´e korektnˇe pˇrijmou zpr´ avu, nastav´ı tento bit jako dominantn´ı. T´ımto zp˚ usobem, kdyˇz ˇz´adn´ y pˇrij´ımaˇc nen´ı je schopen pˇrijmout zpr´avu korektnˇe, vys´ılaˇc m˚ uˇze signalizovat chybu vyˇsˇs´ım vrstv´ am. 1
Vˇsechny obr´ azky v t´eto kapitole o CAN byly pˇrevzaty z [5]
2
ˇ KAPITOLA 2. SBERNICE CAN
3
Obr´ azek 2.1: Uk´azka arbitr´aˇze CAN sbˇernice
2.2
ˇ Casov´ an´ı komunikace
Vˇsechny uzly v s´ıt´ı mus´ı m´ıt nastavenu stejnou nomin´aln´ı pˇrenosovou rychlost. Aby toto bylo moˇzn´e, mus´ı m´ıt kaˇzd´ y uzel (resp. jeho ˇradiˇc) korektnˇe definovanou d´elku bitov´eho intervalu. Programovateln´ a dˇeliˇcka (Baudrate prescaler) generuje sign´al s d´elkou oznaˇcovanou jako ˇcasov´e kvatum (time quantum). Interval jednoho bitu je pak sloˇzen z celoˇc´ıseln´eho poˇctu tˇechto ˇcasov´ ych kvant. Ta jsou rozdˇelena do 4 segment˚ u, jak lze vidˇet na obr´azku 2.2.
ˇ Obr´ azek 2.2: Casov´ an´ı CAN sbˇernice Synchronizaˇcn´ı segment je dlouh´ y 1 ˇcasov´e kvantum. Propagation segment slouˇz´ı ke kompenzaci zpoˇzdˇen´ı mezi uzly. Phase segment 1 a Phase segment 2 urˇcuj´ı bod, kde ˇradiˇc vzorkuje, zda je na sbˇernici recesivn´ı ˇci dominantn´ı u ´roveˇ n. V nastaven´ı ˇradiˇce se pak ˇcasto uv´ad´ı pouze souˇcet Propagation segment + Phase segment 1 jako Time segment 1 (tseg1) a Phase segment 2 jako Time segment 2 (tseg2). Kv˚ uli tomu, ˇze skuteˇcn´e rychlosti se mohou m´ırnˇe liˇsit (tolerance oscil´ ator˚ u), je zaveden tzv. Synchronization Jump Width (sjw). To je poˇcet ˇcasov´ ych kvant, o kter´ y se m˚ uˇze prodlouˇzit/zkr´atit Phase segment 1 nebo Phase segment 2 k doc´ılen´ı opˇetovn´e synchronizace.
ˇ KAPITOLA 2. SBERNICE CAN
2.3
4
Pˇ r´ıklad fyzick´ e vrstvy
Jak jiˇz bylo zm´ınˇeno, varianty fyzick´e vrstvy mohou b´ yt rozd´ıln´e. Typick´ ym pˇr´ıkladem je ovˇsem metalick´e dvouvodiˇcov´e diferenci´aln´ı veden´ı podle standardu ISO11898-2. Pˇr´ıklad m˚ uˇzeme vidˇet na obr´ azku 2.3.
Obr´ azek 2.3: Podoba zapojen´ı ISO11898-2 Sbˇernicov´ a struktura se zakonˇcovac´ımi rezistory s hodnotou odporu 120 Ohm˚ u. Diferenci´aln´ı komunikace, kde u ´roveˇ n je d´ana rozd´ılem napˇet´ı mezi vodiˇci CAN H a CAN L. Recesivn´ı u ´roveˇ n zajiˇst’uj´ı pull-up rezistory, rozd´ıl CAN H – CAN L je bl´ızk´ y 0. V domi’ nantn´ım stavu je rozd´ıl CAN H – CAN L kladn´ y, u ´rovnˇe zajiˇst uje budiˇc pˇr´ısluˇsn´eho uzlu 2.4.
Obr´ azek 2.4: Napˇet’ov´e u ´rovnˇe ISO11898-2
Kapitola 3
Sbˇ ernice USB USB (Universal Serial Bus) je standard vyv´ıjen´ y od roku 1994. Definuje komunikaˇcn´ı protokol, kabely i konektory. Pouˇz´ıv´ a se k propojen´ı zaˇr´ızen´ı (kl´avesnice, tisk´arny, flash disky atd.) a hostitelsk´eho syst´emu (PC, notebook) za u ´ˇcelem jejich vz´ajemn´e komunikace. Pˇresn´ y popis lze naj´ıt ve specifikaci USB1 . Rychlosti: • USB 1.0 - Low Speed: aˇz 1,5 Mb/s • USB 1.1 - Full Speed: aˇz 12 Mb/s • USB 2.0 - Hi Speed: aˇz 480 Mb/s • USB 3.0: aˇz 5 Gbit/s
2
Hierarchie v zaˇr´ızen´ı (obr´ azek 3.1 pˇrevzat´ y z [9]) je pops´ana USB deskriptory. Ty definuje USB specifikace a jsou nez´ avisl´e na operaˇcn´ım syst´emu. Existuj´ı tyto: • Zaˇ r´ızen´ı (Device) - reprezentuje fyzick´e zaˇr´ızen´ı pˇripojen´e na sbˇernici. Pˇr´ıklad: USB reproduktor s tlaˇc´ıtky na ovl´ ad´an´ı hlasitosti. • Konfigurace (Configurations) - reprezentuj´ı stavy zaˇr´ızen´ı. Pˇr´ıklad: Active, Standby, Initialization. • Rozhran´ı (Interfaces) - reprezentuj´ı jednotliv´a logick´a zaˇr´ızen´ı a je s nimi sv´az´an ovladaˇc. Pˇr´ıklad: reproduktor, tlaˇc´ıtka na ovl´ad´an´ı hlasitosti. • Koncov´ e body (Endpoints) - reprezentuj´ı jednosmˇernou komunikaˇcn´ı rouru3 . IN k hostovi, OUT od hosta.
1
http://www.usb.org/developers/docs/ Pˇredstavena jiˇz v roce 2008, ale v souˇcasn´e dobˇe st´ ale nen´ı masovˇe rozˇs´ıˇrena 3 Kromˇe ˇr´ıdic´ıho koncov´eho bodu, kter´ y je obousmˇern´ y. 2
5
ˇ KAPITOLA 3. SBERNICE USB
6
Obr´ azek 3.1: Pˇrehled hierarchie USB zaˇr´ızen´ı Kromˇe smˇeru je komunikaˇcn´ı roura definov´ana tak´e typem koncov´eho bodu. Existuj´ı tyto: • Control - Pouˇz´ıv´ ana pro konfiguraci zaˇr´ızen´ı. Pˇres tuto rouru se z´ısk´avaj´ı informace o zaˇr´ızen´ı a tak´e se mu pˇres ni pos´ılaj´ı pˇr´ıkazy. Kaˇzd´e zaˇr´ızen´ı disponuje koncov´ ym bodem tohoto typu (tzv. EP0). Slouˇz´ı k enumeraci, coˇz je posloupnost standardizovan´ ych poˇzadavk˚ u a pˇr´ıkaz˚ u od hosta k identifikaci zaˇr´ızen´ı a zjiˇstˇen´ı potˇrebn´eho ovladaˇce. Pˇrenos mal´eho mnoˇzstv´ı dat, kde je doruˇcen´ı garantov´ano. • Bulk - Slouˇz´ı k pˇrenos˚ um vˇetˇs´ıho mnoˇzstv´ı dat. Doruˇcen´ı je garantov´ano, nen´ı vˇsak zaruˇcena ˇs´ıˇrka p´ asma ani moˇzn´e zpoˇzdˇen´ı. Typick´e pouˇzit´ı napˇr. pro tisk´arny, pamˇeti, s´ıt’ov´ a zaˇr´ızen´ı atd. • Isochronous - Slouˇz´ı tak´e k pˇrenos˚ um vˇetˇs´ıho mnoˇzstv´ı dat. Je sice garantov´ano maxim´ aln´ı zpoˇzdˇen´ı, nen´ı vˇsak garantov´ano doruˇcen´ı. Typick´e pouˇzit´ı je u audio/video zaˇr´ızen´ı. • Interrupt - Vhodn´e pro ˇcast´e pˇrenosy mal´eho mnoˇzstv´ı dat. Garantov´ano doruˇcen´ı, maxim´ aln´ı zpoˇzdˇen´ı i ˇs´ıˇrka p´ asma. Typick´e pouˇzit´ı napˇr. u kl´avesnic a myˇs´ı. V´ yhodou je dˇelen´ı zaˇr´ızen´ı do tˇr´ıd a podtˇr´ıd podle jejich typu. U komunikace s takov´ ymito zaˇr´ızen´ımi je komunikace standardizov´ana podobnˇe jako tomu je u enumerace. Zaˇr´ızen´ı, kter´e spad´a do nˇejak´e tˇr´ıdy, pak mus´ı b´ yt schopno reagovat na vˇsechny poˇzadavky, kter´e tato tˇr´ıda definuje. S t´ımto principem m˚ uˇze existovat jednotn´ y ovladaˇc pro danou tˇr´ıdu zaˇr´ızen´ı. Napˇr. typicky obsahuje operaˇcn´ı syst´em jeden ovladaˇc pro tˇr´ıdu flash disk˚ u. Po pˇripojen´ı flash disku pak nen´ı tˇreba dod´ avat speci´ aln´ı ovladaˇc, ale je pouˇzit obecn´ y ovladaˇc pro flash disk v operaˇcn´ım syst´emu. Pokud zaˇr´ızen´ı nespad´a do ˇz´adn´e konkr´etn´ı tˇr´ıdy, je potˇreba pro nˇej dodat speci´ aln´ı ovladaˇc. To je tˇreba pˇr´ıpad naˇseho CAN-USB pˇrevodn´ıku.
Kapitola 4
Architektura ARM 4.1 4.1.1
Obecnˇ e Popis
ARM je 32-bitov´ a RISC (Reduced instruction set computer) architektura souboru instrukc´ı (ISA) vyv´ıjen´ a spoleˇcnost´ı ARM Holdings. Spoleˇcnost nevyr´ab´ı vlastn´ı procesory, ale vˇenuje se v´ yvoji procesorov´ ych jader, kter´e pak pod licenc´ı poskytuje v´ yrobc˚ um. V´ yrobci pak ke standardizovan´emu j´ adru pˇrid´ avaj´ı vlastn´ı periferie a tento jednotn´ y integrovan´ y obvod prezentuj´ı veˇrejnosti jako v´ ysledn´ y mikroprocesor. Podle spoleˇcnosti ARM pˇredstavuj´ı jejich procesory od roku 2009 pˇribliˇznˇe 90% veˇsker´ ych vestavˇen´ ych 32-bitov´ ych RISC procesor˚ u. Jejich licenci vyuˇz´ıv´a nˇekolik des´ıtek v´ yrobc˚ u a uplatnˇen´ı nach´ azej´ı v aplikac´ıch od mobiln´ıch telefon˚ u, tablet˚ u, hern´ıch konzol´ı aˇz po oblasti pr˚ umyslov´e automatizace.
4.1.2
Historie spoleˇ cnosti
V roce 1983 firma Acorn Computers zaˇcala s projektem Acorn RISC Machine a v roce 1985 byl pˇredstaven historicky prvn´ı ARM procesor. P˚ uvodn´ı z´amˇer byl vyr´abˇet procesory pro PC, coˇz vy´ ustilo v roce 1987 k pˇredstaven´ı osobn´ıho poˇc´ıtaˇce Acorn Archimedes, zaloˇzen´eho na architektuˇre ARM. Na konci osmdes´at´ ych let spolupracovaly s Acorn firmy Apple Computer a VLSI Technology na v´ yvoji nov´eho j´adra ARM. To dalo v roce 1990 oddˇelen´ım v´ yvojov´eho t´ ymu vzniknout nov´e spoleˇcnosti Advanced RISC Machines Ltd. s c´ılem vytvoˇrit nov´ y mikroprocesorov´ y standard. V´ yznam akronymu ARM byl tedy upraven na Advanced RISC Machine. Jiˇz po roce pak bylo pˇredstaveno prvn´ı RISC j´adro pouˇziteln´e jako vestavˇen´e - ARM6 a byla tak odstartov´ ana nov´a ´era mikroprocesor˚ u a mikropoˇc´ıtaˇc˚ u. V roce 1998 v dobˇe vstupu na burzu pak probˇehlo pˇrejmenov´an´ı spoleˇcnosti na souˇc´asn´ y n´azev ARM Holdings.
7
KAPITOLA 4. ARCHITEKTURA ARM
4.2 4.2.1
8
Vhodn´ eˇ reˇ sen´ı pro realizaci pˇ revodn´ıku Moˇ znosti realizace
V z´asadˇe existuj´ı 3 z´ akladn´ı moˇznosti, jak lze realizovat mikroprocesorov´ y obvod s periferiemi. V naˇsem pˇr´ıpadˇe s USB a CAN pro realizaci CAN-USB pˇrevodn´ıku: • Mikroprocesor m´ a periferii integrovanou pˇr´ımo v ˇcipu od v´ yrobce. • Periferie je extern´ı s´eriovˇe vyr´ abˇen´ y integrovan´ y obvod. • Pouˇzit´ı IP (Intellectual Property) core pro programovateln´e logick´e obvody (FPGA, CPLD). IP core je v n´ avrhu hardware komplexn´ı funkˇcn´ı blok, kter´ y implementuje dan´ y element, tedy i nejr˚ uznˇejˇs´ı periferie. Je implementov´an v nˇekter´em z HDL (Hardware Description Language) jazyk˚ u (Verilog, VHDL) a m˚ uˇze b´ yt tak pˇr´ımo pouˇzit v programovateln´ ych logick´ ych obvodech. Licencov´ an´ı z´ avis´ı na vlastn´ıkovi, existuje vˇsak tak´e v´ yvoj open source blok˚ u1 , kde lze z´ıskat mnoho hardwarov´ ych n´avrh˚ u pod svobodn´ ymi licencemi. V´ yjimkou nejsou ani implementace ˇradiˇc˚ u pro CAN a USB. Pokud bychom volili variantu pouˇzit´ı extern´ıho obvodu, nese to s sebou v´ yhody i nev´ yhody. Pˇr´ıkladem ˇcip˚ u od firmy Philips2 m˚ uˇze b´ yt pro USB PDIUSBD12, pro CAN SJA1000. V´ yhoda pr´ avˇe tˇreba ˇradiˇce CAN SJA1000 ˇci jin´ ych (Intel i82527, Microchip MCP2510, Freescale MSCAN atd.) je ta, ˇze jsou standardnˇe pouˇz´ıvany a existuje tak pro nˇe vcelku ˇsirok´a podpora. Pro programov´e vybaven´ı obsluhy tˇechto standardn´ıch ˇcip˚ u pak lze tedy napˇr. ˇcerpat z nˇekter´ ych jiˇz hotov´ ych otevˇren´ ych ˇreˇsen´ı. Nev´ yhodou tohoto ˇreˇsen´ı je samozˇrejmˇe potˇreba v´ıce m´ısta na desce ploˇsn´eho spoje a d´ale sloˇzitost obvodu, kdy je nutn´e zajistit propojen´ı ˇradiˇce s procesorem. To vede k pouˇzit´ı mnoha propojovac´ıch vodiˇc˚ u ˇci k pouˇzit´ı relativnˇe pomal´ ych s´eriov´ ych sbˇernic (napˇr. SPI). Dalˇs´ı nespornou v´ yhodou integrovan´ ych periferi´ı oproti extern´ım jsou niˇzˇs´ı energetick´e n´aroky. V´ yrobci procesor˚ u (a zejm´ena filozofie procesor˚ u ARM na tomto stav´ı) zav´adˇej´ı vysoce optimalizovan´ y energetick´ y koncept. Ten je zahrnuje r˚ uzn´e usp´avac´ı m´ody s odpojov´an´ım zdroj˚ u hodinov´ ych sign´ al˚ u ˇci samotn´eho nap´ajen´ı od periferi´ı a d´ale pouˇzit´ı v´ıce vnitˇrn´ıch sbˇernic s rozd´ıln´ ymi pracovn´ımi frekvencemi podle potˇreb jednotliv´ ych periferi´ı a jejich propojen´ı pˇrechodov´ ymi m˚ ustky. V neposledn´ı ˇradˇe vede integrace do jednoho ˇcipu ke zkr´acen´ı spoj˚ u a t´ım i zpoˇzdˇen´ı sign´ al˚ u. V dneˇsn´ı dobˇe je na trhu jiˇz mnoho mikroprocesor˚ u od r˚ uzn´ ych v´ yrobc˚ u s nejr˚ uznˇejˇs´ımi intern´ımi periferiemi, CAN a USB nevyj´ımaje. Jejich pouˇzit´ı je tak pro u ´ˇcely CAN-USB pˇrevodn´ıku nejsch˚ udnˇejˇs´ı.
4.2.2
Porovn´ an´ı procesorov´ ych ˇ rad
Spoleˇcnost ARM dˇel´ı svoje procesory do tˇrech z´akladn´ıch skupin podle jejich architektury, v´ ykonu, schopnost´ı, efektivnosti a vhodnosti pouˇzit´ı: 1 2
napˇr. OpenCores - http://opencores.org/ Dnes m´ a toto odvˇetv´ı na starosti jejich dceˇrin´ a firma NXP
KAPITOLA 4. ARCHITEKTURA ARM
9
• Classic ARM Processors • ARM Cortex Embedded Processors • ARM Cortex Application Processors Classic ARM Processors zahrnuje procesory ˇrady ARM7, ARM9 a ARM11. ARM7 je klasick´a rodina procesor˚ u, kter´ a byla nesm´ırnˇe u ´spˇeˇsn´a a kterou si firma ARM otevˇrela dveˇre do digit´ aln´ıho svˇeta. V souˇcasn´e dobˇe je vˇsak pˇrekon´ana a jej´ı pouˇzit´ı pro nov´a zaˇr´ızen´ı nen´ı doporuˇceno. ARM9 a ARM11 pak zahrnuj´ı r˚ uznˇe v´ ykonn´e procesory s rozmanit´ ymi vlastnostmi a zp˚ usoby aplikace. ARM Cortex Embedded Processors zahrnuje dvˇe ˇrady procesor˚ u a to Cortex-M a Cortex-R. Procesory z ˇrady Cortex-M jsou urˇceny prim´arnˇe pro deterministick´e mikrokontrol´erov´e3 aplikace, procesory z ˇrady Cortex-R jsou pak urˇceny pro v´ ykonn´e real-time aplikace a jsou tak ˇcasto vyuˇz´ıv´ any v kombinaci s nˇejak´ ym operaˇcn´ım syst´emem re´aln´eho ˇcasu (RTOS). ARM Cortex Application Processors jsou procesory ˇrady Cortex-A. To jsou jiˇz vysoce v´ ykonn´e procesory pracuj´ıc´ı s frekvencemi v jednotk´ach GHz urˇcen´e pro operaˇcn´ı syst´emy (Android, Linux, Symbian, Windows Phone atd.) a pouˇz´ıvan´e v r˚ uzn´ ych aplikac´ıch od tablet˚ u a smartphon˚ u pˇres routery a digit´aln´ı televize. Rozdˇelen´ı je moˇzn´e vidˇet na obr´ azku 4.1 (pˇrevzat´eho z [7]).
3
Mikrokontrol´er (anglicky microcontroller) je oznaˇcen´ı jednoˇcipov´eho mikropoˇc´ıtaˇce vhodn´eho pro pouˇzit´ı v ˇr´ızen´ı
KAPITOLA 4. ARCHITEKTURA ARM
10
Obr´ azek 4.1: Rozdˇelen´ı procesor˚ u ARM
4.2.3
V´ ybˇ er vhodn´ eho procesorov´ eho j´ adra
Z uveden´eho srovn´ an´ı lze vyvodit, ˇze pro realizaci CAN-USB pˇrevodn´ıku nem´a smysl uvaˇzovat nad procesory z ˇrady Cortex-A ani Cortex-R, protoˇze pro u ´ˇcely jednoduch´eho vestavˇen´eho zaˇr´ızen´ı jsou v´ ykonem i funkcionalitou pˇredimenzov´any, coˇz by se zcela urˇcitˇe prom´ıtlo na cenˇe. Lze uvaˇzovat tedy nad ˇradou Cortex-M nebo nad nˇekter´ ym ze skupiny klasick´ ych procesor˚ u. V tomto ohledu je tˇreba uvaˇzovovat nad uplatnˇen´ım. Sbˇernice CAN je hojnˇe vyuˇz´ıv´ana v pr˚ umyslov´e automatizaci. Nejsp´ıˇse tedy m´a smysl pro pr´aci s touto sbˇernic´ı (v tomto pˇr´ıpadˇe ve funkci pˇrevodn´ıku) volit stejn´ y typ procesoru, kter´ y se pouˇz´ıv´a pro jej´ı nejˇcastˇejˇs´ı aplikaci, tedy jako MCU (Microcontroller Unit). CAN-USB pˇrevodn´ık by tak mohl fungovat nad stejn´ ym zaˇr´ızen´ım, kter´e se pouˇz´ıv´a pro re´alnou aplikaci s mikrokontrol´erem (napˇr. ve funkci ˇr´ızen´ı motoru). To pˇrin´ aˇs´ı mimo jin´e v´ yhodu moˇznosti snadn´eho rozˇs´ıˇren´ı funkcionality dan´e aplikace o funkcionalitu CAN-USB pˇrevodn´ıku, napˇr. pro diagnostick´e u ´ˇcely. Tomuto poˇzadavku tedy plnˇe vyhovuje procesorov´a ˇrada Cortex-M. Tak´e proto, ˇze podle spoleˇcnosti ARM se tato ˇrada stala celosvˇetov´ ym pr˚ umyslov´ ym standardem mezi mikrokont-
KAPITOLA 4. ARCHITEKTURA ARM
11
rol´ery, o cemˇz svˇedˇc´ı i fakt, ˇze licence poskytuje v´ıce neˇz 40ti spoleˇcnostem v ˇcele s Freescale, NXP Semiconductors, STMicroelectronics, Texas Instruments a Toshiba. ˇ Radu Cortex-M tvoˇr´ı nˇekolik procesorov´ ych jader, kter´e se liˇs´ı v´ ykonnost´ı a aplikaˇcn´ım vyuˇzit´ım. Konkr´etnˇe se jedn´ a o: • Cortex-M0 • Cortex-M0+ • Cortex-M1 • Cortex-M3 • Cortex-M4 Cortex-M1 je navrˇzen speci´ alnˇe pro pouˇzit´ı v programovateln´ ych hradlov´ ych pol´ıch (FPGA). Cortex-M0, Cortex-M0+ a Cortex-M3 jsou prim´arnˇe navrˇzeny pro vyuˇzit´ı v MCU aplikac´ıch. Vyznaˇcuj´ı se n´ızkou spotˇrebou, malou velikost´ı a vysokou efektivitou zpracov´an´ı. Cortex-M3 je nejv´ ykonnˇejˇs´ı, obecnˇe pouˇziteln´ y a podle spoleˇcnosti ARM tvoˇr´ı v souˇcasnosti hlavn´ı vˇetev v oblasti mikrokontrol´erov´ ych aplikac´ı. Cortex-M4 vych´az´ı koncepˇcnˇe z Cortex-M3 a pˇrid´av´a nav´ıc zejm´ena funkcionalitu zpracov´an´ı sign´al˚ u z oblasti sign´alov´ ych procesor˚ u (DSP). Pˇrehled je moˇzn´e vidˇet na obr´azku 4.2 (pˇrevzat´eho z [7]).
Obr´ azek 4.2: Rozdˇelen´ı procesor˚ u ARM ˇrady Cortex-M Pro CAN-USB pˇrevodn´ık se jev´ı jako nejvhodnˇejˇs´ı Cortex-M3. Podle proveden´eho rozboru poskytuje v pomˇeru k ostatn´ım j´adr˚ um relativnˇe vysok´ y v´ ykon s n´ızk´ ymi n´aroky na spotˇrebu, cenu i rozmˇery. Zˇrejmˇe proto je podle spoleˇcnosti ARM tolik obl´ıben a tvoˇr´ı jedniˇcku mezi j´ adry mikrokontrol´er˚ u jak jiˇz bylo uvedeno v´ yˇse. I kv˚ uli tomu, ˇze sbˇernice CAN je v ˇr´ıdic´ıch pr˚ umyslov´ ych oblastech hojnˇe vyuˇz´ıv´ana, je pouˇzit´ı procesoru s j´adrem Cortex-M3 vhodn´e. Podrobnˇejˇs´ı informace o jednotliv´ ych procesorov´ ych ˇrad´ach, samotn´ ych procesorech, aplikac´ıch i srovn´ an´ı lze nal´ezt na internetov´ ych str´ank´ach spoleˇcnosti ARM [7].
KAPITOLA 4. ARCHITEKTURA ARM
4.2.4
12
V´ ybˇ er vhodn´ eho mikrokontrol´ eru s j´ adrem ARM Cortex-M3
Pro v´ ybˇer vhodn´eho procesoru tedy stanov´ıme z´akladn´ı krit´eria: • j´adro ARM Cortex-M3 • intern´ı pamˇet FLASH alespoˇ n 128kB • intern´ı pamˇet RAM alespoˇ n 32kB • integrovan´e periferie CAN a USB (USB Device) T´ımto s´ıtem neproˇsla nab´ıdka spoleˇcnosti Atmel, jelikoˇz v dobˇe psan´ı t´eto pr´ace nenab´ızela ˇz´ adn´ y Cortex-M3 s integrovan´ ym CAN. Tuto moˇznost nab´ızej´ı pouze u nˇekter´ ych procesor˚ u z rodiny ARM7 a ARM9. Spoleˇcnost Freescale stav´ı svoji nab´ıdku mikrokontrol´er˚ u ARM pouze na j´ adrech Cortex-M0+ a Cortex-M4. N´asleduje struˇcn´ y pˇrehled nab´ıdek procesor˚ u od v´ yrobc˚ u: • NXP - tabulka 4.1 • STMicroelectronics - tabulka 4.2 • Texas Instruments - tabulka 4.3 • Fujitsu - tabulka 4.4 • Toshiba - 4.5 Jedn´a se sp´ıˇse o orientaˇcn´ı pˇrehled nˇekolika produkt˚ u pro r´amcovou pˇredstavu, jelikoˇz celkov´ y v´ yˇcet by byl pˇr´ıliˇs rozs´ ahl´ y a nav´ıc by nepˇrin´aˇsel o moc vˇetˇs´ı vypov´ıdaj´ıc´ı hodnotu. Poloˇzku tabulky tvoˇr´ı n´ azev4 , maxim´aln´ı pracovn´ı frekvence, velikost intern´ıch pamˇet´ı Flash a RAM, poˇcet nez´ avisle vyuˇziteln´ ych CAN kan´al˚ u, proveden´ı USB periferie5 a nakonec orientaˇcn´ı cena. Ta byla vˇzdy stanovena pro jeden konkr´etn´ı produkt, dostupn´ y u americk´eho distributora Digi-Key Corporation. Pokud cena nen´ı uvedena, nepodaˇrilo se ji od distributora zjistit.
4 jedn´ a se o obecn´ y n´ azev ˇcipu, nikoliv o jm´eno specifick´e souˇca ´stky, jelikoˇz m˚ uˇze existovat proveden´ı s r˚ uzn´ ymi pouzdry a r˚ uzn´ ym poˇctem pin˚ u 5 existuje-li pouze podpora pro USB Device, ˇci nav´ıc pro USB Host pˇr´ıpadnˇe On-The-Go
13
KAPITOLA 4. ARCHITEKTURA ARM
Name
fmax (MHz)
FLASH (kB)
RAM (kB)
CAN
USB D, H, OTG
Price (USD/1ks)
LPC1754
100
128
32
1
D/H/OTG
8,25
LPC1756
100
256
32
2
D/H/OTG
8,48
LPC1758
100
512
64
2
D/H/OTG
10,63
LPC1759
120
512
64
2
D/H/OTG
10,63
LPC1764
100
128
32
2
D
8,13
LPC1768
100
512
64
2
D/H/OTG
11,25
LPC1769
120
512
64
2
D/H/OTG
11,75
LPC1774
120
128
40
2
D
8,93
LPC1778
120
512
96
2
D/H/OTG
12,13
LPC1788
120
512
96
2
D/H/OTG
13,09
Tabulka 4.1: NXP
Name
fmax (MHz)
FLASH (kB)
RAM (kB)
CAN
USB D, H, OTG
Price (USD/1ks)
STM32F105RC
72
256
64
2
D/H/OTG
9,89
STM32F107RB
72
128
48
2
D/H/OTG
8,25
STM32F215ZE
120
512
128
2
D/H/OTG
13,26
STM32F205VC
120
256
96
2
D/H/OTG
9,86
STM32F205RF
120
768
128
2
D/H/OTG
11,19
STM32F407VG
168
1024
192
2
D/H/OTG
12,78
Tabulka 4.2: STMicroelectronics
Name
fmax (MHz)
FLASH (kB)
RAM (kB)
CAN
USB D, H, OTG
Price (USD/1ks)
LM3S5632
50
128
32
1
D/H
11,38
LM3S5G51
80
384
64
2
D/H/OTG
14,19
LM3S5C56
80
512
64
1
D/H/OTG
14,52
LM3S9B95
80
256
96
2
D/H/OTG
17,49
LM3S9C97
80
512
64
2
D/H/OTG
18,70
LM3S9D90
80
512
96
2
D/H/OTG
19,40
Tabulka 4.3: Texas Instruments
14
KAPITOLA 4. ARCHITEKTURA ARM
Name
fmax (MHz)
FLASH (kB)
RAM (kB)
CAN
USB D, H, OTG
Price (USD/1ks)
MB9BF504N/R
80
256
32
2
D/H
8,60
MB9BF505N/R
80
384
48
2
D/H
-
MB9BF506N/R
80
512
64
2
D/H
9,00
MB9BF514N/R
144
288
32
2
D/H
-
MB9BF515N/R
144
414
48
2
D/H
-
MB9BF516N/R
144
544
64
2
D/H
-
MB9BF516T/S
144
512
64
2
D/H
-
MB9BF517T/S
144
768
96
2
D/H
-
MB9BF518T/S
144
1024
128
2
D/H
-
Tabulka 4.4: Fujitsu
Name
fmax (MHz)
FLASH (kB)
RAM (kB)
CAN
USB D, H, OTG
Price (USD/1ks)
TMPM369FD
80
512
128
1
D/H
12,00
TMPM369FY
80
256
64
1
D/H
-
TMPM368FD
80
512
128
1
D/H
-
TMPM368FY
80
256
64
1
D/H
-
TMPM368FW
80
128
48
1
D/H
-
Tabulka 4.5: Toshiba
Kapitola 5
Firmware pˇ revodn´ıku CAN-USB 5.1
Anal´ yza u ´ kolu
C´ılem bylo vytvoˇrit firmware pro hardware realizovan´ y spoleˇcnost´ı PiKRON, kter´ y je zaloˇzen´ y na mikrokontrol´eru LPC1768. Z´ akladem firmware byly zdrojov´e k´ody firmware pro starˇs´ı CAN-USB pˇrevodn´ık implementovan´ y v roce 2008 v r´amci bakal´aˇrsk´e pr´ace J. Kˇr´ıˇze s ˇ c sbˇernice CAN pˇripojen´y k PC pˇres sbˇernici USB 1 . Tento pˇrevodn´ık je zaloˇzen n´azvem Radiˇ na mikrokontrol´eru LPC2148, obsahuje extern´ı CAN ˇradiˇc SJA1000 a podporuje ho ovladaˇc LinCAN. V tomto starˇs´ım pˇrevodn´ıku byl pouˇzit extern´ı ˇradiˇc SJA1000, vych´azlo se tedy z podpory ovladaˇce LinCAN pro PC pro ˇradiˇc SJA1000 pouˇz´ıvan´ y u PCI karet. Tato funkcionalita se pot´e adaptovala pro pouˇzit´ı ve vestavˇen´em zaˇr´ızen´ı bez operaˇcn´ıho syst´emu. D´ale bylo tak´e nutn´e vytvoˇrit emulaci propojovac´ı sbˇernice mezi ˇradiˇcem a GPIO piny mikroprocesoru. V textu pr´ace J. Kˇr´ıˇz p´ıˇse, ˇze p˚ uvodnˇe byla dokonce snaha vyuˇz´ıt funkc´ı pro SJA1000 v ovladaˇci ˇ sen´ı vˇsak bylo velmi LinCAN a ˇc´ıst/zapisovat z/do jeho registr˚ u pˇr´ımo pˇres sbˇernici USB. Reˇ pomal´e a od tohoto ˇreˇsen´ı se upouˇst´ı. Firmware tohoto starˇs´ıho pˇrevodn´ıku vyuˇz´ıv´a mechanism˚ u LinCAN. To je znakov´ y ovladaˇc s d˚ umysln´ ym syst´emem vnitˇrn´ıch front pro specifick´e u ´ˇcely CAN komunikace. Tyto mechanismy svoj´ı strukturou odstiˇ nuj´ı samotnou funkcionalitu od z´avislosti na konkr´etn´ıch typech HW a ˇradiˇc˚ u. Toho se d´ a dobˇre vyuˇz´ıt. Poˇzadavek tedy byl nav´azat na pˇredchoz´ı pˇrevodn´ık ve smyslu pˇrid´ an´ı podpory pro desku a CAN ˇradiˇc souˇcasn´eho pˇrevodn´ıku a z´aroveˇ n prov´est co moˇzn´a nejmenˇs´ı zmˇeny ve zbyl´e funkcionalitˇe. Takto lze pak m´ıt jednotnou funkcionalitu pro r˚ uzn´e pˇrevodn´ıky a podle poˇzadovan´eho typu hardware lze mezi nimi snadno volit napˇr. podm´ınˇenou kompilac´ı.
5.2
ˇ Radiˇ c CAN
Intern´ı periferie CAN mikrokontrol´eru LPC1768 se skl´ad´a ze dvou ˇc´ast´ı. Prvn´ı je samotn´ y ˇradiˇc a druhou Acceptance Filter. Ten slouˇz´ı k hardwarov´emu filtrov´an´ı zpr´av a tvoˇr´ı samostatn´ y modul. Blokov´e sch´ema ˇradiˇce lze vidˇet na obr´azku 5.1 [4]. Struˇcn´ y popis: 1
pr´ ace je dostupn´ a z [8]
15
ˇ ´IKU CAN-USB KAPITOLA 5. FIRMWARE PREVODN
16
• Rozhran´ı k APB bus poskytuje pˇr´ıstup k registr˚ um. • Interface Management Logic (IML) interpretuje pˇr´ıkazy od CPU a poskytuje mu informace o stavech a pˇreruˇsen´ıch. • Transmit Buffer (TXB) pˇredstavuje trojici odes´ılac´ıch buffer˚ u a tvoˇr´ı rozhran´ı mezi IML a Bit Stream Processor (BSP). Kaˇzd´ y Transmit Buffer je schopen pojmout kompletn´ı CAN zpr´ avu urˇcenou pro odesl´an´ı. Z´apis ˇr´ıd´ı CPU, ˇcten´ı pak BSP • Receive Buffer (RXB) pˇredstavuje dvojic´ı pˇrij´ımac´ıch buffer˚ u pro pˇr´ıjem zpr´av z CAN sbˇernice. Koncept dvou buffer˚ u dovoluje CPU zpracov´avat jednu zpr´avu zat´ımco dalˇs´ı je zrovna pˇrij´ım´ ana. Zat´ımco u odes´ıl´an´ı mus´ı b´ yt specifikov´ano, kter´ y buffer se m´a zrovna pouˇz´ıt, u pˇr´ıjmu se o to star´a ˇradiˇc a program´ator toto ˇreˇsit nemus´ı. • Bit Stream Processor (BSP) je sekvencer, kter´ y ˇr´ıd´ı datov´ y proud mezi odes´ılac´ımi a pˇrij´ımac´ımi buffery a mezi CAN sbˇernic´ı. Star´a se tak´e o arbitraci, bit-stuffing a detekuje chyby. • Bit Timing Logic (BTL) se star´a o ˇcasov´an´ı a synchronizaci sbˇernice. • Error Management Logic (EML) dost´av´a ozn´amen´ı o chyb´ach z BSP, zpracov´av´a je a poskytuje BSP a IML informace o statistik´ach chyb.
Obr´ azek 5.1: Blokov´e sch´ema ˇradiˇce CAN Nastaven´ı registr˚ u mikrokontrol´eru pro spr´avnou funkci periferie CAN je n´asleduj´ıc´ı: • Zapnut´ı nap´ ajen´ı. To lze pˇres registr Power Control for Peripherals (PCONP) kde mus´ıme periferii povolit nastaven´ım pˇrisluˇsn´eho bitu (PCCAN1, PCCAN2).
ˇ ´IKU CAN-USB KAPITOLA 5. FIRMWARE PREVODN
17
• Nastaven´ı hodinov´eho sign´ alu. To lze pˇres registr Peripheral Clock Selection (PCLKSEL[0—1]). Jelikoˇz tato periferie spad´a pod skupinu se sbˇernic´ı APB0, pouˇzijeme PCLKSEL0. V tomto registru pak sybolick´e jm´eno PCLK CAN1, PCLK CAN2 znaˇc´ı dvojici bit˚ u, jejichˇz hodnota urˇcuj´ıce dˇel´ıc´ı pomˇer frekvence jako zdroj hodinov´eho sign´alu. Tedy napˇr. hodnota bit˚ u ’00’ = (CPU clock) / 4. Zde je nutn´e upozornit, ˇze PCLK CAN1 a PCLK CAN2 mus´ı b´ yt nastaveny stejnˇe. • Nastaven´ı pin˚ u procesoru. Pouˇzit´ y procesor je konkr´etnˇe LPC1768FDB100. V datasheetu (odkaz)a sch´ematu zapojen´ı lze zjistit, kter´ y pin procesoru mus´ıme nastavit: – pin 46 : P0.0/RD1/TXD3/SDA1 : RD1 - CAN1 receiver input – pin 47 : P0.1/TD1/RXD3/SCL1 : TD1 - CAN1 transmitter output Potˇrebujeme tedy nastavit dva nejspodnˇejˇs´ı piny br´any 0. Pouˇzijeme registr PINSEL0, kter´ y ˇr´ıd´ı funkce spodn´ı poloviny br´any 0. Zde jm´enu pinu opˇet odpov´ıd´a dvojice bit˚ u, jejichˇz hodnota urˇcuje jeho funkci. Je tˇreba tedy nastavit: – jm´eno pinu P0.0 - prvn´ı alternativn´ı funkce hodnota ’01’ - RD1 – jm´ena pinu P0.1 - prvn´ı alternativn´ı funkce hodnota ’01’ - TD1 N´aslednˇe je tˇreba nastavit reˇzim pin˚ u. To provedeme pomoc´ı dvojice registr˚ u. Prvn´ım je PINMODE0, kter´ y urˇcuj´ıce nastaven´ı pull-up/pull-down rezistor˚ u. Dvojice bit˚ u podle jm´ena pinu odpov´ıd´ a: – jm´eno pinu P0.0 - hodnota ’00’ - povolen pull-up – jm´ena pinu P0.1 - hodnota ’00’ - povolen pull-up Druh´ ym je PINMODE0 OD, kter´ y urˇcuj´ıce nastaven´ı reˇzimu open drain. Dvojice bit˚ u podle jm´ena pinu odpov´ıd´ a: – jm´eno pinu P0.0 - hodnota ’00’ - normaln´ı (ne open drain) reˇzim – jm´ena pinu P0.1 - hodnota ’00’ - normaln´ı (ne open drain) reˇzim • Definov´ an´ı ud´ alost´ı v CAN ˇradiˇci, kter´e maj´ı vyvolat pˇreruˇsen´ı (pˇr´ıjem, odesl´an´ı atd.). K tomuto slouˇz´ı CAN Interrupt Enable Register (CAN1IER, CAN2IER) 2 • Inializace registr˚ u ˇradiˇce. Pro fungov´an´ı je nakonec nutn´e v registru CAN Mode (CAN1MOD, CAN2MOD) nastavit stav ˇradiˇce z reset do operaˇcn´ıho stavu.
5.3 5.3.1
Implementace Funkcionalita a struktura LinCAN
Inicializaci ˇradiˇce popsanou v sekci 5.2 je tˇreba zpracovat do programov´eho k´odu. Stejnˇe tak ostatn´ı funkce, kter´e pracuj´ı s registry ˇradiˇce tzn. odes´ıl´an´ı zpr´av, pˇrij´ım´an´ı zpr´av, nastaven´ı ˇcasov´an´ı atd. Tuto funkcionalitu je pak tˇreba slouˇcit s koncepc´ı struktury pouˇzit´e v LinCAN. 2
Samotn´e povolen´ı pˇreruˇsen´ı od CAN periferie je tˇreba nastavit v NVIC.
ˇ ´IKU CAN-USB KAPITOLA 5. FIRMWARE PREVODN
18
V´ ysledkem je tak funkcionalita ovl´ adaj´ıc´ı dan´ y CAN ˇradiˇc se strukturou na b´azi LinCAN. Toto ˇreˇsen´ı pak m˚ uˇze b´ yt s minim´ aln´ı zmˇenou pouˇzito v k´odu pro starˇs´ı pˇrevodn´ık, kde tak vznikne jednotn´ y k´ od pro CAN-USB pˇrevodn´ık viz. 5.1. V z´asadˇe nejvˇetˇs´ı zmˇenou je vol´ an´ı funkce pro nastaven´ı specifick´ ych operac´ı pro dan´ y hardware. V LinCAN je toto reprezentov´ano strukturou struct hwspecops t. Alokace t´eto struktury jiˇz probˇehla a funkce dost´ av´a ukazatel na ni jako parametr. Ve funkci pak pˇriˇrad´ıme ukazatel˚ um na funkce adresy n´ ami vytvoˇren´ ych funkc´ı. Pˇr´ıstup pak d´ale prob´ıh´a pˇres tyto ukazatele. Tento pripcip je v LinCAN obecnˇe pouˇz´ıvan´ y. Funkce tedy m˚ uˇze vypadat: 1 int c a n 2 3 4 5 6 7 8 9 }
l m c 1 r e g i s t e r ( struct h w s p e c o p s t ∗ hwspecops ) { hwspecops−>i n i t h w d a t a = c a n l m c 1 i n i t h w d a t a ; hwspecops−>i n i t c h i p d a t a = c a n l m c 1 i n i t c h i p d a t a ; /∗ . . . ∗/ return 0 ;
Popis struktur i jejich poloˇzek lze naj´ıt v dokumentaci k LinCAN, kter´a je dostupn´a z [8]. Zde pouze pro n´ azornost uvedeny: init hw data - vol´ ana pro inicialici struktury candevice t, kter´a reprezentuje hardwarov´e zaˇr´ızen´ı s CAN. Zde se nastavuje poˇcet ˇradiˇc˚ u atd. Zjednoduˇsen´ y v´ ypis: 1 int c a n 2 3 4 5 6 7 }
l m c 1 i n i t h w d a t a ( struct c a n d e v i c e t ∗ candev ) { candev−>n r a l l c h i p s =1; candev−>f l a g s = 0 ; return 0 ;
init chip data - vol´ ana pro inicialici struktury canchip t, kter´a reprezentuje CAN ˇradiˇc. Zde se nastavuje b´ azov´ a adresa registr˚ u, pracovn´ı frekvence atd. Tato funkce je tak´e zodpovˇedn´ a za nastaven´ı specifick´ ych operac´ı pro dan´ y ˇradiˇc (canchip t->chipspecops). Tyto operace pak reprezentuj´ı samotnou funkcionalitu dan´eho ˇradiˇce tak, jak byla pops´ana na zaˇc´atku t´eto sekce (odes´ılan´ı a pˇrij´ım´an´ı zpr´av aj.). Zjednoduˇsen´ y v´ ypis: 1 int c a n l m c 1 i n i t c h i p d a t a ( struct c a n d e v i c e t ∗ candev , int c h i p n r ) { 2 3 // used CAN1 p e r i p h e r i a l −> CAN1 r e g i s t e r s b a s e 4 candev−>c h i p [ c h i p n r ]−> c h i p b a s e a d d r = CAN1 REGS BASE ; 5 // c l o c k f o r CAN 6 candev−>c h i p [ c h i p n r ]−> c l o c k = s y s t e m f r e q u e n c y / 4 ; 7 8 l p c 1 7 x x f i l l c h i p s p e c o p s ( candev−>c h i p [ c h i p n r ] ) ; 9 10 return 0 ; 11 } 12 13 int l p c 1 7 x x f i l l c h i p s p e c o p s ( struct c a n c h i p t ∗ c h i p ) {
ˇ ´IKU CAN-USB KAPITOLA 5. FIRMWARE PREVODN
19
14 15 chip −>m a x o b j e c t s =1; 16 chip −>c h i p i r q = CAN IRQn ; 17 18 l p c 1 7 x x r e g i s t e r ( chip−>c h i p s p e c o p s ) ; 19 20 return 0 ; 21 } 22 23 int l p c 1 7 x x r e g i s t e r ( struct c h i p s p e c o p s t ∗ c h i p s p e c o p s ) { 24 25 c h i p s p e c o p s −>c h i p c o n f i g = l p c 1 7 x x c h i p c o n f i g ; 26 c h i p s p e c o p s −>p r e w r i t e c o n f i g = l p c 1 7 x x p r e w r i t e c o n f i g ; 27 c h i p s p e c o p s −>send msg = l p c 1 7 x x s e n d m s g ; 28 c h i p s p e c o p s −>wakeup tx = l p c 1 7 x x w a k e u p t x ; 29 c h i p s p e c o p s −>i r q h a n d l e r = l p c 1 7 x x i r q h a n d l e r ; 30 c h i p s p e c o p s −>s e t b i t t i m i n g = l p c 1 7 x x s e t b i t t i m i n g ; 31 32 return 0 ; 33 34 }
5.3.2
Uˇ zivatelsk´ e poˇ zadavky
Pro datov´ y pˇrenos CAN zpr´ av po USB se pouˇz´ıvaj´ı koncov´e body typu bulk. Pˇrenos ˇr´ıdic´ıch poˇzadavk˚ u pro konfiguraci (napˇr. nastaven´ı komunikaˇcn´ıch parametr˚ u sbˇernice) se pak prov´ad´ı pˇres ˇr´ıdic´ı (control) koncov´ y bod tzv. EP0. Bliˇzˇs´ı popis je v sekci 7.4. C´ılem je poskytnout tomuto pˇrevodn´ıku podporu vytvoˇren´ ym s´ıt’ov´ ym ovladaˇcem pro GNU/Linux, kter´ y je zaloˇzen na SocketCAN. Pro tento u ´ˇcel musela b´ yt implementov´ana podpora dvou nov´ ych ˇr´ıdic´ıch poˇzadavk˚ u, specifikovan´ ych makry: • USBCAN VENDOR GET BITTIMING CONST - T´ımto poˇzadavkem si ovladaˇc ˇr´ık´a o zasl´ an´ı hodnot, kter´ ych m˚ uˇze ˇradiˇc nab´ yvat pro u ´ˇcely ˇcasov´an´ı. • USBCAN VENDOR SET BITTIMING - T´ımto poˇzadavkem ovladaˇc nastavuje konkr´etn´ı parametry ˇcasov´ an´ı (Bit timing registr).
Kapitola 6
SocketCAN SocketCAN je projekt implementuj´ıc´ı aplikaˇcn´ı rozhran´ı pro pˇr´ıstup na sbˇernici CAN a model ovladaˇc˚ u pro j´ adro Linux. Od j´adra 2.6.25 je souˇc´ast´ı mainline. SocketCAN vyuˇz´ıv´a BSD Socket API, Linuxov´ y s´ıt’ov´ y stack a zpˇr´ıstupˇ nuje zaˇr´ızen´ı CAN jako s´ıt’ov´a rozhran´ı. API pro user-space aplikace je tedy koncipov´ano tak, aby se v´ yvoj tˇechto aplikac´ı co nejv´ıce ’ pˇribl´ıˇzil obecnˇe zn´ am´emu s´ıt ov´emu programov´an´ı pro TCP/IP protokoly pomoc´ı socket˚ u. V´ yvoj ovladaˇc˚ u pak vych´ az´ı z tvorby s´ıt’ov´ ych ovladaˇc˚ u pro ˇsiroce rozˇs´ıˇren´ y model ovladaˇc˚ u s´ıtˇe Ethernet.
6.1
Linux a jeho s´ıt’ov´ y subsyst´ em
S´ıt’ov´ y substyst´em Linuxu je znaˇcnˇe flexibiln´ı. Jeho rozdˇelen´ı po vrstv´ach s pˇr´ıkladem rodiny protokol˚ u PF INET, kter´ a implementuje TPC/IP, m˚ uˇzeme vidˇet na obr´azku 6.1 v ˇc´asti a (pˇrevzat´eho z [3]). Z pohledu aplikaˇcn´ı vrstvy zde existuje standardn´ı POSIX socket API, kter´e tvoˇr´ı rozhran´ı j´ adra. User-space aplikace mohou tedy pouˇz´ıvat standardn´ı syst´emov´a vol´an´ı socket(), bind(), read(), write() apod. D´ale n´asleduje protokolov´a vrstva. Tu tvoˇr´ı rodiny protokol˚ u. Kaˇzd´ a rodina protokol˚ u m˚ uˇze implementovat r˚ uzn´e mnoˇzstv´ı rozliˇcn´ ych protokol˚ u. Zde v pˇr´ıpadˇe PF INET jde o protokoly TCP, UDP, apod. D´ale se nach´az´ı vrstva, kter´a m´a za u ´kol pakety pˇred´ avat pˇr´ısluˇsn´ ym ovladaˇc˚ um s´ıt’ov´ ych zaˇr´ızen´ı. Ovladaˇce tvoˇr´ı spodn´ı u ´roveˇ n a maj´ı za u ´kol data fyzicky odeslat.
20
KAPITOLA 6. SOCKETCAN
21
Obr´ azek 6.1: S´ıt’ov´ y subsyt´em Linuxu a funkce PF CAN
6.2
CAN a s´ıt’ov´ y pˇ r´ıstup
Koncept SocketCAN stav´ı na zaveden´e Linuxov´e s´ıt’ov´e infrastruktuˇre, ovˇsem sbˇernice CAN je charakterem odliˇsn´ a od s´ıt’ov´ ych standard˚ u, kter´e vyuˇz´ıvaj´ı TCP/IP. Z´asadn´ı je absence adresace, jakou zn´ ame napˇr. ze s´ıtˇe Ethernet. Nelze tedy pˇr´ımo adresovat pˇr´ıjemce. Sbˇernice CAN funguje na principu broadcast, tedy rozesl´an´ı zpr´avy vˇsem ostatn´ım pˇripojen´ ym uzl˚ um. Nen´ı moˇzn´e jednotliv´e CAN zpr´ avy adresovat konkr´etn´ımu zaˇr´ızen´ı pˇr´ımo na fyzick´e/linkov´e u ´rovni. Kaˇzd´ a CAN zpr´ ava obsahuje identifik´ator, kter´ y je pouˇzit k arbitr´aˇzi sbˇernice a kter´ y m˚ uˇzeme ch´ apat do jist´e m´ıry jako adresu odes´ılatele. Srovn´an´ı r´amc˚ u z adresaˇcn´ıho hlediska je naznaˇceno na obr´ azku 6.2. ˇ Casto je totiˇz kaˇzd´emu zaˇr´ızen´ı pˇridˇelen identifik´ator (nebo urˇcit´ y rozsah identifik´ator˚ u), pod kter´ ym vys´ılaj´ı zpr´ avy na sbˇernici. Ostatn´ı zaˇr´ızen´ı jsou pak schopna podle tohoto identifik´atoru zjistit, jestli zpr´ ava pˇrich´az´ı od zdroje, kter´ y patˇr´ı do oblasti jejich z´ajmu ˇci nikoliv. Mohou se tak rozhodnout, zda zpr´avu zpracovat ˇci ignorovat. K tomuto u ´ˇcelu byla vytvoˇrena nov´a rodina protokol˚ u PF CAN. Integrace t´eto rodiny protokol˚ u do s´ıt’ov´eho stacku Linuxu m˚ uˇze ˇcerpat ze st´avaj´ıc´ıh rodin s´ıt’ov´ ych protokol˚ u, jako je DECnet, Appletalk nebo AX.25, kter´e tak´e vyuˇz´ıvaj´ı s´ıt’ovou infrastrukturu Linuxu
22
KAPITOLA 6. SOCKETCAN
Ethernet Frame Preamble
DestAddr
SrcAddr
Type
DestAddr
SrcAddr
Data
CRC
8 Bytes
6 Bytes
6 Bytes
2 Bytes
6 Bytes
6 Bytes
max 1500 Bytes
4 Bytes
Media Access Control Header (MAC)
CAN Frame Preamble 1 Bit
CAN−Indentifier 11 Bit (SFF) / 29 Bit (EFF)
Remoteflag 1 Bit (RTR)
DLC 4 Bit
Data 0 − 8 Byte
CRC 16 Bit
ACK 2 Bit
EOM 7 Bit
CAN−Arbitrationfield
Obr´ azek 6.2: Rozd´ıln´ y koncept adresace u Ethernetu a CAN
s r˚ uzn´ ym hardwarem a r˚ uzn´ ymi protokoly [2].
6.3 6.3.1
Rodina protokol˚ u PF CAN Struktura
J´adro (core) SocketCANu tvoˇr´ı jadern´ y modul (kernel module), kter´ y implementuje rodinu protokol˚ u PF CAN. Samotn´e transportn´ı protokoly jsou implementov´any opˇet jako jadern´e moduly, kter´e jsou podle potˇreb dynamicky nahr´av´any za bˇehu. Samotn´ y modul j´adra SocketCANu tedy nem˚ uˇze b´ yt pouˇzit, aniˇz by nebyl nahr´an alespoˇ n jeden protokolov´ y modul.
6.3.2
Local loopback
Rodina protokol˚ u PF CAN a jej´ı protokol CAN RAW podporuj´ı tzv. multi-application access, tedy moˇznost zpˇr´ıstupnit jedno CAN rozhran´ı v´ıce aplikac´ım souˇcasnˇe. Mus´ı tedy platit, ˇze informace o veˇsker´em dˇen´ı na tomto rozhran´ı mus´ı b´ yt nˇejak´ ym zp˚ usobem sd´ılen´e, tedy pˇr´ıstupn´e vˇsem aplikac´ım. Pokud se jedn´a o pˇr´ıjem, pˇrijat´ y CAN r´amec je pˇrenesen ke vˇsem aplikac´ım. Ovˇsem pokud jedna aplikace vyˇsle CAN zpr´avu, mus´ı se to ostatn´ı aplikace bˇeˇz´ıc´ı na stejn´em syst´emu dozvˇedˇet, jako kdyby bˇeˇzely na jin´ ych syst´emech propojen´ ych CAN sbˇernic´ı s vlastn´ımi CAN rozhran´ımi. Existuje tedy mechanismus tzv. local loopback, kdy jsou o vysl´ an´ı CAN zpr´ avy na sbˇernici jednou aplikac´ı informov´any ostatn´ı. Obvykle se tak stane v obsluze pˇreruˇsen´ı vyvolan´e pˇri u ´spˇeˇsn´em pˇrenosu zpr´avy, a to uloˇzen´ım pr´avˇe odeslan´e zpr´ avy do pˇrij´ımac´ı fronty. Je to z d˚ uvodu zachov´an´ı spr´avn´eho poˇrad´ı CAN zpr´av. Kdyˇz by prob´ıhala tato signalizace ihned po odesl´an´ı, tak napˇr. CAN zpr´ava s n´ızkou prioritou (vysok´e ID), by mˇela velk´ y probl´em s arbitrac´ı sbˇernice. Mezit´ım by rozhran´ı mohlo klidnˇe pˇrijmout jin´e zpr´ avy s vyˇsˇs´ı prioritou, neˇz by doˇslo k samotn´emu fyzick´emu odesl´an´ı zpr´avy na sbˇernici a poˇrad´ı by tak bylo nespr´avn´e. Pˇr´ıjem CAN r´ amce na stejn´em soketu, ze kter´eho byl odesl´an je standardnˇe vypnut´ y. Lze to samozrˇejmˇe zmˇenit. Stejnˇe tak lze zmˇenit nastaven´ı socketu (kaˇzd´eho) v reakci na
KAPITOLA 6. SOCKETCAN
23
loopback funcionalitu. Tato a mnoh´ a jin´a nastaven´ı se prov´ad´ı pˇr´ımo z uˇzivatelsk´e aplikace, pomoc´ı syst´emov´eho vol´ an´ı setsockopt().
6.3.3
Datov´ a cesta
Pro fungov´ an´ı datov´e cesty CAN zpr´av je nutn´a identifikace datov´ ych buffer˚ u a s´ıt’ov´ ych zaˇr´ızen´ı. Packet scheduler je totiˇz sd´ılen´ y prostˇredek vˇsech s´ıt’ov´ ych zaˇr´ızen´ı, at’ jiˇz se jedn´a o CAN, ˇci Ethernet. Je-li socket buffer oznaˇcen jako ETH P CAN, znamen´a to, ˇze obsahuje CAN zpr´avy. S´ıt’ov´emu zaˇr´ızen´ı je nastaven ARPHRD CAN jako typ hardwarov´eho rozhran´ı. Identifikujeme tak s´ıt’ov´e zaˇr´ızen´ı, kter´e bude zpracov´avat datov´e buffery oznaˇcen´e jako ETH P CAN. Oboj´ı je nutn´e prov´est v ovladaˇci dan´eho s´ıt’ov´eho zaˇr´ızen´ı. Touto identifikac´ı je doc´ıleno toho, ˇze rodina protkol˚ u PF CAN bude zodpovˇedn´a za zpracov´an´ı datov´ ych buffer˚ u, oznaˇcen´ ych jako ETH P CAN, tedy nesouc´ıch CAN zpr´avy.
Kapitola 7
Ovladaˇ c pˇ revodn´ıku CAN-USB 7.1
Jadern´ e moduly
Linux je modul´ arn´ı monolitick´e j´ adro operaˇcn´ıho syst´emu. Zachov´av´a architektonick´ y koncept monolitick´eho j´ adra, tedy ˇze j´ adro bˇeˇz´ı v jednom spoleˇcn´em oddˇelen´em pamˇet’ov´em prostoru (tzv. kernel space). D´ ale vˇsak umoˇzn ˇuje zav´adˇet speci´aln´ı moduly do syst´emu pˇr´ımo za bˇehu. Tento jadern´ y modul m˚ uˇze reprezentovat ovladaˇc zaˇr´ızen´ı, podporu souborov´eho syst´emu atd. Pˇr´ımo v j´ adˇre pak b´ yv´ a zakompilov´ana vˇetˇsinou pouze funkcionalita d˚ uleˇzit´a pro bˇeh syst´emu a vˇsechno ostatn´ı si syst´em ˇci uˇzivatel m˚ uˇze nahr´at za bˇehu podle potˇreby. To vede k zmenˇsen´ı n´ arok˚ u na syst´emov´e zdroje a znaˇcn´e flexibilitˇe. Pˇr´ıklad nejjednoduˇsˇs´ıho jadern´eho modulu (pˇrevzat´ y z [1]): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include
#include MODULE LICENSE( ” Dual BSD/GPL” ) ; s t a t i c int h e l l o i n i t ( void ) { p r i n t k (KERN ALERT ” H e l l o , world \n” ) ; return 0 ; } s t a t i c void h e l l o e x i t ( void ) { p r i n t k (KERN ALERT ” Goodbye , c r u e l world \n” ) ; } module init ( h e l l o i n i t ) ; module exit ( h e l l o e x i t ) ;
1 - 2 → Vkl´ ad´ an´ı hlaviˇckov´ ych soubor˚ u s deklaracemi potˇrebn´ ymi pro tvorbu modulu. 3 → Makro oznaˇcuj´ıc´ı licenci, pod kterou modul spad´a. 5 - 9 → Funkce, kter´ a se m´ a zavolat po nahr´an´ı modulu do j´adra. 11 - 14 → Funkce, kter´ a se m´ a zavolat pˇri odstanˇen´ı modulu z j´adra. 16 - 17 → Makra, kter´ a oznaˇcuj´ı roli tˇechto dvou funkc´ı.
24
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
25
7, 13 → Funkce pro v´ ypis informac´ı do logu j´adra. Pouˇzit´ı je obdobn´e jako u funkce printf() ze standardn´ı knihovny C pro programy z uˇzivatelsk´eho prostoru. Pokud bychom chtˇeli prov´est pˇreklad tohoto trivi´aln´ıho pˇr´ıkladu do podoby jadern´eho modulu a ten n´ aslednˇe zav´est do j´ adra, postupovali bychom v n´asleduj´ıc´ıch kroc´ıch: Vytvoˇr´ıme si pro tento u ´ˇcel pracovn´ı adres´aˇr a v nˇem vytvoˇr´ıme soubor s n´azvem hello world.c, jehoˇz obsahem bude pˇr´ıklad uveden´ y v´ yˇse. D´ale v adres´aˇri vytvoˇr´ıme soubor Makefile, kter´ y bude obsahovat pouze jedinou ˇr´ adku: obj-m = hello_world.o Pak zavol´ ame sestavovac´ı program make s n´asleduj´ıc´ımi parametry: $ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules T´ımto ˇr´ık´ ame, ˇze program make naˇcte Makefile z adres´aˇre se zdrojov´ ymi k´ody aktu´alnˇe bˇeˇz´ıc´ıho j´adra. Pomoc´ı promˇenn´e M ˇrekneme, ˇze se modul nach´az´ı v aktu´aln´ım adres´aˇri a slovo modules na konci znamen´ a, ˇze chceme, aby se zkompilovaly pouze moduly. V´ ystup pˇrekladu m˚ uˇze vypadat takto: make: Entering directory ‘/usr/src/linux-headers-2.6.32-35-generic’ CC [M] /tmp/hello/hello_world.o Building modules, stage 2. MODPOST 1 modules CC /tmp/hello/hello_world.mod.o LD [M] /tmp/hello/hello_world.ko make: Leaving directory ‘/usr/src/linux-headers-2.6.32-35-generic’ V adres´ aˇri n´ am pak kromˇe jin´eho vzniknul pˇreloˇzen´ y jadern´ y modul hello world.ko. Ten m˚ uˇzeme do j´ adra zav´est n´ asledovnˇe: $ sudo insmod ./hello_world.ko Zkontrolovat, ˇze se modul zavedl do j´adra, m˚ uˇzeme z v´ ypisu programu lsmod, kter´ y zobrazuje informace o stavech modul˚ u v Linuxu: $ lsmod | head -2 Module hello_world
Size 680
Used by 0
N´aˇs modul obsahoval z´ akladn´ı funkcionalitu pro ovˇeˇren´ı funkˇcnosti, tedy v´ ypis Hello world po zaveden´ı do j´ adra. Z v´ ypisu j´adra m˚ uˇzeme zkontrolovat (vypisujeme pouze posledn´ı ˇr´adku): $ dmesg | tail -1 [ 8233.547864] Hello, world
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
26
Modul m˚ uˇzeme pak z j´ adra odstranit: $ sudo rmmod hello_world a opˇet se m˚ uˇzeme pˇresvˇedˇcit o korektn´ım odstranˇen´ı modulu z v´ ypisu j´adra: $ dmesg | tail -1 [ 8819.150167] Goodbye, cruel world
7.2
Ovladaˇ ce
Podle [1] lze j´ adro rozdˇelit do nˇekolika ˇc´ast´ı podle u ´lohy, jakou v syst´emu pln´ı. To je moˇzn´e vidˇet na obr´ azku 7.1. Z uveden´eho rozdˇelen´ı je patrn´e, ˇze existuje nˇekolik typ˚ u zaˇr´ızen´ı, tedy i nˇekolik typ˚ u ovladaˇc˚ u. Z´ aroveˇ n je vidˇet, ˇze nez´avisle na typu lze ovladaˇc implementovat jako jadern´ y modul, popsan´ y v pˇredch´azej´ıc´ı sekci 7.1.
Obr´ azek 7.1: Rozdˇelen´ı j´adra V Linuxu tedy existuj´ı 3 z´ akladn´ı typy zaˇr´ızen´ı:
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
27
• Znakov´ a zaˇ r´ızen´ı - Pˇr´ıstup k takov´emu zaˇr´ızen´ı je jako k posloupnosti byt˚ u (znak˚ u) obdobnˇe jako v souborech. Obvykle poskytuj´ı pouze sekvenˇcn´ı pˇr´ıstup a nepouˇz´ıvaj´ı buffery. Jsou pˇr´ıstupn´ a ze syst´emu soubor˚ u pˇres adres´aˇr /dev. Typick´ ym pˇr´ıkladem m˚ uˇze b´ yt s´eriov´ y port (napˇr. /dev/ttyS0), textov´a konzole (/dev/console) atd. • Blokov´ a zaˇ r´ızen´ı - U blokov´eho zaˇr´ızen´ı obecnˇe prob´ıh´a z´apis i ˇcten´ı po bloc´ıch dat. Typick´ ym zastupitelem m˚ uˇze b´ yt pevn´ y disk (blok 512 byt˚ u). Linux vˇsak umoˇzn ˇuje aplikac´ım pˇr´ıstup k blokov´ ym zaˇr´ızen´ım stejnˇe jako ke znakov´ ym. Liˇs´ı se pouze zp˚ usobem, jak´ ym jsou data internˇe spravov´ana j´adrem. Tedy rozhran´ı j´adra pro blokov´e a znakov´e ovladaˇce jsou zcela odliˇsn´ a. Stejnˇe jako u znakov´ ych jsou blokov´a zaˇr´ızen´ı pˇr´ıstupn´a ze syst´emu soubor˚ u pˇres adres´ aˇr /dev. Rozd´ıln´e je tak´e to, ˇze k blokov´ ym zaˇr´ızen´ım m˚ uˇze b´ yt pˇripojem syst´em soubor˚ u. • S´ıt’ov´ a rozhran´ı - Kaˇzd´ a s´ıt’ov´a komunikace prob´ıh´a pˇres s´ıt’ov´e rozhran´ı, coˇz je zaˇr´ızen´ı zodpovˇedn´e za pˇr´ıjem a odes´ılan´ı datov´ ych paket˚ u. Nejˇcastˇeji zastupuje re´aln´e hardwarov´e zaˇr´ızen´ı, m˚ uˇze vˇsak b´ yt pouze na softwarov´e b´azi (napˇr. loopback). Vyuˇz´ıv´a s´ıt’ov´eho subsyst´emu j´ adra. Pˇr´ıstup k rozhran´ı je umoˇznˇen pˇridˇelov´an´ım unik´atn´ıch jmen jednotliv´ ym rozhran´ım (napˇr. eth0), nen´ı zde vˇsak moˇzn´ y pˇr´ım´ y pˇr´ıstup pˇres syst´em soubor˚ u z /dev ani odjinud. Komunikace mezi j´adrem a ovladaˇcem s´ıt’ov´ ych zaˇr´ızen´ı je zcela odliˇsn´ a od t´e ve znakov´ ych a blokov´ ych ovladaˇc´ıch. Pokud budeme mluvit o USB ovladaˇci, tak z´aklad kaˇzd´eho je USB modul, kter´ y pracuje s USB subsyst´emem j´ adra. Samotn´e zaˇr´ızen´ı se pak v syst´emu m˚ uˇze prezentovat jako znakov´e zaˇr´ızen´ı (napˇr. USB serial port), blokov´e zaˇr´ızen´ı (napˇr. USB ˇcteˇcka pamˇet’ov´ ych karet) ’ nebo s´ıt ov´e rozhran´ı. Pr´ avˇe posledn´ı zm´ınˇen´e je n´aˇs pˇr´ıpad v tomto ovladaˇci CAN-USB pˇrevodn´ıku, jelikoˇz vyuˇz´ıv´ ame SocketCAN, coˇz je implementace pro s´ıt’ov´a rozhran´ı. Na ovladaˇce a jadern´e moduly obecnˇe jsou kladeny zvl´aˇstn´ı n´aroky na spr´avnost. Aplikace v uˇzivatelsk´em prostoru maj´ı sv˚ uj oddˇelen´ y pamˇet’ov´ y prostor a pˇri chybˇe jsou ukonˇceny operaˇcn´ım syst´emem. U modul˚ u nic takov´eho neplat´ı, funguj´ı v r´amci jednoho pamˇet’ov´eho prostoru j´adra (kernel space). Chybn´ y modul proto m˚ uˇze zp˚ usobit nestabilitu cel´eho syst´emu, v horˇs´ım pˇr´ıpadˇe poˇskozen´ı dat. V ovladaˇc´ıch se nepouˇz´ıvaj´ı glob´aln´ı promˇenn´e. Nam´ısto toho promˇenn´e pouˇziteln´e z v´ıce m´ıst ovladaˇce utvoˇr´ı jednu strukturu, kter´a pak tvoˇr´ı priv´atn´ı data ovladaˇce.
7.3
USB ovladaˇ ce
Linux rozliˇsuje dva typy ovladaˇc˚ u USB zaˇr´ızen´ı a to: • USB Device drivers - ovladaˇce pro hostitelsk´ y syst´em (obvykle osobn´ı poˇc´ıtaˇc), kter´e ovl´ adaj´ı jednotliv´ a perifern´ı zaˇr´ızen´ı k nˇemu pˇripojen´a • USB Gadget drivers - ovladaˇce v perifern´ıch zaˇr´ızen´ıch (obvykle nˇejak´ y vestavˇen´ y syst´em), kter´ a jsou pˇripojov´ ana k hostitelsk´emu syst´emu Tyto term´ıny vznikly pro rozliˇsen´ı pojm˚ u. V kontextu USB protokolu je pak device driver ˇ a je totiˇz situace, kdy m´ame nˇejak´e vestavˇen´e master a gadget driver je pak slave. Cast´
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
28
(embedded) zaˇr´ızen´ı, kter´e disponuje ˇradiˇcem USB Device a bˇez´ı na nˇem embedded Linux. Zde pak existuje USB Device controller driver, coˇz je ovladaˇc, kter´ y obsluhuje zm´ınˇen´ y ˇradiˇc USB Device. Zprostˇredkov´ av´ a samotn´ y pˇr´ıstup ˇcipu ke sbˇernici a je tedy platformovˇe z´avisl´ y. Poskytuje ale rozhran´ı zm´ınˇen´e platformovˇe nez´avisl´e vrstvˇe ovladaˇc˚ u USB Gadget drivers. Jako pˇr´ıklad pouˇzit´ı m˚ uˇze b´ yt Storage gadget, umoˇzuj´ıc´ı hostovi pˇr´ıstup jako k pamˇet’ov´emu zaˇr´ızen´ı. M˚ uˇzeme tak napˇr. pˇripojit digit´aln´ı kameru k PC a ta se zpˇr´ıstupn´ı jako USB ´ storage device. Ukolem v t´eto pr´ aci je vˇsak poskytnout podporu konkr´etn´ımu perifern´ımu zaˇr´ızen´ı v hostitelsk´em syst´emu, tedy implementovat USB Device driver. D´ale bude tedy popisov´an tento typ ovladaˇce.
7.3.1
Struktura USB ovladaˇ c˚ u
Struktura pro hostitelsk´ y syst´em je zn´azornˇena na obr´azku 7.2 (pˇrevzat´eho z [9]). Spodn´ı vrstvu tvoˇr´ı USB Host controller drivers, tedy platformovˇe z´avisl´e ovladaˇce r˚ uzn´ ych hardwarov´ ych ˇradiˇc˚ u. Nad n´ı je vrstva USB Core, coˇz je subsyst´em j´adra nez´avisl´ y na architektuˇre, kter´ y implementuje samotnou specifikaci sbˇernice USB a poskytuje rozhran´ı ovladaˇc˚ um USB zaˇr´ızen´ı pro pˇr´ıstup k hardwaru bez nutnosti zaob´ırat se niˇzˇs´ı vrstvou. Vrchn´ı vrstva je tvoˇrena samotn´ ymi ovladaˇci specifick´ ych zaˇr´ızen´ı.
Obr´ azek 7.2: Struktura USB ovladaˇc˚ u v Linuxu
7.3.2
USB v j´ adˇ re Linux
Hierarchie USB zaˇr´ızen´ı device → configirations → intefraces → endpoints byla vysvˇetlena v sekci 3.
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
7.3.2.1
29
Koncov´ e body (Endpoints)
V j´adˇre jsou koncov´e body pops´ any strukturou struct usb host endpoint. V n´ı nalezneme strukturu struct usb endpoint descriptor, kter´a jak uˇz z n´azvu vypl´ yv´a reprezentuje deskriptor koncov´eho bodu. Obsahuje tedy poloˇzky dan´e USB specifikac´ı, kter´e pro pˇrehlednost nesou stejn´e jm´eno 1 . M˚ uˇzeme tam naj´ıt tedy napˇr.: bEndpointAddress Adresa specifick´eho koncov´eho bodu a informace o jeho smˇeru2 . bmAttributes Urˇcuje typ koncov´eho bodu. Lze pouˇz´ıt bitovou masku USB ENDPOINT XFERTYPE MASK a urˇcit tak, zda je o control (USB ENDPOINT XFER CONTROL), bulk (USB ENDPOINT XFER BULK), interrupt (USB ENDPOINT XFER INT) ˇci isochronous (USB ENDPOINT XFER ISOC) endpoint. wMaxPacketSize Udav´a maxim´ aln´ı velikost paketu v bytech, se kterou m˚ uˇze koncov´ y bod manipulovat3 .
7.3.2.2
Rozhran´ı (Interfaces)
Mnoˇzina koncov´ ych bod˚ u tvoˇr´ı rozhran´ı, kter´e reprezentuje z´akladn´ı funkcionalitu zaˇr´ızen´ı. USB driver je tedy sv´ az´ an s rozhran´ım. Jedno fyzick´e zaˇr´ızen´ı m˚ uˇze poskytovat i v´ıce funkc´ı, z ˇcehoˇz vyp´ yv´ a, ˇze pro jedno zaˇr´ızen´ı m˚ uˇze b´ yt potˇreba v´ıce ovladaˇc˚ u. Napˇr. USB reproduktor m˚ uˇze b´ yt sloˇzen ze dvou logick´ ych ˇc´ast´ı - ovl´adac´ı tlaˇc´ıtka a zvukov´ y stream. Tedy bude potˇreba dvou r˚ uzn´ ych ovladaˇc˚ u. Jedeno rozhran´ı m˚ uˇze m´ıt v´ıce odliˇsn´ ych nastaven´ı parametr˚ u tzv. alternate settings s t´ım, ˇze pro kaˇzd´e rozhran´ı m˚ uˇze b´ yt v jeden okamˇzik aktivn´ı vˇzdy pouze jedno nastaven´ı. Pouˇzit´ı m˚ uˇze b´ yt napˇr. r˚ uzn´e nastaven´ı ˇs´ıˇrky p´asma u audio zaˇr´ızen´ı. Jednotliv´a nastaven´ı jsou ˇc´ıslov´ ana (od 0) a jsou reprezentov´ana strukturou struct usb host interface. Ve v´ ychoz´ım stavu je aktivn´ı vˇzdy prvn´ı nastaven´ı (s ˇc´ıslem 0). USB rozhran´ı je v j´ adˇre reprezentov´ano strukturou struct usb interface. Pr´avˇe tuto strukturu pˇred´ av´ a USB core konkr´etn´ımu USB ovladaˇci, ˇcili za tuto funkcionalitu je pak ovladaˇc zodpovˇedn´ y. D˚ uleˇzit´e ˇc´ asti t´eto struktury pak jsou: struct usb host interface *altsetting; Pole alternativn´ıch nastaven´ı dostupn´ ych pro toto rozhran´ı. Struktura struct usb host interface obsahuje mnoˇzinu koncov´ ych bod˚ u (struct usb host endpoint *endpoint) pro dan´e nastaven´ı. unsigned num altsetting; 1
Tyto n´ azvy neodpov´ıdaj´ı sch´ematu pojmenov´ av´ an´ı promˇenn´ ych v j´ adˇre Linux pod stejnou adresou mohou vytupovat dva r˚ uzn´e koncov´e body rozsliˇsen´e smˇerem - IN nebo OUT 3 Data s vˇetˇs´ı velikost´ı jsou rozdˇelena a pˇrenesena na v´ıcekr´ at 2
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
30
Poˇcet alternativn´ıch nastaven´ı struct usb host interface *cur altsetting; Ukazatel do pole altsetting, odkazuj´ıc´ı na moment´alnˇe aktivn´ı nastaven´ı. int minor; Minor ˇc´ıslo pro dan´e rozhran´ı pˇridˇelen´e od USB core po zavol´an´ı usb register dev()
7.3.2.3
Konfigurace (Configurations)
Rozhran´ı jsou sv´ az´ ana do konfigurac´ı. V j´adˇre pak USB konfiguraci popisuje struktura struct usb host config. V jeden okamˇzik m˚ uˇze b´ yt aktivn´ı pouze jedna konfigurace. Samotn´ y USB ovladaˇc s touto strukturou vˇetˇsinou neoperuje, je zde zm´ınˇena pro u ´plnost. 7.3.2.4
Zaˇ r´ızen´ı (Devices)
Cel´e USB zaˇr´ızen´ı popisuje struktura struct usb device. S touto strukturou operuje USB core, kter´e ovladaˇci pˇred´ av´ a pouze strukturu reprezentuj´ıc´ı rozhran´ı. Lze vˇsak pouˇz´ıt funkci interface to usbdev() pro z´ısk´ an´ı struct usb device z struct usb interface. 7.3.2.5
USB Request Blocks
V j´adˇre prob´ıh´ a USB komunikace mezi ovladaˇci a zaˇr´ızen´ımi asynchronnˇe pomoc´ı objekt˚ u zvan´ ych URB (USB Request Block). URB je vyuˇz´ıv´an k zasl´an´ı ˇci pˇrijet´ı dat do nebo od konkr´etn´ıho USB koncov´eho bodu. Jsou podobn´e paket˚ um v s´ıt’ov´e komunikaci. O vytvoˇren´ı URB se star´ a ovladaˇc. Ten m˚ uˇze v´ıce URBs pˇriˇradit k jednomu konkr´etn´ımu koncov´emu bodu nebo m˚ uˇze jeden URB pouˇz´ıt opakovanˇe pro r˚ uzn´e koncov´e body. Kaˇzd´ y koncov´ y bod si drˇz´ı URBs ve frontˇe, m˚ uˇze b´ yt proto odesl´ano v´ıce URBs na jeden koncov´ y bod. Typick´ y ˇzivotn´ı cyklus pro URB je pops´ an v [1] takto: • Vytvoˇren ovladaˇcem USB zaˇr´ızen´ı. • Pˇriˇrazen konkr´etn´ımu koncov´emu bodu konkr´etn´ıho zaˇz´ızen´ı. • Pˇred´ an ovladaˇcem do USB core. • Pˇred´ an USB core dan´emu ovladaˇci USB ˇradiˇce (USB host controller driver) konkr´etn´ıho zaˇr´ızen´ı. • Zpracov´ an ovladaˇcem ˇradiˇce, kter´ y provede samotn´ y datov´ y pˇrenos. • Kdyˇz je dokonˇcen, ovladaˇc ˇradiˇce upozorn´ı ovladaˇc zaˇr´ızen´ı.
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
31
Upozornˇen´ı spoˇc´ıv´ a v zavol´ an´ı pˇredem definovan´e dokonˇcovac´ı funkce v kontextu pˇreruˇsen´ı, kde ovladaˇc pˇreb´ır´ a zpˇet kontrolu nad dokonˇcen´ ym URB. Ten pak m˚ uˇze URB bud’ smazat, nebo ho znovu pouˇz´ıt tˇreba i pro jin´ y koncov´ y koncov´ y bod. URB je realizov´ an strukturou struct urb. Jeho vytvoˇren´ı se prov´ad´ı zavol´an´ım funkce usb alloc urb(). To je nutn´e kv˚ uli mechanismu poˇc´ıt´an´ı referenc´ı, kter´ y vyuˇz´ıv´a USB core. Alokace URB tedy nen´ı staticky, ani pˇres kmalloc(). Deklarace funkce vypad´a: 1 struct urb ∗ u s b a l l o c u r b ( 2 int i s o p a c k e t s , 3 g f p t mem flags 4 );
2 → Poˇcet izochronn´ıch paket˚ u. 3 → Standardn´ı alokaˇcn´ı omezen´ı (viz. kmalloc() - GFP KERNEL, GPF ATOMIC). Pˇr´ıklad vytvoˇren´ı URB pak m˚ uˇze vypadat: struct *urb u = usb_alloc_urb(0, GFP_KERNEL); Smaz´an´ı pak prob´ıh´ a analogicky pˇres funkci: void usb_free_urb(struct urb *urb); D´ale mus´ı b´ yt URB incializov´ an a pˇriˇrazen specifick´emu koncov´emu bodu. Toto se pak prov´adn´ı pˇres funkce odpov´ıdaj´ıc´ı jednotliv´ ym typ˚ um pˇrenos˚ u. Napˇr. pro bulk se pouˇz´ıv´a funkce usb fill bulk urb(). Deklarace funkce vypad´a: 1 void u s b f i l l b u l k u r b ( 2 struct urb ∗ urb , 3 struct u s b d e v i c e ∗ dev , 4 unsigned int pipe , 5 void ∗ t r a n s f e r b u f f e r , 6 int b u f f e r l e n g t h , 7 u s b c o m p l e t e t complete , 8 void ∗ c o n t e x t 9 );
2 → Ukazatel na jiˇz vytvoˇren´ y URB, kter´ y chceme inicializovat. 3 → USB zaˇr´ızen´ı, kter´emu m´ a b´ yt tento URB zasl´an. 4 → Specifick´ y koncov´ y bod USB zaˇr´ızen´ı, kter´emu bude URB zasl´an. Pro z´ısk´an´ı t´eto hodnoty slouˇz´ı specifick´e funkce, z´ avisej´ıc´ı na typu a smˇeru komunikace. Pˇrehled pˇrin´aˇs´ı obr´azek 7.3 (pˇrevzat´ y z [9]): 5 → Ukazatel na datov´ y buffer, kter´ y obsahuje odes´ılan´a data v pˇr´ıpadˇe odes´ıl´an´ı a pˇrijat´a data v pˇr´ıpadˇe pˇr´ıjmu. Tento buffer mus´ı b´ yt vytvoˇren dynamicky pomoc´ı kmalloc() nebo s pˇredmapov´ an´ım pro DMA (usb buffer alloc()), nikoliv staticky. 6 → D´elka datov´eho bufferu na kter´ y se odkazuje ukazatel transfer buffer. 7 → Ukazatel na dokonˇcovac´ı funkci, kter´a je vol´ana pokud je poˇzadavek na URB vyˇr´ızen.
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
32
Obr´ azek 7.3: Vytv´aˇren´ı pipes
8 → Ukazatel na volitelnou datovou strukturu v ovladaˇci, kter´a m˚ uˇze b´ yt vyuˇzita v dokonˇcovac´ı funkci kdyˇz je URB po pˇred´an´ı do USB core pˇred´an zpˇet ovladaˇci. Inicializaˇcn´ı funkce pro ostatn´ı typy pˇrenos˚ u maj´ı obdobnou strukturu4 , maj´ı vˇsak nav´ıc nˇekter´e parametry odpov´ıdaj´ıc´ı jejich typu. Zde byl zm´ınˇen pro n´azornost pouze typ bulk, informaci o ostatn´ı typech lze nal´ezt bud’ v [1], nebo pˇr´ımo ve zdrojov´em k´odu j´adra v souboru /include/linux/usb.h pˇr´ıstupn´em z [10]. Pokud je URB vytvoˇren a korektnˇe inicializov´an, pˇred´a ho ovladaˇc do USB core vol´an´ım funkce usb submit urb(). Funkce je deklarov´ana n´asledovnˇe: 1 int u s b s u b m i t u r b ( 2 struct urb ∗ urb , 3 g f p t mem flags 4 );
N´avratov´a hodnota rovna 0 znamen´ au ´spˇech, z´aporn´a hodnota znaˇc´ı chybu. 2 → Ukazatel na c´ılen´ y URB. 3 → Standardn´ı alokaˇcn´ı omezen´ı (viz. kmalloc()). K zruˇsen´ı jiˇz pˇredan´eho URB existuj´ı dvˇe funkce. Konkr´etnˇe k zruˇsen´ı bez ˇcek´an´ı slouˇz´ı int usb_unlink_urb(struct urb *urb); a k zruˇsen´ı s ˇcek´ an´ım na potvrzen´ı o dokonˇcen´ı: int usb_kill_urb(struct urb *urb); 4
kromˇe typu interrupt, pro kter´ y obdobn´ a funkce nen´ı dostupn´ a
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
33
kde parametr urb je analogicky k pˇredchoz´ım funkc´ım ukazatel na URB, kter´ y m´a b´ yt zruˇsen. Pokud zavol´ ame nˇekterou z tˇechto funkc´ı na URB, kter´ y nebyl pˇred´an ke zpracov´an´ı, dostaneme chybovou n´ avratovou hodnotu. Jak jiˇz bylo zm´ınˇeno dokonˇcovac´ı funkce je callback volan´ y pˇri dokonˇcen´ı URB. Tato funkce m˚ uˇze vˇsak b´ yt vyvol´ ana i v pˇr´ıpadˇe, ˇze doˇslo k chybˇe pˇri datov´em pˇrenosu, nebo byl potvrzen´ y URB zruˇsen. Funkce dost´ av´a jako argument ukazatel struct urb* podle kter´eho se rozliˇsuje v kontextu kter´eho URB byl callback zavol´an. Struktura struct urb obsahuje poloˇzku int status, kter´ a obsahuje informaci o stavu URB. Pokud je status roven 0, datov´ y pˇrenos byl korektnˇe dokonˇcen. U z´ aporn´ ych hodnot pak mohou b´ yt rozliˇseny dalˇs´ı pˇr´ıˇciny vyvol´an´ı dokonˇcovac´ı funkce. Napˇr. -ECONNRESET znamen´a, ˇze URB byl zruˇsen vyvol´an´ım usb unlink urb().
7.3.3
USB v GNU/Linux
Z uˇzivatelsk´eho prostoru lze nejjednoduˇseji zobrazit informace o USB sbˇernic´ıch v syst´emu a zaˇr´ızen´ıch k nim pˇripojen´ ych zad´ an´ım pˇr´ıkazu lsusb. Pˇr´ıklad, jak m˚ uˇze v´ ypis vypadat: Bus 007 Device 002: ID Interface [Integrated Bus 007 Device 001: ID Bus 006 Device 002: ID Bus 006 Device 001: ID Bus 005 Device 003: ID Bus 005 Device 001: ID Bus 004 Device 001: ID Bus 003 Device 001: ID Bus 002 Device 003: ID Bus 002 Device 001: ID Bus 001 Device 001: ID
03f0:171d Module] 1d6b:0001 08ff:2580 1d6b:0001 1669:1011 1d6b:0001 1d6b:0001 1d6b:0001 04f2:b015 1d6b:0002 1d6b:0002
Hewlett-Packard Wireless (Bluetooth + WLAN) Linux Foundation 1.1 root hub AuthenTec, Inc. AES2501 Fingerprint Sensor Linux Foundation 1.1 root hub PiKRON Ltd. [hex] Linux Foundation 1.1 root hub Linux Foundation 1.1 root hub Linux Foundation 1.1 root hub Chicony Electronics Co., Ltd VGA 24fps UVC Webcam Linux Foundation 2.0 root hub Linux Foundation 2.0 root hub
Podrobn´ y v´ ypis informac´ı o konkr´etn´ım zaˇr´ızen´ı lze doc´ılit pˇrep´ınaˇcem -v, --verbose a specifikov´an´ım c´ılen´eho zaˇr´ızen´ı pˇrep´ınaˇcem -s [[bus]:][devnum] popˇr. -d [vendor]:[product]. Kontr´etnˇe tedy k zobrazen´ı informac´ı o pˇr´ıtomn´em pˇrevodn´ıku (vztaˇzeno k pˇredeˇsl´emu v´ ypisu): $ lsusb -v -s 5:3 popˇr´ıpadˇe $ lsusb -v -d 1669:1011 Jin´a moˇznost je pˇr´ıstup do syst´emu soubor˚ u sysfs. To je virtu´aln´ı souborov´ y syst´em, jehoˇz obsah nen´ı fyzicky uloˇzen na disku, ale je za bˇehu generov´an j´adrem a zpˇr´ıstupnˇen v uˇzivatelsk´em prostoru. Sysfs obsahuje informace o zaˇr´ızen´ıch a ovladaˇc´ıch a v adres´aˇrov´e
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
34
struktuˇre je pˇr´ıstupn´ y pˇres /sys. Lze pomoc´ı nˇej tak´e modifikovat funkcionalitu zaˇr´ızen´ı5 , vyuˇz´ıv´a jej napˇr. spr´ avce zaˇr´ızen´ı udev. Informace o jednotliv´ ych USB zaˇr´ızen´ıch se pak nach´azej´ı ve sloˇzce /sys/bus/usb/devices. Tato struktura odr´aˇz´ı pˇr´ısluˇsnost zaˇr´ızen´ı k jednotliv´ ych sbˇernic´ım6 , vlastn´ı obsah vˇsak tvoˇr´ı symbolick´e odkazy do struktury podadres´ar˚ u v /sys/devices/, kter´ a odr´ aˇz´ı vlastn´ı fyzick´e rozvrˇzen´ı. V sysfs pak nalezneme jak samotn´e USB zaˇr´ızen´ı (reprezentov´ano struct usb device), tak jednotliv´a USB rozhran´ı (reprezentov´any struct usb interface). V pˇr´ıpadˇe pˇrevodn´ıku, kter´ y obsahuje jedin´e USB rozhran´ı pak v sysfs m˚ uˇze USB zaˇr´ızen´ı odpov´ıdat: /sys/devices/pci0000:00/0000:00:1d.0/usb5/5-2 a jeho USB rozhran´ı, se kter´ ym je spjat ovladaˇc: /sys/devices/pci0000:00/0000:00:1d.0/usb5/5-2/5-2:1.0 Prvn´ım u ´dajem (v naˇsem pˇr´ıpadˇe usb5) je tzv. root hub, tedy USB ˇradiˇc. Ten m´a specifick´e ˇc´ıslo pˇridˇelen´e od USB core odpov´ıdaj´ıc´ı tomu, jak byly jednotliv´e ˇradiˇce postupnˇe registrov´any do syst´emu. Jm´eno zaˇr´ızen´ı se skl´ada z tohoto ˇc´ısla n´asledovan´eho pomlˇckou a ˇc´ıslem portu, ke kter´emu je dan´e zaˇr´ızen´ı pˇripojeno. V naˇsem pˇr´ıpadˇe m´a tedy pˇrevodn´ık jako USB zaˇr´ızen´ı jm´eno 5-2. Jm´eno jeho USB rozhran´ı je pak d´ano jm´enem tohoto zaˇr´ızen´ı n´asledovan´ ym dvojteˇckou, ˇc´ıslem konfigurace, teˇckou a ˇc´ıslem rozhran´ı. V naˇsem pˇr´ıpadˇe 5-2:1.0, jelikoˇz je to prvn´ı konfigurace a m´a rozhran´ı s ˇc´ıslem 0. Podle [1] pak lze sch´ema pojmenov´an´ı USB rozhran´ı zobecnit jako root hub-hub port:config.interface pˇr´ıpadnˇe root hubhub port-hub port:config.interface. Ovˇsem takto nelze zjistit napˇr. nastaven´ı koncov´ ych bod˚ u dan´eho rozhran´ı. Existuje vˇsak soubor generovan´ y j´ adrem, kter´ y obsahuje vˇsechny tyto informace. Do verze j´adra 2.6.31 existoval syst´em soubor˚ u usbfs, pˇr´ıstupn´ y z adres´aˇre /proc/bus/usb/. Uveden´ y soubor se pak nach´azel v /proc/bus/usb/devices. Od verze j´adra 2.6.31 doˇslo k defaultn´ımu z´akazu usbfs, nicm´enˇe uveden´ y soubor lze nal´ezt v syst´emu soubor˚ u debugfs, konkr´etnˇe se jedn´a o /sys/kernel/debug/usb/devices.
5 6
napˇr´ıklad podle potˇreby mˇenit aktivn´ı USB konfigurace stejnˇe tak napˇr. pro PCI zaˇr´ızen´ı existuje adres´ aˇr /sys/bus/pci/devices
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
7.4
35
Imlementace ovladaˇ ce pˇ revodn´ıku
Koncepˇcnˇe vych´ az´ı struktura obsluhy komunikace s pˇrevodn´ıkem z USB implementace ovladaˇce LinCAN. Pro datov´ y pˇrenos existuj´ı dva koncov´e body typu bulk, kter´e se liˇs´ı smˇerem komunikace. Jeden je pˇrij´ımac´ı (IN) a druh´ y odes´ılac´ı (OUT). Pˇrenos ˇr´ıdic´ıch poˇzadavk˚ u pro konfiguraci (napˇr. nastaven´ı komunikaˇcn´ıch parametr˚ u sbˇernice) se pak prov´ad´ı pˇres ˇr´ıdic´ı (control) koncov´ y bod. Datov´ y pˇrenos pˇres USB prob´ıh´ a ve formˇe odesl´an´ı nebo pˇr´ıjmu datov´eho bloku, kter´ y reprezentuje samotnou CAN zpr´ avu. Struktura tohoto bloku je pevnˇe d´ana, pouˇz´ıv´a ji jak pˇrevodn´ık tak LinCAN. V´ yznam jednotliv´ ych byt˚ u je moˇzn´e vidˇet na obr´azku 7.4. K pˇrenosu se pouˇz´ıv´a form´ at little-endian, takˇze pˇri pˇr´ıstupu do bytov´eho pole, kter´e tento datov´ y blok reprezentuje, ovladaˇc pouˇz´ıv´ a pˇrevodov´a makra. Pro uklad´an´ı napˇr. cpu to le32() a pˇri ˇcten´ı napˇr. le32 to cpu(). Pˇrenos ˇr´ıdic´ıch poˇzadavk˚ u prob´ıh´a tak´e ve formˇe pˇrenosu bytov´eho pole ve form´ atu little-endian, ovˇsem zde je struktura z´avisl´a na typu poˇzadavku.
Obr´ azek 7.4: Struktura datov´eho bloku pro pˇrenos CAN zpr´avy po USB Pozn´amka: V textu d´ ale budou uv´ adˇeny fragmenty zdrojov´eho k´ odu ovladaˇce pro vˇetˇs´ı n´ azornost. Je potˇreba si uvˇedomit, ˇze maj´ı m´ıt sp´ıˇse informativn´ı v´yznam (jako pseudok´ od). Neobsahuj´ı tedy nutnˇe veˇskerou funkcionalitu, netestuj´ı se n´ avratov´e hodnoty funkc´ı na zjiˇstˇen´ı chyb atd. V ˇz´ adn´em pˇr´ıpadˇe tedy nejde o ekvivalent se skuteˇcn´ym zdrojov´ym k´ odem.
7.4.1
Registrace
USB je specifick´ a sbˇernice z d˚ uvodu moˇznosti pˇripojen´ı zaˇr´ızen´ı za bˇehu syst´emu (tzv. hotplug) bez nutnosti dalˇs´ı konfigurace ˇci restartu. Tomu mus´ı samozˇrejmˇe odpov´ıdat i podpora operaˇcn´ıho syst´emu. Ovladaˇce jako takov´e maj´ı samozˇrejmˇe n´aroky na syst´emov´e zdroje. Zav´adˇet ovladaˇce potenci´ alnˇe pˇripojiteln´ ych USB zaˇr´ızen´ı jiˇz pˇri startu syst´emu, kdyˇz nen´ı jasn´e kdy a jestli v˚ ubec bude konkr´etn´ı zaˇr´ızen´ı pˇripojeno, by bylo znaˇcnˇe neefektivn´ı. V Linuxu proto existuje mechanismus registrace, kdy jadern´ y modul reprezentuj´ıc´ı ovladaˇc nejprve pˇres speci´ aln´ı funkce zaregistruje do USB subsyst´emu j´ım podporovan´a zaˇr´ızen´ı (pˇres ID v´ yrobce a produktu). Na z´ akladˇe tˇechto informac´ı7 je pak pˇri fyzick´em pˇripojen´ı zaˇr´ızen´ı USB subsyst´em schopen rozhodnout, kter´ y ovladaˇc dan´emu zaˇr´ızen´ı pˇr´ısluˇs´ı a zav´est jej. Proveden´ı tˇechto u ´kon˚ u bude vysvˇetleno na programov´em fragmentu ovladaˇce CAN-USB pˇrevodn´ıku: 7
zjiˇst’uj´ı se od zaˇr´ızen´ı pˇri jeho enumeraci
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
36
Listing 7.1: Register to USB subsystem 1 2 3 4 5 6 7 8 9 10
#define CTU USBCAN VENDOR ID #define CTU USBCAN PRODUCT ID
0 x1669 0 x1011
/∗ t a b l e o f d e v i c e s t h a t work w i t h t h i s d r i v e r ∗/ s t a t i c struct u s b d e v i c e i d c t u u s b c a n t a b l e [ ] = { { USB DEVICE(CTU USBCAN VENDOR ID, CTU USBCAN PRODUCT ID) } , { } /∗ Terminating e n t r y ∗/ }; MODULE DEVICE TABLE( usb , c t u u s b c a n t a b l e ) ;
1 - 2 → Definujeme ID v´ yrobce a produktu dan´eho USB zaˇr´ızen´ı. 5 - 8 → Informace pro subsyst´em popisuje struktura struct usb device id. Tyto struktury se sjednocuj´ı do pole, kter´e m´ a podobu viditelnou na tˇechto ˇr´adc´ıch. V tomto pˇr´ıpadˇe pˇrevodn´ık obsahuje tabulku s jedinou poloˇzku. K jej´ımu naplnˇen´ı slouˇz´ı makro USB DEVICE (vendor, product), kter´e na z´ akladˇe zadan´ ych parametr˚ u vytvoˇr´ı strukturu struct usb device id. 10 → Pomoc´ı makra MODULE DEVICE TABLE(type, name) pak exportujeme u ´daje do uˇzivatelsk´eho prostoru. Argumenty specifikujeme usb substyst´em8 a tabulku s hodnotami. Listing 7.2: Register to USB subsystem 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
s t a t i c int c t u u s b c a n p r o b e ( struct u s b i n t e r f a c e ∗ i n t f , const struct u s b d e v i c e i d ∗ i d ) { /∗ l a t e r ∗/ } s t a t i c void c t u u s b c a n d i s c o n n e c t ( struct u s b i n t e r f a c e ∗ i n t f ) { /∗ l a t e r ∗/ } /∗ usb s p e c i f i c o b j e c t needed t o r e g i s t e r t h i s d r i v e r w i t h t h e usb s u b s y s t e m ∗/ s t a t i c struct u s b d r i v e r c t u u s b c a n d r i v e r = { . name = ” c t u u s b c a n ” , . id table = ctu usbcan table , . probe = ctu usbcan probe , . disconnect = ctu usbcan disconnect , };
24 - 29 → Z´ akladn´ı ˇc´ ast ovladaˇce USB zaˇr´ızen´ı je struktura struct usb driver. Ovladaˇc ji mus´ı vytvoˇrit a vyplnit nezbytn´e poloˇzky, tedy promˇenn´e a callback funkce, kter´e budou n´aslednˇe (po registraci) pouˇz´ıv´ any USB core. V pˇr´ıkladu pˇrevodn´ıku je to: 25 → N´ azev pod kter´ ym bude ovladaˇc v syst´emu vystupovat. 26 → Ukazatel na tabulku tvoˇrenou strukturami struct usb device id, kter´a je definov´ana na ˇr´ adc´ıch 5-8 a kter´ a obsahuje v´ yˇcet zaˇr´ızen´ı podporovan´ ych ovladaˇcem. 8
toto makro pouˇz´ıvaj´ı i jin´e subsyst´emy, napˇr. pci, pcmcia atd.
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
37
27 → Ukazatel na funkci probe(). To je callback funkce, kterou vol´a USB core v pˇr´ıpadˇe, ˇze bylo pˇripojeno nˇekter´e USB zaˇr´ızen´ı a ovladaˇc by mˇel b´ yt schopen obslouˇzit jeho specifick´e USB rozhran´ı pˇredan´e jako argument (struktura struct usb interface). Zde pˇred´av´ame ukazatel na funkci jej´ıˇz definice zaˇc´ın´a na ˇr´adku 11, detailnˇeji bude pops´ana pozdˇeji. 28 → Ukazatel na funkci disconnect(). To je callback funkce, kterou vol´a USB core v pˇr´ıpadˇe, kdy by ovladaˇc jiˇz d´ ale nemˇel m´ıt kontrolu nad rozhran´ım. Napˇr. pokud dojde k odpojen´ı zaˇr´ızen´ı. Zde pˇred´ av´ ame ukazatel na funkci jej´ıˇz definice zaˇc´ın´a na ˇr´adku 17, detailnˇeji bude pops´ ana pozdˇeji. Listing 7.3: Register to USB subsystem 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
s t a t i c int i n i t c t u u s b c a n i n i t ( void ) { int r e s u l t ; p r i n t k (KERN INFO ”CTU USBCAN k e r n e l d r i v e r l o a d e d \n” ) ; /∗ r e g i s t e r t h i s d r i v e r w i t h t h e USB s u b s y s t e m ∗/ r e s u l t = u s b r e g i s t e r (& c t u u s b c a n d r i v e r ) ; if ( result ) e r r ( ” u s b r e g i s t e r f a i l e d . E r r o r number %d” , r e s u l t ) ; return r e s u l t ; } s t a t i c void e x i t c t u u s b c a n e x i t ( void ) { p r i n t k (KERN INFO ”CTU USBCAN k e r n e l d r i v e r unloaded \n” ) ; /∗ d e r e g i s t e r t h i s d r i v e r w i t h t h e USB s u b s y s t e m ∗/ u s b d e r e g i s t e r (& c t u u s b c a n d r i v e r ) ; } module init ( ctu usbcan init ) ; module exit ( ctu usbcan exit ) ;
Tyto ˇr´ adky obsahuj´ı t´emˇeˇr totoˇznou funkcionalitu, jako v pˇr´ıpadˇe z´akladn´ıho jadern´eho modulu v sekci 7.1. 30 - 42 → Funkce, kter´ a se m´ a zavolat po nahr´an´ı modulu do j´adra. 37 → Vol´ an´ı funkce usb register(), kter´a registruje ovladaˇc do USB subsyst´emu. Jako argument pˇred´ av´ ame ukazatel na strukturu struct usb driver definovanou na ˇr´adc´ıch 2429. 44 - 50 → Funkce, kter´ a se m´ a zavolat pˇri odstanˇen´ı modulu z j´adra. 49 → Vol´ an´ı funkce usb deregister(), kter´a odhl´as´ı strukturu struct usb driver z j´adra. T´ımto doch´ az´ı k logick´emu odpojen´ı vazeb mezi ovladaˇcem a USB rozhran´ım jehoˇz funkcionalitu zajiˇst’uje. Tud´ıˇz je pro toho rozhran´ı vol´ana funkce disconnect()9 , v tomto pˇr´ıpadˇe definovan´ a od ˇradku 17. 9
pokud jiˇz nen´ı zaˇr´ızen´ı fyzicky odpojeno
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
7.4.2
38
Priv´ atn´ı data
Jak jiˇz bylo zm´ınˇeno v sekci 7.2, v ovladaˇc´ıch se nepouˇz´ıvaj´ı glob´aln´ı promˇenn´e, ale nam´ısto toho promˇenn´e pouˇziteln´e z v´ıce m´ıst ovladaˇce utvoˇr´ı jednu strukturu, kter´a pak tvoˇr´ı priv´atn´ı data ovladaˇce. V impementaci pˇrevodn´ıku vypad´a tato struktura n´asledovnˇe: Listing 7.4: Struktura priv´atn´ıch dat 1 /∗ S t r u c t u r e t o h o l d a l l o f our d e v i c e s p e c i f i c s t u f f ∗/ 2 struct c t u u s b c a n u s b { 3 4 /∗ CAN common p r i v a t e d a t a ∗/ 5 struct c a n p r i v can ; /∗ must be t h e f i r s t member ∗/ 6 /∗ CAN hardware−d e p e n d e n t b i t −t i m i n g c o n s t a n t ∗/ 7 struct c a n b i t t i m i n g c o n s t b t c ; 8 /∗ CAN system c l o c k f r e q u e n c y i n Hz ∗/ 9 u32 c a n c l o c k ; 10 11 /∗ t h e usb d e v i c e f o r t h i s d e v i c e ∗/ 12 struct u s b d e v i c e ∗ udev ; 13 /∗ t h e n e t d e v i c e f o r t h i s d e v i c e ∗/ 14 struct n e t d e v i c e ∗ netdev ; 15 16 /∗ t h e a d d r e s s o f t h e b u l k i n e n d p o i n t ∗/ 17 u8 b u l k i n e n d p o i n t A d d r ; 18 /∗ t h e a d d r e s s o f t h e b u l k o u t e n d p o i n t ∗/ 19 u8 b u l k o u t e n d p o i n t A d d r ; 20 21 /∗ URBs w a i t i n g f o r d a t a r e c e i v e ∗/ 22 struct l i s t h e a d r x p e n d l i s t ; 23 /∗ URBs w i t h v a l i d r e c e i v e d d a t a ∗/ 24 struct l i s t h e a d r x r e a d y l i s t ; 25 /∗ URBs p r e p a r e d t o h o l d Tx messages ∗/ 26 struct l i s t h e a d t x i d l e l i s t ; 27 /∗ URBs h o l d i n g Tx messages i n p r o g r e s s ∗/ 28 struct l i s t h e a d t x p e n d l i s t ; 29 /∗ URBs w i t h y e t c o n f i r m e d Tx messages ∗/ 30 struct l i s t h e a d t x r e a d y l i s t ; 31 32 /∗ l i s t l o c k ∗/ 33 spinlock t list lock ; 34 /∗ usb communication k e r n e l t h r e a d ∗/ 35 struct t a s k s t r u c t ∗ comthread ; 36 37 v o l a t i l e long f l a g s ; 38 } ;
V´ yznam jednotliv´ ych poloˇzek by mˇel b´ yt srozumiteln´ y z koment´aˇr˚ u. M´ame zde promˇenn´e 10 ’ t´ ykaj´ıc´ı se USB i s´ıt ov´eho subsyst´emu, adresy koncov´ ych bod˚ u , spojov´e seznamy pro pˇr´ıchoz´ı i odchoz´ı zpr´ avy (vysvˇetleny pozdˇeji) a promˇenn´e t´ ykaj´ıc´ı se samotn´eho CAN zaˇr´ızen´ı. Ty jsou pouˇzity pro spoˇcten´ı a nastaven´ı ˇcasov´ ych parametr˚ u sbˇernice. 10
Pouˇz´ıv´ ame jeden IN BULK a jeden OUT BULK koncov´ y bod pro datov´e pˇrenosy
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
7.4.3 7.4.3.1
39
Pˇ ripojen´ı a odpojen´ı zaˇ r´ızen´ı Funkce probe()
Jak jiˇz bylo ˇreˇceno v pˇredchoz´ı sekci, probe() je callback funkce, kterou vol´a USB core v pˇr´ıpadˇe, ˇze bylo pˇripojeno nˇekter´e USB zaˇr´ızen´ı a ovladaˇc by mˇel b´ yt schopen obslouˇzit jeho specifick´e USB rozhran´ı pˇredan´e jako argument (struktura struct usb interface). Ukazatel na tuto funkci definovanou v ovladaˇci se pˇred´av´a pˇri registraci ovladaˇce. Deklarace tohoto ukazatele na funkci vypad´ a n´ asledovnˇe: int (*probe) (struct usb_interface *intf, const struct usb_device_id *id); Vid´ıme, ˇze jako argument je pˇred´an i ukazatel na strukturu struct usb device id, na z´akladˇe kter´e USB core provedl vol´ an´ı. Pokud ovladaˇci n´aleˇz´ı obsluha dan´eho USB rozhran´ı, vrac´ı honotu 0. Z´ aporn´ a n´ avratov´ a hodnota znaˇc´ı ne´ uspˇech. V t´eto funkci ovladaˇc obvykle inicializuje svoje datov´e struktury. Typick´e je zjiˇstˇen´ı adres a velikost´ı buffer˚ u koncov´ ych bod˚ u, kter´e budou pouˇzity pro komunikaci. Tato funkce je vol´ana v kontextu vl´ akna USB rozboˇcovaˇce, tud´ıˇz je moˇzn´e volat funkce, kter´e m˚ uˇzou zp˚ usobit usnut´ı. Obecnˇe se ale doporuˇcuje prov´est pouze nejnutnˇejˇs´ı funkcionalitu a vˇetˇsinu pr´ace prov´ adˇet aˇz pˇri otevˇren´ı zaˇr´ızen´ı uˇzivatelem. Je to kv˚ uli tomu, ˇze pˇrid´av´an´ı a odeb´ır´an´ı zaˇr´ızen´ı prob´ıh´ a pouze v jednom vl´ aknˇe. Mohlo by tak b´ yt zp˚ usobeno napˇr. zpomalen´ı detekce zaˇr´ızen´ı syst´emem. Zjednoduˇsen´a funkce probe() pro CAN-USB pˇrevodn´ık vypad´a n´asledovnˇe: Listing 7.5: Funkce probe() 1 s t a t i c int c t u u s b c a n p r o b e ( struct u s b i n t e r f a c e ∗ i n t f , 2 const struct u s b d e v i c e i d ∗ i d ) 3 { 4 struct n e t d e v i c e ∗ netdev ; 5 struct c t u u s b c a n u s b ∗ dev ; 6 7 netdev = a l l o c c a n d e v ( s i z e o f ( struct c t u u s b c a n u s b ) , 8 USBCAN TOT TX URBS ) ; 9 dev = n e t d e v p r i v ( netdev ) ; 10 11 dev−>udev = i n t e r f a c e t o u s b d e v ( i n t f ) ; 12 dev−>netdev = netdev ; 13 14 netdev−>n e t d e v o p s = &c t u u s b c a n n e t d e v o p s ; 15 netdev−>f l a g s |= IFF ECHO ; 16 17 /∗ s e t up t h e e n d p o i n t i n f o r m a t i o n ∗/ 18 /∗ . . . ∗/ 19 20 u s b s e t i n t f d a t a ( i n t f , dev ) ; 21 SET NETDEV DEV( netdev , &i n t f −>dev ) ; 22 23 i f ( g e t b i t t i m i n g c o n s t a n t s ( dev ) ) { 24 e r r ( ” Could not g e t b i t t i m i n g c o n s t a n t s \n” ) ;
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
25 26 27 28 29 30 31 32 33 34 35 e x i t : 36 37 }
40
goto e x i t ; } dev−>can . c l o c k . f r e q = dev−>c a n c l o c k ; dev−>can . b i t t i m i n g c o n s t = &dev−>b t c ; dev−>can . d o s e t b i t t i m i n g = c t u u s b c a n s e t b i t t i m i n g ; dev−>can . d o s e t m o d e = c t u u s b c a n s e t m o d e ; e r r = r e g i s t e r c a n d e v ( netdev ) ; return 0 ;
7 → Alokuje a nastav´ı strukturu reprezentuj´ıc´ı CAN jako s´ıt’ov´e zaˇr´ızen´ı. Argumenty jsou velikost struktury pro priv´ atn´ı data a poˇcet URBs pro odes´ıl´an´ı. 9 → Z´ısk´an´ı ukazatele na strukturu priv´atn´ıch dat. 11 → Uloˇzen´ı ukazatele na USB zaˇr´ızen´ı z´ıskan´eho z USB rozhran´ı. 12 → Uloˇzen´ı ukazatele na s´ıt’ov´e zaˇr´ızen´ı. 14 → Pˇred´ an´ı struktury s ukazateli na ˇr´ıdic´ı funkce s´ıt’ov´eho rozhran´ı. 15 → Nastaven´ı informace, ˇze ovladaˇc podporuje local loopback. 18 → Z´ısk´ an´ı informac´ı o koncov´ ych bodech a uloˇzen´ı do struktury priv´atn´ıch dat ze struktury struct usb interface 20 → Poskytnut´ı priv´ atn´ıch dat USB rozhran´ı. 21 → Nastav´ı sysfs referenci fyzick´eho zaˇr´ızen´ı s´ıt’ov´emu logick´emu zaˇr´ızen´ı. 23 → Vol´ an´ı funkce, kter´ a m´ a za u ´kol z pˇrevodn´ıku zjistit parametry CAN ˇradiˇce pro n´asledn´ y v´ ypoˇcet ˇcasov´ ych parametr˚ u. Bude vysvˇetlena pozdˇeji. 28 - 31 → Pokud probˇehlo z´ısk´ an´ı parametr˚ u korektnˇe (ˇr´adka 23 ), doch´az´ı k jejich pˇred´an´ı do struktury struct can priv v priv´atn´ıch datech. Z hodnot v n´ı totiˇz vych´az´ı funkcionalita v´ ypoˇctu ˇcasov´ ych parametr˚ u CAN sbˇernice, kter´a je vol´ana pˇri povolov´an´ı zaˇr´ızen´ı uˇzivatelem prostˇrednictv´ım n´ astroj˚ u z iproute2. 33 → CAN zaˇr´ızen´ı je zaregistrov´ ano do s´ıt’ov´eho subsyst´emu. Po pˇr´ıpojen´ı zaˇr´ızen´ı a proveden´ı funkce probe() by jiˇz v syst´emu mˇelo b´ yt zaˇr´ızen´ı zobrazeno jako CAN rozhran´ı (napˇr. can0), coˇz je moˇzn´e ovˇeˇrit zavol´an´ım: $ cat /proc/net/dev Zat´ım vˇsak z˚ ust´ av´ a neaktivn´ı. Je nutn´e mu nastavit parametry a n´aslednˇe ho povolit. 7.4.3.2
Funkce disconnect()
Jak jiˇz bylo ˇreˇceno, disconnect() je callback funkce, kterou vol´a USB core v pˇr´ıpadˇe, kdy by ovladaˇc jiˇz d´ ale nemˇel m´ıt kontrolu nad rozhran´ım (napˇr. pokud dojde k odpojen´ı zaˇr´ızen´ı). Ukazatel na tuto funkci definovanou v ovladaˇci se pˇred´av´a pˇri registraci ovladaˇce. Zjednoduˇsen´ a funkce disconnect() pro CAN-USB pˇrevodn´ık vypad´a n´asledovnˇe:
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
41
Listing 7.6: Funkce disconnect() 1 s t a t i c void c t u u s b c a n d i s c o n n e c t ( struct u s b i n t e r f a c e ∗ i n t f ) 2 { 3 struct c t u u s b c a n u s b ∗ dev = u s b g e t i n t f d a t a ( i n t f ) ; 4 u s b s e t i n t f d a t a ( i n t f , NULL ) ; 5 6 i f ( dev ) { 7 u n r e g i s t e r n e t d e v ( dev−>netdev ) ; 8 f r e e c a n d e v ( dev−>netdev ) ; 9 } 10 }
3 → Z´ısk´an´ı ukazatele na strukturu priv´atn´ıch dat. 4 → Nastaven´ı ukazatele na priv´ atn´ı data USB zaˇr´ızen´ı na NULL k zabr´anˇen´ı dalˇs´ıch (chybn´ ych) pˇr´ıstup˚ u k tˇemato dat˚ um. 7 → Odebr´ an´ı zaˇr´ızen´ı z j´ adra. 8 → Uvolnˇen´ı z pamˇeti (pokud existuje pouze jedna reference).
7.4.4
Funkce s´ıt’ov´ eho rozhran´ı
Ve v´ ypisu 7.5 funkce probe() byla na ˇr´adku 14 zm´ınˇena velmi d˚ uleˇzit´a vˇec. Jde o vyplnˇen´ı poloˇzky netdev ops struktury struct net device, coˇz je ukazatel na strukturu struct net device ops. Tato struktura definuje ukazatele na ˇr´ıdic´ı funkce s´ıt’ov´ ych rozhran´ı a mus´ı b´ yt vyplnˇena pˇred registrac´ı zaˇr´ızen´ı do s´ıt’ov´eho subsyst´emu. CAN zaˇr´ızen´ı obvykle implementuje pouze tˇri funkce, kter´e lze vidˇet na k´odu pˇrevodn´ıku: static const struct net_device_ops ctu_usbcan_netdev_ops = { .ndo_open = ctu_usbcan_open, .ndo_stop = ctu_usbcan_close, .ndo_start_xmit = ctu_usbcan_start_xmit, }; Prvn´ı poloˇzka struktury je ukazatel na funkci ndo open(), kter´a se vol´a pˇri povolov´an´ı zaˇr´ızen´ı. Druh´ y je ukazatel na funkci ndo stop(), kter´a se vol´a pˇri zakazov´an´ı zaˇr´ızen´ı. Posledn´ı je ukazatel na funkci ndo start xmit(), kter´a se vol´a v pˇr´ıpadˇe potˇreby pˇrenosu paketu. Packet scheduler m´ a pro kaˇzd´e s´ıt’ov´e zaˇr´ızen´ı odes´ılac´ı frontu. Pˇri aktivaci zaˇr´ızen´ı (ndo open()) mus´ı b´ yt tato fronta spuˇstˇena. Pot´e m˚ uˇze packet scheduler volat funkci ndo start xmit() (v kontextu softIRQ) v pˇr´ıpadˇe potˇreby pˇrenosu paketu [3].
7.4.5
Nastaven´ı, povolen´ı a zak´ az´ an´ı CAN zaˇ r´ızen´ı
CAN zaˇr´ızen´ı lze nastavovat pˇres netlink rozhran´ı pomoc´ı programu ip z iproute2, coˇz je kolekce n´astroj˚ u t´ ykaj´ıc´ıch se spr´ avy s´ıt’ov´e oblasti. Pomoc´ı ip lze povolit/zak´azat zaˇr´ızen´ı, nastavovat ˇcasov´e parametry ˇci zobrazovat statistiky. Podrobn´ y pˇrehled lze nal´ezt v dokumentaci k SocketCAN v sekci 6.5 (soubor Documentation/networking/can.txt).
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
7.4.5.1
42
Nastaven´ı
Parametry ˇcasov´ an´ı komunikace CAN sbˇernice mohou b´ yt vˇzdy vyj´adˇreny v hardwarovˇe nez´avisl´em form´ atu jak plyne ze specifikace. SocketCAN obsahuje funkcionalitu, kter´a umoˇzn ˇuje tyto parametry vypoˇc´ıst pro c´ılen´ y CAN ˇradiˇc na z´akladˇe poˇzadovan´e komunikaˇcn´ı rychlosti, pracovn´ı frekvence ˇradiˇce a interval˚ u moˇzn´ ych hodnot, jak´ ymi m˚ uˇze b´ yt ˇradiˇc nastaven. Nastaven´ı CAN zaˇr´ızen´ı se z´ amˇerem komunikovat rychlost´ı 1 Mb/s pak m˚ uˇze vypadat: $ ip link set can0 type can bitrate 1000000 Zde specifikujeme poˇzadovanou rychlost, ostatn´ı parametry pro v´ ypoˇcet vˇsak mus´ı b´ yt jiˇz k dispozici. Pr´ avˇe jejich z´ısk´ an´ı se prov´ad´ı ve funkci probe() popisovan´e v sekci 7.4.3.1, konkr´etnˇe ve v´ ypisu 7.5 na ˇr´ adc´ıch 23-31. Zde se tedy nejprve vol´a funkce, kter´a m´a za u ´kol z pˇrevodn´ıku zjistit parametry CAN ˇradiˇce. Pokud probˇehne korektnˇe, doch´az´ı k pˇred´an´ı parametr˚ u do struktury struct can priv v priv´atn´ıch datech. Konkr´etnˇe frekvence ˇradiˇce a ukazatel na strukturu struct can bittiming const, kter´a obsahuje zm´ınˇen´e intervaly moˇzn´ ych hodnot, kter´ ymi m˚ uˇze b´ yt ˇradiˇc nastaven. Pokud pak dojde k poˇzadavku o nastaven´ı jako v pˇr´ıkladu v´ yˇse, dojde k proveden´ı funkcionality pro v´ ypoˇcet parametr˚ u pro nastaven´ı CAN ˇradiˇce a pot´e k zavol´an´ı funkce definovan´e pˇres ukazatel na funkci s prototypem: int (*do_set_bittiming)(struct net_device *dev); Tedy ve v´ ypisu 7.5 na ˇr´ adku 30. Dan´ a funkce m´a pak zajistit samotn´e nastaven´ı CAN ˇradiˇce pˇrevodn´ıku podle vypoˇcten´ ych parametr˚ u. Ty lze z´ıskat z priv´atn´ıch dat opˇet ze struktury a disponuje poloˇzkou struct can bittiming. Jej´ı poloˇzky obsahuj´ı struct can priv, kter´ pr´avˇe vypoˇcten´e parametry. 7.4.5.2
Povolen´ı
Po nastaven´ı komunikaˇcn´ıch parametr˚ u lze CAN zaˇr´ızen´ı povolit. To se prov´ad´ı jako povolen´ı kter´ehokoliv jin´eho s´ıt’ov´eho zaˇr´ızen´ı, tedy napˇr.: $ ip link set can0 up Pˇri povolen´ı zaˇr´ızen´ı vyvol´ a s´ıt’ov´ y subsyst´em callback funkci open(), registrovanou dˇr´ıve. V t´eto funkci mus´ı ovladaˇc dokonˇcit konfiguraci a po jej´ım proveden´ı mus´ı b´ yt schopen pˇrij´ımat a odes´ılat CAN zpr´ avy. V naˇsem pˇr´ıpadˇe tato funkce zavol´a funkci open candev() coˇz je obecn´ a funkce, kter´ a je vol´ ana pˇri povolen´ı zaˇr´ızen´ı. D´ale je tˇreba povolit odes´ıl´an´ı samotn´ ych zpr´ av, tedy umoˇznit vyˇsˇs´ım vrstv´am volat odes´ılac´ı funkci. To provedeme pˇres netif start queue(). Obˇe zm´ınˇen´e funkce se volaj´ı s argumentem s´ıt’ov´eho zaˇr´ızen´ı, tedy s ukazatelem na strukturu struct net device a ten dost´av´a jako argument volan´a funkce open(). Jej´ım posledn´ım krokem je spuˇstˇen´ı vl´akna, kter´e bude m´ıt na starosti obsluhu veˇsker´e komunikace.
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
7.4.5.3
43
Zak´ az´ an´ı
Z´akaz CAN zaˇr´ızen´ı lze prov´est jako zak´az´an´ı kter´ehokoliv jin´eho s´ıt’ov´eho zaˇr´ızen´ı, tedy napˇr.: $ ip link set can0 down Pˇri zak´ az´ an´ı zaˇr´ızen´ı vyvol´ a s´ıt’ov´ y subsyst´em callback funkci close(), registrovanou dˇr´ıve. V t´eto funkci se provedou kroky analogick´e k povolen´ı, pouze s opaˇcn´ ym efektem. Tedy nejprve poˇzadavek na ukonˇcen´ı obsluˇzn´eho vl´akna, d´ale zastaven´ı odes´ılac´ı fronty pˇres netif stop queue() a nakonec funkce close candev().
7.4.6
Obsluˇ zn´ e vl´ akno a fronty
D´ale existuje oddˇelen´e vl´ akno, kter´e se o pr˚ ubˇeh komunikace star´a. Toto vl´akno je spuˇstˇeno ve funkci ctu usbcan open() pˇri povolen´ı rozhran´ı a zastaveno ve funkci ctu usbcan close() pˇri zak´az´an´ı rozhran´ı. Ve funkci, kterou vl´akno vykon´av´a, doch´az´ı k alokaci a nastaven´ı prostˇredk˚ u USB komunikace zvan´ ych URB. Jejich obecn´e pouˇzit´ı bylo vysvˇetleno v sekci 7.3.2.5. V syst´emu se pak pracuje s komunikaˇcn´ımi objekty, kter´e reprezentuje struktura: struct usbcan_message { struct urb *u; struct ctu_usbcan_usb *dev; u8 msg[USBCAN_TRANSFER_SIZE]; u32 echo_index; u8 dlc; struct list_head list_node; }; V n´ı je tedy odkaz na souvisej´ıc´ı URB a tak´e na priv´atn´ı data. D´ale bytov´e pole pro pˇren´aˇsen´a data (msg), d´elka samotn´e CAN zpr´avy (dlc), pro odes´ılan´e zpr´avy index pro local loopback funkcionalitu (echo index) a posledn´ı je poloˇzka pro potˇreby um´ıstˇen´ı objektu do front (list node). Existuje pak nˇekolik front tˇechto objekt˚ u, kter´e urˇcuj´ı jejich ˇzivotn´ı cyklus. Pro pˇr´ıjem jsou to: • rx pend list - URB tˇechto objekt˚ u je poskytnut do USB core a ˇcek´a na pˇr´ıjem dat • rx ready list - URB tˇechto pˇrij´ımac´ıch objekt˚ u byl vyˇr´ızen, maj´ı k dispozici platn´a pˇrijat´ a data Pro odes´ıl´ an´ı jsou to: • tx idle list - Objekty pˇripraven´e k pouˇzit´ı pro odesl´an´ı zpr´avy • tx pend list - URB poskytnut do USB core k odesl´an´ı platn´ ych dat
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
44
• tx ready list - URB tˇechto odes´ılac´ıch objekt˚ u byl vyˇr´ızen, obsahuj´ı dosud potvrzen´e odeslan´e zpr´ avy Z pouˇzit´ı front je patrn´e, ˇze doch´az´ı k alokaci nˇekolika tˇechto odes´ılac´ıch a pˇrij´ımac´ıch blok˚ u pˇred zaˇc´ atkem komunikace a n´aslednˇe jsou pouze pˇrem´ıst’ov´any v r´amci front. Jejich poˇcet je definov´ an na z´ akladˇe maker USBCAN TOT RX URBS a USBCAN TOT TX URBS. Tento zp˚ usob sniˇzuje reˇzii na alokaci struktur oproti moˇzn´emu dynamick´em vytv´aˇren´ı pˇri potˇrebˇe pˇrenosu. Pˇr´ıklad alokace v n´ asleduj´ıc´ım fragmentu: Listing 7.7: Alokace a nastaven´ı komunikaˇcn´ıch objekt˚ u 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/∗ dev −> p o i n t e r t o p r i v a t e d a t a ( s t r u c t c t u u s b c a n u s b ∗ dev ) ∗/ struct u s b c a n m e s s a g e ∗m; struct urb ∗u ; /∗ Prepare t r a n s m i t u r b s ∗/ f o r ( i =0; i dev = dev−>udev ; m−>u = u ; m−>dev = dev ; m−>e c h o i n d e x = i ; u s b f i l l b u l k u r b ( u , dev−>udev , u s b s n d b u l k p i p e ( dev−>udev , dev−>b u l k o u t e n d p o i n t A d d r ) , m−>msg , USBCAN TRANSFER SIZE, c t u u s b c a n t x c a l l b a c k , m) ; l i s t a d d t a i l (&m−>l i s t n o d e , &dev−> t x i d l e l i s t ) ; }
Po alokaci a nastaven´ı pˇrij´ımac´ıch a odes´ılac´ıch komunikaˇcn´ıch prostˇredk˚ u vl´akno zaˇc´ın´a prov´adˇet nekoneˇcnou smyˇcku, kter´ a vyˇrizuje komunikaci. Pokud neprob´ıh´a pˇrenos zpr´av, je vl´akno usp´ ano a k jeho opˇetovn´emu vzbuzen´ı doch´az´ı v mechanismech dokonˇcovac´ıch callback funkc´ı po vyˇr´ızen´ı URB poˇzadavku. Pokud pˇrijde poˇzadavek na ukonˇcen´ı vl´akna, ukonˇc´ı a uvoln´ı vˇsechny j´ım alokovan´e prostˇredky (komunikaˇcn´ı objekty, URBs).
7.4.7
Pˇ r´ıjem
Pˇri pˇr´ıjmu doch´ az´ı k vyvol´ an´ı callback funkce definovan´e pˇri nastavov´an´ı URB viz. sekce 7.3.2.5. Zjiˇstˇen´ı, kter´eho komunikaˇcn´ıho objektu se vyvol´an´ı t´ yka a zda byl pˇr´ıjem dat u ´spˇeˇsn´ y, lze vidˇet v n´ asleduj´ıc´ım fragmentu k´odu: Listing 7.8: rx callback 1 s t a t i c void c t u u s b c a n r x c a l l b a c k ( struct urb ∗ urb )
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
2 { 3 4 5 6 7 8 9 10 11 12 13 }
45
struct u s b c a n m e s s a g e ∗m = urb−>c o n t e x t ; i f ( urb−>s t a t u s != 0 ) { e r r ( ”RX c a l l b a c k : e r r o r ” ) ; return ; } /∗ . . . ∗/
Dalˇs´ı funkcionalitou, kter´ a je zaznaˇcena teˇckami na ˇr´adku 11 je nastaven´ı pˇr´ıznaku platn´ ych pˇrijat´ ych dat USBCAN DATA OK, na z´akladˇe kter´eho je vzbuzeno vl´akno staraj´ıc´ı se o komunikaci a pˇresun komunikaˇcn´ıho objektu z rx pend list do rx ready list. Vl´akno obsluhuje pˇr´ıjem tak, ˇze testuje obsazenost pr´avˇe rx ready list. Dokud nen´ı fronta pr´azdn´ a, vol´ a usbcan kthread read handler(), kter´emu pˇred´av´a komunikaˇcn´ı objekt z vrcholu fronty. Tato funkce pˇredstavuje samotn´e zpracov´an´ı pˇrijat´e CAN zpr´avy a poskytuje n´asledn´e pˇred´ an´ı vyˇsˇs´ım s´ıt’ov´ ym vrstv´am v pˇr´ısluˇsn´e formˇe. Pro pˇredstavu n´asleduje fragment k´ odu: Listing 7.9: Funkce vl´akna obsluhuj´ıc´ı pˇr´ıjem 1 void u s b c a n k t h r e a d r e a d h a n d l e r ( struct c t u u s b c a n u s b ∗ dev , 2 struct u s b c a n m e s s a g e ∗m) 3 { 4 5 struct c a n f r a m e ∗ c f ; 6 struct s k b u f f ∗ skb ; 7 struct n e t d e v i c e s t a t s ∗ s t a t s = &dev−>netdev−>s t a t s ; 8 9 skb = a l l o c c a n s k b ( dev−>netdev , &c f ) ; 10 11 /∗ . . . t o c f from m−>msg . . . ∗/ 12 13 n e t i f r x ( skb ) ; 14 15 s t a t s −>r x p a c k e t s ++; 16 s t a t s −>r x b y t e s += c f −>c a n d l c ; 17 18 /∗ . . . ∗/ 19 20 }
5 → Struktura struct can frame je z´akladn´ı podoba CAN r´amce, se kterou SocketCAN pracuje. 6 → Struktura struct sk buff popisuje socket buffer v s´ıt’ov´em subsyst´emu. 9 → Alokuje socket buffer, kter´ y bude oznaˇcen jako nositel CAN zpr´avy (viz. 6.3.3) a nastav´ı (cf) jako ukazatel do jeho datov´e oblasti. 11 → Naznaˇceno vyplnˇen´ı struktury (cf) hodnotami z datov´eho bufferu pˇrenesen´ ych dat
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
46
(m->msg). 13 → Pˇred´ an´ı paketu vyˇsˇs´ı vrstvˇe - packet scheduler (obr´azek 6.1 ˇc´ast b). ´ 15 - 16 → Uprava pˇrij´ımac´ıch statistik. 18 → Dalˇs´ı funkcionalitou je pˇresun komunikaˇcn´ıho objektu do rx pend list a opˇetovn´e poskytnut´ı jeho URB do USB core k pˇrijmu dalˇs´ı zpr´avy. Takto vypad´ a cyklus pˇrijet´ı zpr´ avy ovladaˇcem. Ve struˇcnosti zprostˇredkov´av´a pˇr´ıjem od niˇzˇs´ı vrstvy (USB subsyst´em) a pˇred´av´a vyˇsˇs´ı vrstvˇe (s´ıt’ov´a vrstva - SocketCAN).
7.4.8
Odes´ıl´ an´ı
Cyklus odesl´ an´ı zpr´ avy zaˇc´ın´ a zavol´an´ım funkce ctu usbcan start xmit() registrovan´e dˇr´ıve. To znaˇc´ı poˇzadavek na odesl´ an´ı CAN zpr´avy. Listing 7.10: Odes´ıl´an´ı zpr´avy 1 s t a t i c n e t d e v t x t c t u u s b c a n s t a r t x m i t ( struct s k b u f f ∗ skb , 2 struct n e t d e v i c e ∗ netdev ) 3 { 4 struct c t u u s b c a n u s b ∗ dev = n e t d e v p r i v ( netdev ) ; 5 struct c a n f r a m e ∗ c f = ( struct c a n f r a m e ∗ ) skb−>data ; 6 7 struct u s b c a n m e s s a g e ∗m; 8 m = l i s t f i r s t e n t r y (&dev−> t x i d l e l i s t , t y p e o f ( ∗m) , l i s t n o d e ) ; 9 10 /∗ . . . from c f t o m−>msg . . . ∗/ 11 12 /∗ p u t on s t a c k − l o c a l echo ∗/ 13 c a n p u t e c h o s k b ( skb , netdev , m−>e c h o i n d e x ) ; 14 15 /∗ . . . ∗/ 16 17 /∗ s l o w down t x p a t h i f needed ∗/ 18 i f ( l i s t e m p t y (&dev−> t x i d l e l i s t ) ) 19 n e t i f s t o p q u e u e ( netdev ) ; 20 21 return NETDEV TX OK; 22 }
Vid´ıme, ˇze se n´ am zde logicky objevuj´ı stejn´e struktury jako pˇri pˇrijmu, tedy struct can frame reprezentuj´ıc´ı CAN r´ amec SocketCAN a sk buff reprezentuj´ıc´ı socket buffer slouˇz´ıc´ı k pˇrenosu paket˚ u s´ıt’ovou vrstvou. 5 → Datov´ a oblast skb->data reprezentuje CAN r´amec (struct can frame) 8 → Prvn´ı komununikaˇcn´ı objekt z tx idle list tedy volnˇe pouˇziteln´ y k odesl´an´ı zpr´avy 10 → Naznaˇceno vyplnˇen´ı hodnot datov´eho bufferu odes´ılan´ ych dat (m->msg) ze struktury (cf). Tedy analogicky opaˇcn´ y proces k pˇr´ıjmu. 13 → Buffer je uloˇzen pro u ´ˇcely local loopack (viz. 6.3.2) 15 → Dalˇs´ı funkcionalitou je pˇresun komunikaˇcn´ıho objektu do tx pend list a poskytnut´ı jeho URB do USB core k odesl´ an´ı zpr´avy. 18 - 19 → Pokud jiˇz nen´ı ˇz´ adn´ y voln´ y komunikaˇcn´ı objekt v tx idle list, mus´ıme zastavit odes´ılac´ı frontu a znemoˇznit tak dalˇs´ı vol´an´ı ctu usbcan start xmit().
ˇ PREVODN ˇ ´IKU CAN-USB KAPITOLA 7. OVLADAC
47
Pokud doˇslo k u ´spˇeˇsn´emu vyˇr´ızen´ı URB a tedy odesl´an´ı zpr´avy na sbˇernici, doch´az´ı k vyvol´an´ı callback funkce ctu usbcan tx callback() obdobnˇe jako u pˇr´ıjimac´ı callback funkce popsan´e v pˇredchoz´ı sekci. Struktura a funkcionalita je obdobn´a, pouze komunikaˇcn´ı objekt je pˇresunut do fronty pˇr´ısluˇsej´ıc´ı odes´ıl´an´ı (tx ready list). Nav´ıc jsou zde pouze upraveny odes´ılac´ı statistiky a zavol´ana funkce can get echo skb(), kdy je socket buffer vyzvednut zpˇet ze z´ asobn´ıku pro u ´ˇcely local loopback a je tak vytvoˇreno ”echo”pr´avˇe odeslan´e zpr´avy. Vl´akno dokonˇcuje odesl´ an´ı tak, ˇze testuje obsazenost tx ready list. Dokud nen´ı fronta pr´azdn´a, vol´ a usbcan kthread write handler(), kter´emu pˇred´av´a komunikaˇcn´ı objekt z vrcholu fronty. Princip tedy opˇet analogick´ y k pˇr´ıjmu. V t´eto funkci vˇsak doch´az´ı pouze ke dvˇema u ´kon˚ um. Prvn´ım je pˇresunut´ı komunikaˇcn´ıho objektu do tx idle list, kde bude tedy opˇet volnˇe pouˇziteln´ y pro odes´ıl´an´ı dalˇs´ıch zpr´av. D´ale pokud je zastavena odes´ılac´ı ´ fronta, mus´ıme ji opˇet spustit pro umoˇznˇen´ı vol´an´ı ctu usbcan start xmit(). Ukony u ´pravy odes´ılac´ıch statistik a echo by se jistˇe daly prov´adˇet i v t´eto funkci. V dokonˇcovac´ı callback funkci jsou um´ıstˇeny pouze pro logickou vazbu s upozornˇen´ım na fyzick´e odesl´an´ı. Listing 7.11: Funkce vl´akna dokonˇcuj´ıc´ı cyklus odes´ıl´an´ı 1 void u s b c a n k t h r e a d w r i t e h a n d l e r ( struct c t u u s b c a n u s b ∗ dev , 2 struct u s b c a n m e s s a g e ∗m) 3 { 4 u s b c a n u s b m e s s a g e m o v e l i s t ( dev , m, &dev−> t x i d l e l i s t ) ; 5 6 i f ( n e t i f q u e u e s t o p p e d ( dev−>netdev ) ) 7 n e t i f w a k e q u e u e ( dev−>netdev ) ; 8 }
Takto vypad´ a cyklus odesl´ an´ı zpr´avy ovladaˇcem. Ve struˇcnosti zprostˇredkov´av´a pˇr´ıjem od vyˇsˇs´ı vrstvy (s´ıt’ov´ a vrstva - SocketCAN) a pˇred´av´a niˇzˇs´ı vrstvˇe (USB subsyst´em).
Kapitola 8
Testov´ an´ı V´ yvoj i testov´ an´ı prob´ıhaly s re´ aln´ ym vyuˇzit´ım sbˇernice CAN. Druh´ y prvek na sbˇernici, se kter´ ym pˇrevodn´ık prostˇrednictv´ım CAN komunikoval, byl starˇs´ı CAN-USB pˇrevodn´ık ˇ c sbˇernice implementovan´ y v roce 2008 v r´ amci bakal´aˇrsk´e pr´ace J. Kˇr´ıˇze s n´azvem Radiˇ 1 CAN pˇripojen´y k PC pˇres sbˇernici USB . Tento pˇrevodn´ık je zaloˇzen na mikrokontrol´eru LPC2148, obsahuje extern´ı CAN ˇradiˇc SJA1000 a podporuje ho ovladaˇc LinCAN. Sestavu je moˇzn´e vidˇet na obr´ azku 8.1. Pˇrevodn´ık navrˇzen´ y v t´eto pr´aci (s LPC1768) byl pak pˇripojen k notebooku s frekvenc´ı procesoru 2GHz. Starˇs´ı pˇrevodn´ık (s LPC2148) byl pak pˇripojen k PC s frekvenc´ı procesoru 2,8GHz. Oba poˇc´ıtaˇce maj´ı architekturu IA-32 a operaˇcn´ı syst´em GNU/Linux Ubuntu 10.04 se standardn´ım j´adrem 2.6.32-35. Jelikoˇz komunikaˇcn´ı protokol po USB sbˇernici mezi obˇema pˇrevodn´ıky a poˇc´ıtaˇcem je velmi podobn´ y 2 , podaˇrilo se s nˇekolika drobn´ ymi u ´pravami ovladaˇce zaloˇzen´eho na SocketCAN poskytnout starˇs´ımu pˇrevodn´ıku podporu t´ımto ovladaˇcem 3 . Takto mohly b´ yt v r´amci jednoho testov´ an´ı pokryty veˇsker´e poˇzadavky ze zad´an´ı. Tedy konkr´etnˇe: • Otestovat souˇcinnost implementace firmware pˇrevodn´ıku s ovladaˇcem pro USB zaˇr´ızen´ı LinCAN. • Otestovat souˇcinnost implementace firmware pˇrevodn´ıku s vyvinut´ ym ovladaˇcem pro USB zaˇr´ızen´ı zaloˇzen´em na SocketCAN. • Porovnat vlastnosti s´ıtov´eho ovladaˇce zaloˇzen´eho na SocketCAN se znakov´ ym ovladaˇcem LinCAN 4 .
8.1
Pr˚ ubˇ eh test˚ u
Samotn´e testov´ an´ı vych´ az´ı z ˇcl´ anku [6], kter´ y se zab´ yv´a ˇcasovou anal´ yzou Linuxov´ ych ovladaˇc˚ u pro CAN. Byl mˇeren tzv. round trip time tedy ˇcas mezi odesl´an´ım zpr´avy druh´emu 1
pr´ ace je dostupn´ a z [8] z´ amˇernˇe - kv˚ uli budouc´ımu slouˇcen´ı funkcionality pro jednoduchou volbu podle aktu´ alnˇe poˇzadov´eho typu hardware 3 pouze pro u ´ˇcely tohoto testov´ an´ı, k pln´e podpoˇre se mus´ı upravit firmware pˇrevodn´ıku 4 bud’ obˇe zaˇr´ızen´ı vyuˇz´ıvaj´ı LinCAN, nebo obˇe zaˇr´ızen´ı vyuˇz´ıvaj´ı ovladaˇc zaloˇzen´ y na SocketCAN 2
48
´ ´I KAPITOLA 8. TESTOVAN
49
Obr´ azek 8.1: Sestava hardware pro v´ yvoj a testov´an´ı
uzlu a jej´ım n´ asledn´em opˇetovn´em pˇrijet´ı. K tomu byl vyuˇzit n´astroj canping 5 . Tato aplikace umoˇzn ˇuje odes´ılat zpr´ avy a mˇeˇrit ˇcas, kter´ y uplyne, neˇz dostane odpovˇed’. Dalˇs´ı zpr´ava je odesl´ana aˇz po obdrˇzen´ı odpovˇedi na pˇredchoz´ı odeslanou zpr´avu. Aplikace se spouˇst´ı z pˇr´ıkazov´e ˇr´ adky a pomoc´ı pˇrep´ınaˇc˚ u lze specifikovat r˚ uzn´a nastaven´ı jako poˇcet vl´aken, poˇcet odes´ılan´ ych zpr´ av, ˇcasovou prodlevu mezi zpr´avami atd. Namˇeˇren´e ˇcasy jsou statisticky zpracov´ any mohou z nich b´ yt vytvoˇreny histrogramy. K pˇr´ıstupu k oboum typ˚ um ovladaˇc˚ u canping pouˇz´ıv´ a knihovnu VCA (Vitual CAN API). Ta je souˇc´ast´ı projektu OrtCAN (OCERA Real-Time CAN) a informace o n´ı lze nal´ezt na [11]. Bylo provedeno nˇekolik test˚ u s promˇenn´ ymi parametry poˇctu odes´ılac´ıch/pˇrij´ımac´ıch vl´aken a ˇcasov´e prodlevy mezi odes´ıl´ an´ım jednotliv´ ych zpr´av. V kaˇzd´em testu bylo kaˇzd´ ym vl´aknem odesl´ ano 10 000 zpr´ av. Rychlost sbˇernice (bitrate) byla nastavena na 1 Mb/s. Z namˇeˇren´ ych dat byly vytvoˇreny grafy. Kaˇzd´ y graf zobrazuje tzv. latency profile. To je kumulativn´ı histogram s pˇrevr´ acenou vertik´aln´ı osou v logaritmick´em mˇeˇr´ıtku. Horizont´aln´ı osu pak tvoˇr´ı uplynul´ y ˇcas. Z tohoto grafu je pak moˇzn´e dobˇre vidˇet pˇresn´ y poˇcet zpr´av s nejhorˇs´ı latenc´ı6 . Tyto grafy je moˇzn´e vidˇet na obr´azc´ıch, kter´e budou n´asledovat. Pouze 5
http://rtime.felk.cvut.cz/gitweb/canping.git Obyˇcejn´e histogramy nejsou pro zjiˇstˇen´ı maxim´ aln´ıho zpoˇzdˇen´ı vhodn´e, jelikoˇz ho vˇetˇsinou reprezentouje pouze velmi mal´ y poˇcet zpr´ av. Hodnotu tohoto maxima je pak v grafu tˇeˇzk´e odhalit 6
´ ´I KAPITOLA 8. TESTOVAN
50
na obr´azku 8.3 je pro zaj´ımavost moˇzn´e vidˇet pˇrehled historie round trip time vˇsech zpr´av dan´eho testu. Obr´ azek 8.2: Round trip time - 1 vl´akno, nulov´a prodleva
Obr´ azek 8.3: Round trip time historie - 1 vl´akno, nulov´a prodleva
´ ´I KAPITOLA 8. TESTOVAN
Obr´ azek 8.4: Round trip time - 3 vl´akna, nulov´a prodleva
Obr´ azek 8.5: Round trip time - 1 vl´akno, prodleva 0, 1 a 2 ms
51
52
´ ´I KAPITOLA 8. TESTOVAN
Pro zaj´ımavost je zde jiˇz pouze textovˇe uveden v´ ypis z testov´an´ı s deseti paraleln´ımi vl´akny s nulovou prodlevou. Pro SocketCAN je to: $ sudo ./vca_canping -m 10 -d Summary statistics: Id 1000: count = 10000 mean = Id 1002: count = 10000 mean = Id 1004: count = 10000 mean = Id 1006: count = 10000 mean = Id 1008: count = 10000 mean = Id 1010: count = 10000 mean = Id 1012: count = 10000 mean = Id 1014: count = 10000 mean = Id 1016: count = 10000 mean = Id 1018: count = 10000 mean =
socketcan:can0 -c 10000 -w 0 3988.86 3987.05 3984.19 3989.89 3995.95 3984.37 4017.68 4009.11 3979.38 3991.75
stddev stddev stddev stddev stddev stddev stddev stddev stddev stddev
= = = = = = = = = =
611.34 607.88 600.74 618.49 637.82 648.53 686.59 663.80 632.11 629.80
min min min min min min min min min min
= = = = = = = = = =
1911 1913 1924 1884 1952 1896 1272 1926 1869 1896
max max max max max max max max max max
= = = = = = = = = =
8127 8010 7961 8123 8500 8924 8997 8974 8051 7986
[us] [us] [us] [us] [us] [us] [us] [us] [us] [us]
loss loss loss loss loss loss loss loss loss loss
= = = = = = = = = =
0% 0% 0% 0% 0% 0% 0% 0% 0% 0%
(0) (0) (0) (0) (0) (0) (0) (0) (0) (0)
min min min min min min min min min min
= = = = = = = = = =
1821 1863 1664 1632 1832 1781 1854 988 1862 1804
max max max max max max max max max max
= = = = = = = = = =
5294 4866 6905 6390 5453 5431 7414 6392 7867 6339
[us] [us] [us] [us] [us] [us] [us] [us] [us] [us]
loss loss loss loss loss loss loss loss loss loss
= = = = = = = = = =
0% 0% 0% 0% 0% 0% 0% 0% 0% 0%
(0) (0) (0) (0) (0) (0) (0) (0) (0) (0)
Pro LinCAN pak v´ ypis vypad´ a n´ asledovnˇe: $ sudo ./vca_canping -m 10 -d Summary statistics: Id 1000: count = 10000 mean = Id 1002: count = 10000 mean = Id 1004: count = 10000 mean = Id 1006: count = 10000 mean = Id 1008: count = 10000 mean = Id 1010: count = 10000 mean = Id 1012: count = 10000 mean = Id 1014: count = 10000 mean = Id 1016: count = 10000 mean = Id 1018: count = 10000 mean =
8.2
/dev/can0 -c 10000 -w 0 2784.20 2785.21 2806.85 2802.88 2796.48 2792.73 2797.77 2789.41 2798.49 2779.17
stddev stddev stddev stddev stddev stddev stddev stddev stddev stddev
= = = = = = = = = =
588.65 575.36 567.81 582.11 573.86 582.16 582.17 566.51 594.89 587.14
Zhodnocen´ı
Bylo otestov´ ano korektn´ı chov´ an´ı jak firmware pˇrevodn´ıku, tak s´ıt’ov´eho ovladaˇce zaloˇzen´eho na SocketCAN. Bˇehem testov´ an´ı nedoˇslo ke ztr´atˇe ˇz´adn´e zpr´avy. Z uveden´eho srovn´an´ı je patrn´e, ˇze vˇetˇs´ıho zpoˇzdˇen´ı na standardn´ım j´adru dosahuje SocketCAN. To je vcelku oˇcek´avateln´ y v´ ysledek, jelikoˇz SocketCAN stav´ı na obecn´e Linuxov´e s´ıt’ov´e infrastruktuˇre, naproti tomu LinCAN je se svoj´ı vnitˇrn´ı strukturou front navrˇzen pro specifick´e potˇreby CAN komunikace. Dalˇs´ı testy i s real-time j´adry je moˇzn´e naj´ıt v ˇcl´anku [6].
Kapitola 9
Z´ avˇ er V r´amci t´eto diplomov´e pr´ ace byl implentov´an firmware pro CAN-USB pˇrevodn´ık s mikrokontrol´erem LPC1768, kter´ y vyuˇz´ıv´a zdrojov´ ych k´od˚ u projektu LinCAN. D´ale byl pro tento pˇrevodn´ık vytvoˇren s´ıt’ov´ y ovladaˇc do operaˇcn´ıho syst´emu GNU/Linux. Tento ovladaˇc vyuˇz´ıv´a SocketCAN, coˇz je souˇcasn´ y CAN subsyst´em Linuxov´eho j´adra. V pr˚ ubˇehu v´ yvoje byly obˇe funkcionality postupnˇe vylepˇsov´any a testov´any. To vyvrcholilo z´avˇereˇcn´ ym testov´an´ım, kde byla ovˇeˇrena korektnost obou ˇreˇsen´ı. Z´aroveˇ n bylo provedeno z´akladn´ı srovn´an´ı ovladaˇce LinCAN a vytvoˇren´eho ovladaˇce zaloˇzen´eho na SocketCAN. SocketCAN obsahuje funkcionalitu pro v´ ypoˇcet parametr˚ u d˚ uleˇzit´ ych pro nastaven´ı ˇcasov´ an´ı CAN komunikace. K tomu vˇsak potˇrebuje zn´at intervaly moˇzn´ ych hodnot tˇechto parametr˚ u, kter´ ych m˚ uˇze ˇradiˇc CAN nab´ yvat. Prvn´ı interakc´ı mezi ovladaˇcem a pˇripojen´ ym pˇrevodn´ıkem je tak poˇzadavek ovladaˇce na zjiˇstˇen´ı tˇechto inteval˚ u. N´aslednˇe je tak´e nutn´a funkcionalita pro nastaven´ı ˇradiˇce na vypoˇcten´e hodnoty ˇcasov´an´ı. Oba tyto konfiguraˇcn´ı poˇzadavky byly implementov´ any. Po tomto nastaven´ı jiˇz m˚ uˇze prob´ıhat samotn´ y pˇrenos dat mezi ovladaˇcem a pˇrevodn´ıkem. Vylepˇsen´ım by urˇcitˇe byla implemetace nˇekter´ ych dalˇs´ıch konfiguraˇcn´ıch poˇzadavk˚ u. Ze srovn´ an´ı v kapitole testov´ an´ı je patrn´e, ˇze vˇetˇs´ıho zpoˇzdˇen´ı na standardn´ım j´adru dosahuje SocketCAN. To je vcelku oˇcek´avateln´ y v´ ysledek, jelikoˇz SocketCAN stav´ı na obecn´e Linuxov´e s´ıt’ov´e infrastruktuˇre, naproti tomu LinCAN je se svoj´ı vnitˇrn´ı strukturou front navrˇzen pro specifick´e potˇreby CAN komunikace. Urˇcitˇe by d´ale mˇelo smysl prov´est obdobn´e testov´an´ı na real-time Linuxov´em j´ adru nebo se zv´ yˇsen´ım priorit vl´aken v syst´emu.
53
Literatura [1] J. Corbet, A. Rubini, and G. Kroah-Hartman. Linux Device Drivers. O’Reilly Media, Inc., 3rd edition, 2005. http://lwn.net/Kernel/LDD3/. [2] O. Hartkopp. The CAN networking subsystem of the Linux kernel. In Proceedings of the 13th iCC, 2012. [Online]. Available: http://www.can-cia.org/fileadmin/cia/files/icc/13/hartkopp.pdf. [3] M. Kleine-Budde. SocketCAN – The official CAN API of the Linux kernel. In Proceedings of the 13th iCC, 2012. [Online]. Available: http://www.can-cia.org/fileadmin/cia/files/icc/13/kleine-budde.pdf. [4] LPC17xx User manual. Rev. 2, NXP Semiconductors, 19 August 2010. [Online]. Available: http://www.nxp.com/documents/user_manual/UM10360.pdf. [5] J. Nov´ ak. CAN bus a jeho aplikace ve vozidlech. Materi´aly k pˇredmˇetu Sbˇer a pˇrenos dat. http://measure.feld.cvut.cz/node/443, stav z 3. 5. 2012. [6] M. Sojka and P. P´ıˇsa. Timing Analysis of Linux CAN Drivers. In Proceedings of the 11th Real Time Linux Workshop, 2009. [Online]. Available: http://lwn.net/images/conf/rtlws11/papers/proc/p30.pdf. [7] Processors – ARM. http://www.arm.com/products/processors, stav z 19. 4. 2012. [8] CAN at Real-Time Systems group, DCE FEE CTU. http://rtime.felk.cvut.cz/can/, stav z 3. 5. 2012. [9] Linux USB drivers - Free Electrons. http://free-electrons.com/docs/linux-usb/, stav z 26. 4. 2012. [10] LXR - The Linux Cross Reference. http://lxr.linux.no/. [11] Webov´e str´ anky projektu OrtCAN. http://ortcan.sourceforge.net/, stav z 3. 5. 2012.
54
Pˇ r´ıloha A
Seznam pouˇ zit´ ych zkratek API Application Programming Interface BSD Berkeley Software Distribution CAN Controller Area network DSP Digital Signal Processor FPGA Field-Programmable Gate Array GPIO General Purpose Input/Output IP Internet Protocol ISA Instruction Set Architecture MAC Media Access Control MCU Microcontroller Unit POSIX Portable Operating System Interface RISC Reduced Insttruction Set Computer TCP Transmission Control Protocol UDP User Datagram Protocol USB Universal Serial Bus
55
Pˇ r´ıloha B
Obsah pˇ riloˇ zen´ eho CD . |-| | |-| | | | | ‘--
docs |-- lmc_cb1-mcu-core-sch.pdf ‘-- vanekjir.pdf lincan |-- build-embedded.sh |-- build-lincan.sh |-- embedded |-- lincan ‘-- omk socketcan-devel
sch´ ema zapojen´ ı HW text t´ eto diplomov´ e pr´ ace inicializaˇ cn´ ı skript pro pˇ reklad pˇ revodn´ ıku inicializaˇ cn´ ı skript pro pˇ reklad LinCAN zdrojov´ e k´ ody pˇ revodn´ ıku zdrojov´ e k´ ody LinCAN adres´ aˇ r sestavovac´ ıho n´ astroje OMK zdrojov´ e k´ ody projektu SocketCAN i s vytvoˇ ren´ ym ovladaˇ cem
56