Budujê uk³ad, który zarz±dzany procesorem ATmega128, za po¶rednictwem sterownika SL811HST w trybie "host", ma zapamiêtywaæ dane na pamiêci typu: USB Flash Disk (USB Flash Drive, USB Pen Drive - ró¿nie to nazywaj±). Program piszê w jêzyku C++ w wersji AVR-GCC za po¶rednictwem edytora AVRSide. Pierwszy raz robiê obs³ugê urz±dzenia USB i po próbie przeczytania kilku opas³ych ksi±¿ek o USB, oraz ró¿nych danych i przyk³adów programów z Internetu, nabawi³em siê potê¿nego bólu g³owy. Jest tego strasznie du¿o. Ciê¿ko mi odcedziæ wiedzê niezbêdn±, od tego co mi jest w tym przypadku nieprzydatne. A sporo powinno siê upro¶ciæ. Urz±dzenie USB bêdzie tylko jedno i to jednego znanego typu, pod³±czone bezpo¶rednio do "hosta". Jakie procedury s± konieczne aby móc przesy³aæ i odbieraæ dane z takiej pamiêci? Bardzo proszê o jakie¶ wskazówki kogo¶, kto mia³ ju¿ do czynienia z takim zagadnieniem. Nie mogê znale¼æ te¿ nic na temat sterowania tym USB Flash Diskiem. W plikach typu "datasheet" znalezionych w Internecie, s± tylko dane handlowe, wymiary zewnêtrzne, temperatury pracy i inne zbêdne mi rzeczy. W ¿adnym nie ma nic na temat programowania, rejestrów, adresowania i komunikacji. Znalaz³em opisy uk³adów steruj±cych pamiêciami typu flash za pomoc± USB, które chyba s± stosowane w takich Flash Disk-ach. Podane s± wyprowadzenia, wymiary, parametry elektryczne, ale nic o sterowaniu od strony programowej. Je¶li kto¶ mo¿e przes³aæ mi interesuj±ce mnie dane, lub mo¿e mi co¶ doradziæ, pomóc lub podzieliæ siê jakimi¶ kodami ¼ród³owymi, to bardzo bêdê wdziêczny. Darek
Sterowanie USB Flash Disk - kiem
Dec 14, 2004
17 Replies
Wow, ciekawy temat. Jak ci już coś wyjdzie działającego to pochwal się na grupie.
Każdy pendrive (po polsku 'czopek' tudzież 'gwizdek') przedstawia się jako urządzenie klasy Mass Storage i od opisu tejże powinieneś zacząć lekturę, sam standard USB jak sądzę znasz. Ogólnie mówiąc chodzi o implementację prostego podzestawu poleceń interfejsu SCSI typu "odczytaj sektor[y]". Sam pendrive nic nie wie o systemie plików, można go sformatować np. na ext3 i też będzie dobrze działać (pod Linuxem).
Sprawa jest do zrobienia, trzeba tylko trochê poczytaæ. Po pierwsze musisz zrobiæ enumeracje czyli odczytaæ informacjê o sprzêcie, nastêpnie za pomoc± kodów scsi lub jak to usb nazywa UPI odczytaæ sektory dysku. A jak chcesz ¿eby¶ móg³ odczytaæ tego pendrive na np. PC to musisz zaimplementowaæ FAT32. Bez problemu zrobisz to na 8 bitowcu ale siê musisz spodziewaæ ma³ego transferu na poziomie kilkudziesiêciu KB/s, chyba ze zastosujesz jaki¶ "DMA" do kopiowania EP<> Dysk.
Mister
Czytam ju¿ od wielu dni i ju¿ spuch³a mi g³owa. Naczyta³em siê pewnie wiele niepotrzebnych mi rzeczy i wszystko mi siê miesza. Jestem bardziej elektronikiem ni¿ programist± i z wieloma pojêciami informatycznymi spotykam siê po raz pierwszy. Czujê siê jak ucz±cy siê p³ywaæ rzucony na g³êbok± i pe³n± wirów wodê. Strasznie du¿o teorii i przedstawiania wszystkich rozbudowanych funkcji, a ma³o jaki¶ praktycznych przyk³adów, szczególnie w bardzo uproszczonych podstawowych konfiguracjach. Znalezione przyk³ady kodów ¼ród³owych sterowników zawieraj± tysi±ce wierszy, obs³uguj± najró¿niejsze urz±dzenia o wszystkich mo¿liwych parametrach, a dodatkowo za po¶rednictwem ca³ej pl±taniny Hubów. Ciê¿ko mi z tego zorientowaæ siê, co jest tak na prawdê niezbêdne do prostego uk³adu USB: sterownik host <-> Flash Disk
Co do tej enumeracji, zrozumia³em, ¿e dane o urz±dzeniu odczytuje siê z tak zwanego EndPoint0. A potem trzeba nadaæ numer urz±dzeniu. Jaki? Mo¿na 1? Oprócz EndPointu jest jeszcze co¶ takiego jak adres urz±dzenia, które trzeba podaæ je¶li siê z nim komunikuje. Jaki on ma byæ, je¶li urz±dzenie jest tylko jedno?
Co ma wspólnego SCSI z USB Flash Diskiem? Do tej pory SCSI to by³a dla mnie wielosygna³owa szybka magistrala do pod³±czenia pewnych typów twardych dysków (zreszt± rzadko u¿ywana w popularnych komputerach). W czytanej do tej pory literaturze nie spotka³em siê ze skrótem UPI.
Sprawa FAT-u to przysz³o¶ciowa sprawa. Na razie chcê móc zapamiêtywaæ dane w wymy¶lonym uproszczonym formacie np kolejnych sektorach. Czy musi to byæ FAT32, nie mo¿e byæ FAT16 ?
Bardzo dziêkujê za ka¿de praktyczne wskazówki. Zawsze to pomo¿e znale¼æ w³a¶ciwy kierunek. Darek
FAT16 nie wejdzie na większy niż kilkudziesięciomegabajtowy pendrive. FAT32 nie jest dużo bardziej skomplikowany o ile nie bawisz się w długie nazwy plików (VFAT), co też można rozczaić na podstawie dostępnej dokumentacji i np. źródeł Linuxa. W kodzie źródłowym co drugiego przenośnego odtwarzacza MP3 pokroju Yampp'a znajdziesz obsługę FAT32.
Endpoint zerowy jest na wyposa¿eniu i musi byæzaimplementowany w ka¿dym urz±dzeniu.
A potem trzeba nadaæ numer urz±dzeniu. Jaki? Mo¿na 1?
Dowolny z zakresu 1-127,czyli np 1.
Nie wiem czy o tym my¶lisz: ka¿dy device ma swój VID i PID który host odczytuje i porównuje ze swoj± list± referencyj± (w praktyce z dostêpnymi sterownikami) i je¿eli rozpozna to urz±dzenie to kontynuuje enumeracje.
SCSI to te¿ (uproszczaj±c) protoko³ wymiany danych. Istnieje wiele "rozkazów" typu READ_CAPACITY, READ_10, WRITE etc. Poszukaj dokumentu na
formatting link
To obojêtne, wg mnie FAT32 jest prostszy, bo pewne rzeczy s± uproszczone,
A tak przy okazji, co to bêdzie je¿eli mo¿na spytaæ?
Mister
W artykule <cpnu9p$dc5$ snipped-for-privacy@atlantis.news.tpi.pl> autorem którego mieni się Adam Dybkowski, napisano:
Ładny jest też "pędrak" (fonetycznie dość przypomina oryginalną nazwę).
U¿ytkownik "JS" <_do_not_use snipped-for-privacy@polbox.com napisa³:
Ooo... bardzo mi siê to podoba :-)
Darek ¯o³na
To ma byæ tani uk³ad do archiwizacji danych (i ewentualnie przenoszenie do PC-ta) z rezultatów badañ w pewnym sprzêcie medycznym, w którym cyfrowa elektronika nie oparta jest na komputerze PC. Znalaz³em dokumentacjê na temat protokó³u wymiany danych z urz±dzeniami typu "mass storage" za pomoc± kodów UFI (nie UPI - to chyba by³a literówka). Jest to spore ¶wiate³ko w tunelu nadaj±ce pewien kierunek. Nie mniej ten protokó³ jest do¶æ skomplikowany, ca³a masa parametrów, mimo ¿e spora czê¶æ w tym przypadku jest sta³a. My¶lê ¿e g³ówn± trudno¶ci± tego tematu jest to, ¿e trzeba jednocze¶nie prawid³owo uruchomiæ trzy procesy, co bardzo ogranicza metodê ma³ych kroków i dochodzenia do prawdy metod± prób i b³êdów. Te procesy to:
- Obs³uga sterownika USB.
- Prawid³owa struktura danych w pakietach USB.
- Sterowanie urz±dzenia za pomoc± kodów UFI. Nie da siê sprawdziæ prawid³owo¶ci dzia³ania ka¿dego z nich, je¶li inne nie bêd± dzia³a³y prawid³owo. Istnienie w jednym jakiego¶ b³êdu powoduje rezultat które daje ma³o informacji co do miejsca jego wystêpowania. Np. próbujesz uruchomiæ, a tu nic siê nie dzieje, ani dygnie, albo jakie¶ g³upoty. I co mu teraz zrobisz? Przyczyn mo¿e byæ tysi±ce. Ju¿ na samym wstêpie, przy bardzo prostej rzeczy natkn±³em siê na rafê. Umiem wywo³aæ przerwanie spowodowane w³o¿eniem lub wyjêciem urz±dzenia z gniazda USB. Wed³ug opisów (dwóch ró¿nych) sterownika SL811HST, w przypadku w³o¿enia jeden z bitów w rejestrze statusu przerwania ma wskazywaæ czy urzadzenie jest "low speed" czy "full speed". To dzia³a prawid³owo. Bit ten siê zmienia w zale¿no¶ci od urz±dzenia które wk³ada³em do gniazda. Inny z bitów ma wskazywaæ czy urz±dzenie zosta³o w³o¿one (0) czy wyjête (1). A tu co bym nie robi³, ten bit zawsze ma warto¶æ 1. Przez d³ugi czas szuka³em przyczyny, kombinowa³em i nie znalaz³em. Nie¼le siê zaczyna. A czekaj± mnie procedury setki razy trudniejsze. Darek
A nie chcia³by¶ tego projektu komu¶ zleciæ? ;)
Pozdrawiam Mister
A ty (czyli Host) za³±cza VBUS? i nastêpnie robi USB_reset?
Mister
Obsluga USB to rzezba... - a nie moze byc po prostu karta CompactFlash podlaczona bezposrednio do tego AVR-a? A potem przelozyc do czytnika CF na USB, widzianego przez system tak samo jak ten "czopek" :)
Marek
...albo karta SD/MMC podlaczona do AVR-a. Sa gotowe biblioteki do zapisu/odczyty w/w. Co wiecej, to dziala :)
Pozdrawiam AA
A dlaczego rze¼ba? poprostu tydzieñ pracy i po "k³opocie".
Mister
Sprzêtowo nie da siê ju¿ nic zmieniæ. Modu³ z obs³ug± Compact Flasha i z przewidzian± mo¿liwo¶ci± do³±czenia czego¶ USB, jest czê¶ci± istniej±cego urz±dzenia. Karta Compact Flash jest wewnêtrznym nie wyjmowalnym elementem. Trzeba do tego modu³u dopisaæ obs³ugê tych "czopków", oraz mo¿liwo¶æ wysy³ania danych do PC-ta kablem USB (to drugie na deser).
Nie zlecê komu¶ tego tematu, bo nie poddajê siê bez walki przy trudnych wyzwaniach, a chcê siê czego¶ nauczyæ i poczuæ satysfakjê. Nie takie rzeczy robi³em ze szwagrem po pijanemu. Temat jest bardzo trudny, ale mam nadziejê ¿e z pomoc± przyjaznych dusz, powoli, z bólem g³owy, ale go rozpracujê. My¶lê, ¿e tak jak ja lubiê pomagaæ innym w dziedzinach na których siê znam, tak s± na grupie ludzie z podobnym podej¶ciem.
Je¶li Vbus jest zasilaniem gniazda USB, to oczywi¶cie go za³±czam po resecie sprzêtowym uk³adu sterownika. Bez tego wogóle nie z³aszane by³yby przerwania. ResetUSB programowy robiê je¶li wykryjê w³o¿enie urz±dzenia do gniazda. Na razie robiê to na podstawie ustawienia bitu szybko¶ci urz±dzenia. Jak wspomnia³em bit obecno¶ci urz±dzenia nie wiem dlaczego jest zawsze (1) i nie mogê z niego korzystaæ. Darek
możesz jakiegoś URLa podać? Wiem, leń ze mnie, ale sprawdzone - lepsze pewnie :-)
Witam
formatting link
dziale AVR
Sprawdzalem z ATmega8 i dziala.
Pozdrawiam AA
Poszukaj źródeł Yampp 7.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required