Linux_embedded_cz6.pdf
(
727 KB
)
Pobierz
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
KURS
Wprowadzenie
do Linuksa embedded (6)
Obsługa interfejsu USB
W ostatniej części kursu poświęconej obsłudze interfejsów przyjrzymy
się USB. Jest on od kilkunastu lat dostępny w komputerach PC
i wyparł wiele interfejsów komputerowych, takich jak Centronics,
RS232, PS/2. We współczesnych komputerach do dyspozycji mamy
wiele gniazd USB, które są głównym interfejsem komunikacyjnym
z układami peryferyjnymi. Zajmiemy się najbardziej
rozpowszechnioną topologią magistrali USB typu master-slave.
Dodatkowe materiały na CD/FTP:
ftp://ep.com.pl
, user:
14464
, pass:
87f371o5
• poprzednie części kursu
tykanych na rynku urządzeń USB. Czytel-
nicy zapewne po tytule spodziewali się, że
w dzisiejszym odcinku będziemy mieli do
czynienia ze skomplikowanym programo-
waniem, jednak tym razem nie napisze-
my ani jednej linijki kodu, ponieważ wy-
korzystamy gotowe sterowniki USB oraz
konsolę szeregową. Dostęp do urządzeń
USB z własnych programów sprowadza
się w zasadzie do otwarcia pliku reprezen-
tującego dane urządzenie i komunikacji za
pomocą metod read/write.
W tym artykule zajmiemy się sytuacją,
w której do magistrali USB może być dołą-
czony pojedynczy układ typu master nazy-
wany hostem USB (
USB host
) oraz do 127
układów podrzędnych slave nazywanych
urządzeniami USB (
USB device
). Kontrole-
rem nadrzędnym jest najczęściej komputer
PC, natomiast urządzeniami USB są różne
urządzenia mikroprocesorowe. Interfejs
USB używa technologii
plug&play
, dzięki
czemu są automatycznie wykrywane urzą-
dzenia oraz instalowane ich sterowniki.
Od dobrych kilkunastu lat możemy
nabyć mikrokontrolery jednoukładowe,
które mają sprzętowy kontroler USB-devi-
ce, a ostatnimi czasy pojawiły się mikro-
kontrolery z interfejsem USB-OTG, który
umożliwia pracę zarówno w trybie
USB
host
jak i
USB device
. Dzięki swoim zale-
tom interfejs USB zastąpił większość in-
terfejsów komputerowych, jednak z uwagi
na dużą uniwersalność jego oprogramo-
wanie jest skomplikowane. O ile opro-
gramowanie mikrokontrolera jednoukła-
dowego pełniącego rolę urządzenia USB
z użyciem bibliotek dostarczanych przez
producenta reprezentuje średni poziom
trudności, o tyle oprogramowanie hosta
USB jest zadaniem dużo bardziej skompli-
kowanym. W wypadku oprogramowania
hosta, oprócz oprogramowania samego
układu kontrolera hosta, musimy oprogra-
mować enumerację urządzeń i komunika-
cję z urządzeniem podrzędnym. Jeżeli do
tego uwzględnić fakt, że do USB możemy
dołączyć wiele typów urządzeń oraz do-
datkowo poszczególne urządzenia mogą
być dołączane za pomocą hubów USB,
które też wymagają obsługi programowej
od strony hosta, wówczas może okazać
się, że takie zadanie jest bardzo skompli-
kowane. Dużo lepszym rozwiązaniem jest
użycie mikrokontrolera z systemem Linux,
gdzie kosztem nieco większego skompliko-
wania sprzętowego jako wartość dodaną
otrzymujemy obsługę USB (
host
i
device
!)
wraz ze sterownikami do większości spo-
Rysunek 1. Podsystem usb-host
122
ELEKTRONIKA PRAKTYCZNA 10/2011
Wprowadzenie do Linuksa embedded
Zagadnienia teoretyczne –
architektura USB
Obsługa USB w Linuksie jest realizowa-
na jest przez dwa niezależne systemy, pod-
system
usb-host
, który zapewnia infrastruk-
turę dla trybu nadrzędnego, umożliwiając
dołączenie urządzeń peryferyjnych USB oraz
usb-device
, który zapewnia infrastrukturę
umożliwiającą pracę Linuksa jako urządze-
nie podrzędne USB umożliwiając dołączanie
płytki np. do komputera PC. Na
rysunku
1
przedstawiono podsystem
usb-host. Jego
ser-
cem jest moduł
usb-core
, który z jednej stro-
ny komunikuje się ze sprzętowymi sterowni-
kami hosta, a z drugiej udostępnia niezależ-
ne od sprzętu API dla pozostałych modułów
jądra oraz implementuje główną logikę magi-
strali USB, na przykład: enumerację, obsługę
endpointów, obsługę hubów itd. Sterownik
hosta jest odpowiedzialny za komunikację ze
sprzętowym kontrolerem USB zapewniając
jednolite API dla jądra podsystemu
usb-core
.
W wypadku sprzętowych kontrolerów
USB mamy tutaj porządek, ponieważ zosta-
ły one ustandaryzowane przez irmy Intel
i Compaq, i w zasadzie większość sprzęto-
wych implementacji kontrolerów USB jest
zgodna z tą specyikacją na poziomie reje-
strów. Używane są dwa standardy: OHCI
(
Open Host Controler Interface
) przezna-
czony dla hostów
USB full speed
(12 Mb/s),
oraz EHCI (
Enhaced Host Controller Interfa-
ce
), który stanowi rozszerzony standard dla
obsługi hostów
USB hi speed
(480 Mb/s).
W większości wypadków producenci mi-
krokontrolerów stosują się do tych dwóch
standardów, zatem w Linuksie w większości
programów będziemy używać dla kontro-
lerów zgodnych z OHCI modułu
ohci_hcd
,
natomiast dla kontrolerów zgodnych z EHCI
modułu
ehci_hcd
. Moduły niezgodne z tymi
specyikacjami są rzadkością.
Jak już wielokrotnie wspominano, magi-
strala USB nie jest urządzeniem samym w so-
bie, dlatego sterowniki jądra wykorzystują
moduł
usb-core
do obsługi magistrali USB
i zależnie od rodzaju urządzenia udostępnia-
ją w przestrzeni użytkownika odpowiednie
API. Na przykład, jeżeli do USB dołączymy
konwerter USB na UART, to w przestrzeni
użytkownika, za pomocą odpowiedniego
sterownika wykorzystującego magistralę
USB i podsystem TTY, zostanie udostęp-
niony plik urządzenia /dev/ttyUSB0, który
z poziomu aplikacji możemy obsługiwać jak
zwykły port szeregowy. Jeżeli np. do USB
dołączymy kartę sieciową, to sterownik tej
karty udostępni interfejs sieciowy widoczny
jako np. eth1. Można zatem powiedzieć, że
sama magistrala USB jest „przeźroczysta” dla
użytkownika.
Istnieje również możliwość bezpośred-
niego dostępu do podsystemu USB z trybu
użytkownika. Jądro udostępnia specjalny
interfejs przestrzeni użytkownika za pomo-
Rysunek 2. Podsystem usb-device
cą
usbfs
, który jest używany przez bibliotekę
libusb
umożliwiającą bezpośrednią obsługę
magistrali oraz urządzeń USB z programów
użytkownika. Z uwagi na to, że programo-
wanie sterowników dla USB jest zadaniem
stosunkowo skomplikowanym, większość
sterowników USB jest implementowanych
w przestrzeni użytkownika z wykorzysta-
niem
libusb.
Dzięki temu można uniknąć
konieczności pisania sterowników jądra, któ-
rych uruchamianie jest trudne i skorzystać
z dobrodziejstw, jakie niesie pisanie aplikacji
w przestrzeni użytkownika.
Oddzielny podsystem stanowi obsługa
trybu
USB device
, w którym system Linux
może implementować określone urządzenia
USB, tak aby była możliwość dołączania
płytki z Linuksem do innego hosta USB, na
przykład komputera PC. Podsystem
usb-de-
vice
(
rysunek
2
) w Linuksie nosi nazwę
usb
gadget
i jego architektura jest znacznie mniej
skomplikowana, niż w wypadku architektury
hosta USB. Sercem podsystemu jest sterow-
nik USB-PCD (
Peripheral Controller Device
),
komunikujący się bezpośrednio ze sprzęto-
wym układem
usb-device
, udostępniając jed-
nocześnie jednolite, niezależne od sprzętu
API dla sterowników funkcjonalnych.
Sterowniki funkcjonalne jądra wykorzy-
stują API do implementacji poszczególnych
funkcjonalności urządzeń USB. Ponieważ
urządzenie USB w jednym czasie może peł-
nić tylko pojedynczą rolę, umożliwia ono
współpracę tylko z jednym sterownikiem
gadget
w danym momencie. Na przykład,
załadowanie modułu
g_ether
spowoduje że
urządzenie
usb device
będzie pełniło rolę
karty sieciowej Ethernet.
Istnieje również możliwość pisania ste-
rowników w przestrzeni użytkownika z wy-
korzystaniem modułu
gadget_fs
. W Linuksie
gotowe są w zasadzie wszystkie najpopular-
niejsze urządzenia usb, w postaci modułów
gadget
, dlatego w większości wypadków nie
będziemy musieli ich pisać własnoręcznie.
Przykłady praktyczne
Mikrokontroler AT91RM9200 w obu-
dowie
TQFP208
ma pojedynczy kontroler
USB host pracujący z prędkością
full speed
(12 Mb/s), zgodny z OHCI, którego wyjście
wyprowadzono na złączu J10 oraz pojedyn-
czy kontroler USB device, którego wyjście
wyprowadzono na złącze J11. Do wykonania
ćwiczeń z części praktycznej potrzebować
będziemy następujących komponentów:
• dowolny pendrive,
• kabel USB A-B
• dowolną przejściówkę USB Serial np.
bazującą z układem FT232.
Przedstawione przykłady będą bazowa-
ły tylko na wykorzystaniu narzędzi konso-
lowych. Zostaną również podane krótkie
komentarze umożliwiające wykorzystanie
danego urządzenia z poziomu własnych
aplikacji. Aby wykonać wszystkie zaprezen-
towane przykłady, należy rozpakować plik
example6.img
na kartę SD, tak jak opisano
w pierwszym przykładzie. Następnie włożyć
kartę SD do BF210, uruchomić system i za-
logować się za pomocą konsoli szeregowej
dostępnej na porcie DBG (J6).
Obsługa pamięci masowych typu pen-
drive, dyski USB itp.
Obsługa pamięci ma-
sowych z wykorzystaniem mikrokontrole-
rów jednoukładowych wymaga – oprócz
implementacji hosta USB i sterownika dla
urządzenia USB komunikującego się z urzą-
dzeniem – napisania warstwy SCSI odpowie-
dzialnej za izyczny zapis i odczyt sektorów
oraz warstwy systemu plików FAT (ew. inne-
go), umożliwiającego dostęp do h-plików, co
123
ELEKTRONIKA PRAKTYCZNA 10/2011
KURS
bez wsparcia systemu operacyjnego jest bar-
dzo trudne. W Linuksie wszystko mamy już
zapewnione przez system. Przeprowadźmy
teraz proste ćwiczenie dołączając pendrive
do BF210, co zaowocuje następującym cią-
giem informacji wyświetlonym na konsoli
szeregowej:
[ 157.664000] usb 1-1: new full
speed USB device using at91_ohci
and address 3
[ 157.832000] usb 1-1: New USB
device found, idVendor=3538,
idProduct=0059
[ 157.840000] usb 1-1: New USB
device strings: Mfr=1, Product=2,
SerialNumber=3
[ 157.852000] usb 1-1: Product:
PQI USB Flash Drive
[ 157.856000] usb 1-1:
Manufacturer: PQI
[ 157.864000] usb 1-1:
SerialNumber: 0000000000255E
[ 157.896000] scsi1 : usb-storage
1-1:1.0
[ 158.912000] scsi 1:0:0:0:
Direct-Access Generic USB Flash
Disk 0.00 PQ: 0 ANS
I: 2
[ 158.940000] sd 1:0:0:0: [sda]
3948544 512-byte logical blocks:
(2.02 GB/1.88 GiB)
[ 158.980000] sd 1:0:0:0: [sda]
Write Protect is off
[ 158.992000] sd 1:0:0:0: [sda]
Assuming drive cache: write
through
[ 159.044000] sd 1:0:0:0: [sda]
Assuming drive cache: write
through
[ 159.188000] sda: sda1
[ 159.344000] sd 1:0:0:0: [sda]
Assuming drive cache: write
through
[ 159.356000] sd 1:0:0:0: [sda]
Attached SCSI removable disk
Z konsoli możemy odczytać informację,
że system automatycznie wykrył nowe urzą-
dzenie USB oraz załadował dla niego odpo-
wiedni sterownik, dzięki czemu pendrive jest
widoczny w systemie jako urządzenie
/dev/
sda
. Poszczególne partycje są widoczne jako
kolejne cyfry. Na przykład, pendrive z tego
przykładu ma pojedynczą partycję oznaczo-
ną jako
/dev/sda1
. Listę dostępnych partycji
możemy sprawdzić odczytując plik
/proc/
partitions
za pomocą polecenia
cat /proc/
partitions
, w wyniku czego otrzymamy listę
dostępnych partycji. W naszym wypadku zo-
stanie wyświetlony następujący komunikat:
root@bf210-at91:~# cat /proc/
partitions
major minor #blocks name
179 0 965120 mmcblk0
179 1 102400 mmcblk0p1
179 2 32768 mmcblk0p2
wiono powyżej), jak i z własnych programów.
Dostęp z do plików z programów jest możliwy
za pomocą biblioteki standardowej
stdio.h
,
z użyciem funkcji f
open, fwrite, fread()
lub
z poziomu C++ za pomocą biblioteki
iostre-
am
. Wystarczy jedynie operować w podkatalo-
gach znajdujących się w katalogu
/media/sda1
.
Jeżeli chcemy wyjąć pendrive’a, to musimy
pamiętać o jego odmontowaniu, co możemy
wykonać za pomocą polecenia konsoli
umount
/dev/sda1
. Z poziomu aplikacji użytkownika
odmontować pendrive można za pomocą wy-
wołania systemowego
umount(const char *tar-
get)
znajdującego się pliku nagłówkowym
sys/
mount.h
. Funkcja ta jako argument (podobnie
jak konsolowe polecenie
mount
) przyjmuje
ścieżkę do urządzenia, które chcemy odmon-
tować. Brak odmontowania pendrive po doko-
naniu zapisu, podobnie jak w systemie Win-
dows, gdy wyjmiemy pendrive, bez kliknięcia
w ikonę bezpiecznego usuwania sprzętu, może
spowodować utratę zapisanych danych i/lub
uszkodzenie systemu plików.
Obsługa urządzeń typu USB-Serial.
Pod nazwą USB-Serial kryją się różne kon-
wertery USB/RS232, jak i ostatnio bardzo
popularne modemy 3G w postaci urządzeń
USB wyglądających jak pendrive’y. Modemy
3G poprzez USB udostępniają interfejs portu
szeregowego, do którego jest dołączony mo-
dem udostępniający polecenia AT. Interfejs
szeregowy jest używany przez warstwę PPP
w celu uzyskania połączenia internetowe-
go TCP/IP. W Linuksie układy konwertery
USB-Serial są obsługiwane głównie przez
sterownik
usb_serial
lub inne, pokrewne,
które za pomocą warstwy TTY udostępniają
w systemie porty TTY, tak jak ma to miejsce
w wypadku wbudowanych portów szerego-
wych. Wystarczy zatem włożyć konwerter
lub modem 3G do złącza USB, a w systemie
pojawi się plik urządzenia
/dev/ttyUSBx
lub
/
dev/ttyACMx
(gdzie
x
oznacza kolejny numer
porządkowy), który będzie reprezentował
port szeregowy. Sterowanie portem szerego-
wym dołączonym za pomocą USB nie różni
się niczym od obsługi portu wbudowanego.
Należy jedynie otworzyć odpowiedni plik re-
prezentujący urządzenie i wykorzystać API
umówione w poprzednim odcinku.
W tym ćwiczeniu do portu USB BF210
dołączymy konwerter z układem FT2232,
która emuluje podwójny port szeregowy.
W wyniku tego na konsoli będziemy mogli
zaobserwować następujące informacje dia-
gnostyczne:
[ 2666.316000] usb 1-1: new full
speed USB device using at91_ohci
and address 4
[ 2666.484000] usb 1-1: New USB
device found, idVendor=0403,
idProduct=6010
[ 2666.492000] usb 1-1: New USB
device strings: Mfr=1, Product=2,
SerialNumber=3
8 0 1974272 sda
8 1 1973248 sda1
Partycje
mmcblk0
są partycjami karty
SD, natomiast partycje
sda
partycjami pen-
drive’a. Widzimy tu tylko jedną dostępna
partycję
sda1
. Po włożeniu pendrive’a jeżeli
system wykryje prawidłowy system plików,
zostanie ona automatycznie zamontowana,
o czym możemy się przekonać wydając po-
lecenie
mount
:
root@bf210-at91:~# mount rootfs
on / type rootfs (rw) /dev/
root on / type ext3 (rw,sy
nc,noatime,errors=continue
,barrier=0,data=writeback)
devtmpfs on /dev type devtmpfs
(rw,relatime,size=14556k,nr_
inodes=3639,mode=755)
proc on /proc type proc
(rw,relatime) sysfs on /sys type
sysfs (rw,relatime) none on /dev
type tmpfs (rw,relatime,mode=755)
devpts on /dev/pts type devpts
(rw,relatime,gid=5,mode=620)
usbfs on /proc/bus/usb type
usbfs (rw,relatime) tmpfs
on /var/volatile type tmpfs
(rw,relatime) tmpfs on /dev/shm
type tmpfs (rw,relatime,mode=777)
tmpfs on /media/ram type tmpfs
(rw,relatime) /dev/sda1 on /
media/sda1 type vfat
(rw,relatime,fmask=0022
,dmask=0022,codepage=cp
437,io charset=iso8859-
1,shortname=mixed,errors=remount-
ro)
Polecenie
mount
umożliwia montowa-
nie partycji w systemie oraz wyświetlenie
aktualnie zamontowanych partycji. Możemy
tutaj zobaczyć, że partycja
/dev/sda
została
zamontowana w katalogu
/media/sda1
oraz
ma system plików vfat. Wszystkie pliki, któ-
re znajdują się na pendrive będą widoczne
w tym katalogu. Możemy teraz przejść do
katalogu z plikami wydając polecenie
cd /
media/sda1
, a następnie wyświetlić listę do-
stępnych plików wydając polecenie
ls –al
.
Zostanie wyświetlony komunikat jak niżej:
root@bf210-at91:~# cd /media/sda1
root@bf210-at91:/media/sda1# ls
-al
drwxr-xr-x 2 root root 4096 Jan 1
1970 .
drwxr-xr-x 11 root root 1024 Apr
24 02:23 ..
-rwxr-xr-x 1 root root 1187001760
Mar 22 11:01 OmniaBack.7z
-rwxr-xr-x 1 root root 657575 Mar
25 07:14 isix_multiple_objects.
tar.bz2
root@bf210-at91:/media/sda1#
Na pendrive znajdują się dwa pliki. Do-
stęp do pendrive’a jest możliwy zarówno za
pomocą narzędzi konsolowych (co przedsta-
124
ELEKTRONIKA PRAKTYCZNA 10/2011
Wprowadzenie do Linuksa embedded
poza łamy niniejszego artykułu. Koniguracja
PPP przebiega w sposób identyczny jak syste-
mie Linux dla PC, dlatego zainteresowanych
tą tematyką odsyłam do strony:
http://my-
broadband.co.za/vb/showthread.php/21726-
Linux-HOWTO-%28With-Stats%29
port szeregowy, za pomocą którego możemy
się komunikować z BF210. Aby sprawdzić
działanie sterownika w konsoli komputera PC
należy wpisać polecenie cat /dev/ttyACM0,
natomiast w konsoli BF210 polecenie echo
test > /dev/ttyGS0. W wyniku wydania pole-
cenia echo na BF210 które wysyła znaki „test”
do urządzenia ttyGS0, z wirtualnego portu
szeregowego komputera PC będziemy mogli
odebrać napis „test” (
rysunek
3
). Obsługa obu
portów szeregowych, zarówno po stronie PC
jak i BF210, jest taka sama jak w przypadku
klasycznych portów szeregowych omówio-
nych w poprzedniej części kursu.
Emulacja karty sieciowej Ethernet
w trybie usb-device.
Kolejnym interesują-
cym trybem pracy, jest moduł umożliwiający
emulowanie karty sieciowej Ethernet, która
od strony komputera PC i BF210 jest widzia-
na jako interfejs sieciowy umożliwiający ko-
munikację pomiędzy hostem, a BF210, tak
jakby były one połączone za pomocą Ether-
netu. Aby udostępnić tą funkcjonalność na-
leży załadować moduł
g_ether
:
root@bf210-at91:~# modprobe g_
ether
[ 2702.632000] g_ether gadget:
using random self ethernet
address
[ 2702.644000] g_ether gadget:
using random host ethernet
address
[ 2702.664000] usb0: MAC
7a:52:95:59:0d:e4
[ 2702.676000] usb0: HOST MAC
2a:59:2c:a5:ae:32
[ 2702.684000] g_ether gadget:
Ethernet Gadget, version:
Memorial Day 2008
[ 2702.696000] g_ether gadget:
g_ether ready
Po załadowaniu modułu wypisane zosta-
ły informację diagnostyczne o wybraniu lo-
sowych adresów MAC dla wirtualnych kart
sieciowych. Po tej czynności urządzenie
usb-
device
jest gotowe do pracy. Wystarczy zatem
połączyć komputer PC z BF210 za pomocą
kabla USB w wyniku czego na obu maszy-
nach zostanie utworzony wirtualny interfejs
sieciowy
usb0
. Na BF210 adres IP został au-
tomatycznie wybrany losowo, natomiast na
komputerze PC należy wydać polecenie
sudo
ifconig usb0 192.168.0.200 up
w celu jego
ręcznego ustanowienia. Od tego momentu
[ 2667.164000] usbcore:
registered new interface driver
usbserial
[ 2667.192000] USB Serial support
registered for generic
[ 2667.228000] usbcore:
registered new interface driver
usbserial_generic
[ 2667.252000] usbserial: USB
Serial Driver core
[ 2667.424000] USB Serial support
registered for FTDI USB Serial
Device
[ 2667.436000] ftdi_sio 1-1:1.0:
FTDI USB Serial Device converter
detected
[ 2667.448000] usb 1-1: Detected
FT2232C
[ 2667.456000] usb 1-1: Number of
endpoints 2
[ 2667.460000] usb 1-1: Endpoint
1 MaxPacketSize 64
[ 2667.468000] usb 1-1: Endpoint
2 MaxPacketSize 64
[ 2667.476000] usb 1-1: Setting
MaxPacketSize 64
[ 2667.488000] usb 1-1: FTDI
USB Serial Device converter now
attached to ttyUSB0
[ 2667.500000] ftdi_sio 1-1:1.1:
FTDI USB Serial Device converter
detected
[ 2667.512000] usb 1-1: Detected
FT2232C
[ 2667.516000] usb 1-1: Number of
endpoints 2
[ 2667.524000] usb 1-1: Endpoint
1 MaxPacketSize 64
[ 2667.532000] usb 1-1: Endpoint
2 MaxPacketSize 64
[ 2667.536000] usb 1-1: Setting
MaxPacketSize 64
[ 2667.552000] usb 1-1: FTDI
USB Serial Device converter now
attached to ttyUSB1
[ 2667.568000] usbcore:
registered new interface driver
ftdi_sio
[ 2667.576000] ftdi_sio:
v1.6.0:USB FTDI Serial Converters
Driver
Po dołączeniu konwertera do portu USB
zostaje wykryty układ FT2232, w wyniku
czego podsystem USB automatycznie zała-
dował sterownik
ftdi_sio
. W tego czego zo-
stały utworzone dwa pliki
/dev/ttyUSB0
oraz
/dev/ttyUSB1
reprezentujące porty szerego-
we. Tak powstałe porty szeregowe działają
identycznie jak wbudowane, systemowe
o czym możemy przekonać się zmieniając
w przykładzie z poprzedniego odcinka
port
/dev/ttyS1
na
/dev/ttyUSB1
.
W wypadku modemów 3G, aby uzy-
skać połączenie z siecią należy przygotować
i skonigurować warstwę PPP, co wykracza
Rysunek 3. Komunikat „test” wysyłany przez port wirtualny /dev/ttyGS0
Inne urządzenia USB-Host
W jadrze istnieją gotowe w zasadzie wszyst-
kie sterowniki USB do najbardziej popularnych
urządzeń USB spotykanych w handlu, dlate-
go konieczność pisania własnego sterownika,
będzie zdarzeniem bardzo rzadkim. Wymie-
nione powyżej przykłady obsługi wybranych
urządzeń nie wyczerpują możliwości obsługi
wszystkich urządzeń USB, i trudno w ramach
jednego artykułu opisać wszystkie możliwe.
Niemniej jednak sposób postępowania w za-
sadzie zawsze jest taki sam, wystarczy jedy-
nie podłączyć urządzenie USB do portu Host,
a system automatycznie wykryje i załaduje od-
powiedni sterownik. W jaki sposób obsługiwać
dalej dane urządzenie zależy od jego rodzaju,
a odpowiedni opis można znaleźć w interne-
cie w postaci wielu artykułów, oraz wpisów na
forach. Obsługa USB dla systemów wbudowa-
nych jest taka sama jak dla komputerów PC, dla-
tego wszystkie opisy odnoszące się do PC, będą
także odpowiednie dla systemów embedded.
Emulacja portu szeregowego, w trybie
usb-device.
Omówiliśmy jak podłączać urzą-
dzenia peryferyjne do portu host, przejdzie-
my teraz do sytuacji odwrotnej i opiszemy
kilka najbardziej popularnych przypadków
dołączenia BF210 do komputera PC z wy-
korzystaniem kontrolera USB-DEVICE. Jako
pierwszy przykład pokażemy w jaki sposób
spowodować, aby nasza płytka BF210 od
strony komputera PC była widziana jako port
szeregowy. Aby to zrobić wystarczy w konsoli
szeregowej BF210 załadować moduł g_serial:
root@bf210-at91:~# modprobe g_
serial
[ 1471.676000] g_serial gadget:
Gadget Serial v2.4
[ 1471.688000] g_serial gadget:
g_serial ready
W wyniku tego w BF210 zostanie utwo-
rzony plik reprezentujący port szeregowy
/dev/ttyGS0. Następnie należy podłączyć złą-
cze USB-DEVICE BF210 do komputera PC
z wykorzystaniem kabla USB A-B. Po włoże-
niu wtyczki w systemie na PC pojawi się urzą-
dzenie /dev/ttyACM0, stanowiące wirtualny
125
ELEKTRONIKA PRAKTYCZNA 10/2011
KURS
i systemy operacyjne nic nie „wiedzą” o so-
bie wzajemnie. W przykładzie na karcie SD
utworzono dodatkową partycję z systemem
plików FAT16. Aby udostępnić tę partycję
w trybie emulowania pamięci pendrive,
musimy załadować moduł
g_ile_storage
:
modprobe g_ile_storage ile=/dev/
mmcblk0p2 removable=1 stall =0
[ 7302.852000] g_ile_storage
gadget: No serial-number string
provided!
[ 7302.864000] g_ile_storage
gadget: File-backed Storage
Gadget, version: 1 Sept ember
2010
[ 7302.876000] g_ile_storage
gadget: Number of LUNs=1
[ 7302.884000] g_ile_storage
gadget-lun0: ro=0, nofua=0, ile:
/dev/mmcblk0p2
Jako parametr
ile
należy przekazać
plik lub partycję, które chcemy udostępnić.
Jako parametr
removable
przekazujemy, że
mamy do czynienia z nośnikiem wymien-
nym, natomiast parametr
stall
umożliwia
uniknięcie generowania zatrzymania prze-
syłania danych poprzez rozkaz
STALL
, co
jest potrzebne systemom Windows. Jako
dane wirtualnego dysku udostępniliśmy
całą partycję drugiej karty o wielkości
32 MB, sformatowaną w systemie plików
FAT16 (
/dev/mmcplk0p2
). Teraz wystarczy
włożyć wtyczkę USB do portu USB kompu-
tera, i po chwili zobaczymy, że w systemie
pojawi się nowy dysk, a na nim dwa pliki
(
rysunek
5
).
Teraz możemy dowolnie modyikować
pliki w urządzeniu np. utworzyć dowolny
plik tekstowy na test2.txt,a następnie od-
montować (bezpiecznie usunąć) urządze-
nie. Aby teraz zobaczyć w systemie BF210
pliki, które utworzyliśmy na dysku, należy
wyładować moduł
g_ile_storage
(polecenie
rmmod g_ile_storage
), a następnie zamon-
tować system plików w systemie (polece-
nie mount
/dev/mmcblk0p2 /mnt/card
). Po
wykonaniu tych czynności za pomocą po-
lecenia
ls -al /mnt/card
możemy zobaczyć,
że plik test2.txt, który wcześniej
utworzyliśmy na PC istnieje (
ry-
sunek
6
). Przed ponownym udo-
stępnieniem partycji za pomocą
sterownika
g_ile_storage
należy
za pomocą polecenia
umount /dev/
mmcblk0p2
odmontować z syste-
mu partycję.
Rysunek 6. Lista plików zapamiętanych
na karcie SD podczas emulowania urzą-
dzenia klasy storage
do USB bez możliwości odłączenia (np. we
wnętrzu urządzenia) takie rozwiązanie jest
prawidłowe. Zupełnie inaczej wygląda sy-
tuacja, gdy na zewnątrz wyprowadzone jest
gniazdo USB i nie można zakładać dostęp-
ności urządzenia w systemie. Ponieważ ma-
gistrala USB umożliwia dołączenie i odłą-
czenie urządzeń w dowolnym momencie,
musimy mieć możliwość powiadamiania
o dołączanych lub odłączanych urządze-
niach. W systemie Linuks takie zadanie
realizują programy przestrzeni użytkowni-
ka
udev
w połączeniu z
devicekit
. Korzy-
stając z usług
devicekit
mamy możliwość
otrzymywania notyikacji o zmianach urzą-
dzeń w systemie. Aby zobaczyć jak działa
devicekit
wystarczy wydać polecenie
de-
vkit -m
, a następnie włożyć np. konwerter
z FT2232. Wtedy zobaczymy na terminalu
szereg notyikacji, od różnych podsyste-
mów, z których najistotniejsza dla nas jest
ostatnia pochodząca od podsystemu TTY:
-------------------------------
--------------------------------
-------
action=add @ 05:37:24.032427
device: /sys/devices/platform/
at91_ohci/usb1/1-1/1-1:1.1/
ttyUSB1/tty/ttyUSB1
subsystem: tty
device ile: /dev/ttyUSB1
symlink: /dev/serial/by-path/
platform-at91_ohci-usb-0:1:1.1-
port0
symlink: /dev/serial/by-id/usb-
BoFF_OOCDLink_FTQYA8VN-if01-
port0
properties:
ID_IFACE=01
ID_VENDOR_ENC=BoFF
ID_VENDOR_ID=0403
ID_SERIAL=BoFF_OOCDLink_FTQYA8VN
UDEV_LOG=3
ID_MODEL=OOCDLink
ID_TYPE=generic
ID_USB_DRIVER=ftdi_sio
ID_VENDOR=BoFF
ID_PATH=platform-at91_ohci-
usb-0:1:1.1
DEVNAME=/dev/ttyUSB1
SEQNUM=827
ACTION=add
Rysunek 4. Efekt działania polecenia ping
w trybie emulacji połączenia Ethernet
komputer PC łączy się z BF210 za pomocą
kabla USB, o czym możemy się przekonać za
pomocą polecenia ping (
rysunek
4
).
Emulacja urządzenia storage (pendri-
ve), w trybie usb-device.
Interesującym
trybem jest emulacja urządzeń typu stora-
ge, np. popularnych pendrive’ów. Umożli-
wia to implementacje bardzo popularnego
w aparatach czy odtwarzaczach MP3 try-
bu umożliwiającego przegranie danych
multimedialnych na nośnik urządzenia
docelowego, bez konieczności posiadania
specjalistycznego sterownika. Możemy
udostępnić zarówno partycję nośnika, jak
i pojedynczy plik znajdujący się na partycji
systemowej, który będzie systemem plików
dla urządzenia zewnętrznego.
System plików udostępniony przez USB
możemy również zamontować w BF210.
Musimy pamiętać o tym, aby nie robić tego
równocześnie z montowaniem partycji.
Dlatego albo udostępniamy plik/partycję za
pomocą modułu
usb_storage
, albo montuje-
my ją w systemie. W przeciwnym razie mo-
żemy doprowadzić do uszkodzenia danych,
ponieważ dostęp do systemu plików odby-
wa się za pomocą zapisu sektorów na dysk
A co z Plug&Play?
W opisanych przykładach
sami dołączaliśmy urządzenia
USB, więc można było bezpośred-
nio odwoływać się do określonych
plików urządzeń. W wielu wy-
padkach, gdy zakładamy że jakieś
urządzenie dołączone jest na stałe
Rysunek 5. Rezultat emulowania urządzenia klasy
storage
126
ELEKTRONIKA PRAKTYCZNA 10/2011
Plik z chomika:
bulwion
Inne pliki z tego folderu:
Wentylatory.pdf
(1666 KB)
Star Wars. Katalizator. Wprowad - James Luceno.pdf
(1665 KB)
Gordon R. Dickson - Smoczy rycerz T2.pdf
(1663 KB)
LOKOMOTYWA TOWAROWA EMD JT42CWRM(Class66).pdf
(1662 KB)
Greer Luanshya - Kto sieje wiatr 02 - Po burzy spokój.pdf
(1660 KB)
Inne foldery tego chomika:
- - 1024--Fillm
- - 2024--FULL---
- - 2K wallpapers
- - ART PICS
- - FILMY 2023-2025 WSZYSTKIE NOWOŚCI
Zgłoś jeśli
naruszono regulamin