W jaki sposób Raspberry Pi może emulować urządzenie pamięci USB?

46

Urządzenia pamięci USB, takie jak pamięci USB i dyski twarde, są często używane do podłączania pamięci zewnętrznej do dowolnego rodzaju komputera. W jaki sposób Raspberry Pi może emulować pamięć USB? Najłatwiejszą aplikacją było uzyskanie bezpośredniego dostępu do karty SD przez USB, ale można również zapewnić dostęp do plików przez Ethernet. Pomyślałem o następującym układzie „ pamięci USB w chmurze ”:

Computer <---USB---> |Raspberry Pi| <---Ethernet---> Cloud, NAS etc.

Komputer powinien widzieć tylko zwykłą pamięć USB do odczytu i zapisu plików. Raspberry Pi działałby jak programowalny most, który odwzorowuje katalogi i dostęp do plików na żądanie do magazynu w chmurze. Możesz uzyskać dostęp do hostingu w chmurze z dowolnego komputera (w tym odtwarzaczy multimedialnych Black Box) przez USB bez konieczności instalowania dodatkowego oprogramowania na komputerze. Mostek USB Raspberry Pi powinien również być w stanie szyfrować / deszyfrować pliki w locie, aby można było przechowywać pliki zaszyfrowane w chmurze i uzyskiwać do nich dostęp na dowolnym urządzeniu, takim jak zwykły dysk USB.

Edycja: Istniejące produkty o podobnych, ale ograniczonych funkcjach to Wireless Media Stick i USB-over-Network . Dostęp do plików w chmurze może być możliwy poprzez zamontowanie wirtualnej pamięci za pomocą dysku w chmurze lub podobnego oprogramowania i szyfrowanie za pomocą TrueCrypt lub EncFS - hasła byłyby przechowywane na karcie SD Raspberry Pi tylko, ale można było uzyskać dostęp do pamięci z dowolnego komputera bez konieczności wpisz hasło na niezaufanym komputerze.

Jakob
źródło
1
Myślę, że chce mieć partycję lub folder współdzielony na swoim Pi, który można zamontować przez USB na innych komputerach. Chodzi o to, że możesz podłączyć raspi do dowolnego komputera, a ten folder / część działa jak dysk flash i można do niego zapisać bez dodatkowego oprogramowania.
wmarbut
3
Pi powinien działać tylko jako brama między dowolnym komputerem, w tym czarnymi skrzynkami, a na przykład chmurą Amazon. Brama może również szyfrować pliki w locie.
Jakob
1
Złom - to byłoby idealne!
Alex Chamberlain,
1
@AlexChamberlain - nie, nie możesz. Urządzenia pamięci masowej USB mają określony protokół obsługiwany przez system operacyjny hosta. Oczywiście możesz stworzyć sterownik, który sprawi, że coś innego będzie wyglądać jak urządzenie pamięci masowej dla konkretnego systemu operacyjnego, ale nie będzie to urządzenie „USB Mass Storage”, ale raczej „niestandardowe urządzenie pamięci masowej podłączone przez USB”
Chris Stratton
1
@ppumkin: Ponieważ „mapowanie dysku do” lub „podłączenie do sieci LAN” wymaga skonfigurowania komputera (lub odtwarzacza multimedialnego). Samo podłączenie do portu USB nie wymaga żadnej administracji i nie trzeba ujawniać żadnych haseł do komputera. Pamiętaj, że chcę współdzielić pamięć z dysku w chmurze, co zawsze wymaga hasła, a nawet instalacji oprogramowania klienckiego.
Jakob

Odpowiedzi:

12

Problem polega na tym, że połączenie USB Pi z komputerem PC nie ma podłączonych styków danych - tylko styki zasilania. Nie możesz więc używać tego do mówienia przez USB, ponieważ nie jest podłączony.

Jedyną opcją w przypadku Pi byłoby „bit bang” USB za pomocą pinów GPIO, ale jest to bardzo wolne i potencjalnie zawodne. Podejrzewam, że naprawdę byłbyś w stanie emulować tylko klawiaturę lub mysz - cokolwiek o wyższej przepustowości prawdopodobnie byłoby zbyt duże, aby procesor mógł sobie z tym poradzić, biorąc pod uwagę ścisłe wymagania czasowe bit banging coś takiego jak USB.

Inną alternatywą byłoby znalezienie urządzenia, które pozwala połączyć dwa komputery razem przez USB, aby stworzyć rodzaj sieci. Ale równie dobrze możesz po prostu użyć połączenia Ethernet ...

Malvineous
źródło
1
Wcześniej grałem z GP32, który może zachowywać się jak host, nawet gdy jest podłączony do koncentratora jako klient. Jeśli Raspberry może zachowywać się jak host na portach USB (nie ten zasilający), wówczas powinna być możliwa podobna sztuczka. Może USB-to-go może to zrobić?
Thorbjørn Ravn Andersen
2
Co? Mylisz się przez port micro USB używany do zasilacza. Co z 2 odpowiednimi portami USB? W przypadku niektórych programów do emulacji można podłączyć USB do komputera i emulować pamięć - np. - telefon z Androidem po podłączeniu USB. - Ale nie ma tego powodu, ponieważ podłączasz Pi do swojej sieci, udostępniasz folder „chmury” przez sambę lub cokolwiek innego (Wi-Fi lub LAN) - a jednocześnie synchronizujesz chmurę z tym, co chcesz zrobić . LAN może obsłużyć wiele żądań na różnych portach
Piotr Kula,
2
@ppumkin: Dlaczego myli mnie port micro USB? Piny danych nie są połączone, więc nie można przesyłać przez nie danych. „Właściwe” porty USB poniżej są portami „hosta”, więc nie można ich podłączyć do komputera bez jakiegoś urządzenia konwertującego na środku. Emulacja oprogramowania nie jest wystarczająca ze względu na sposób działania protokołu USB. Być może myślisz o Ethernecie, w którym możesz podłączyć dowolne dwa urządzenia razem, ale USB tak nie działa. Jeśli mi nie wierzysz, przeczytaj specyfikację USB, szczególnie części o hostach USB a urządzeniach peryferyjnych.
Malvineous
1
Chciałem tylko dodać, że „bit-banging” USB nie jest opcją. USB to długa, długa droga od czegoś takiego jak I2C, który może być bit-banged. Być może najbardziej praktycznym podejściem jest użycie jednego z tych mikrometrów AVR, które mają wbudowany port urządzenia USB, a następnie komunikowanie się z nim za pośrednictwem portu szeregowego w Pi. (np. olimex.com/Products/AVR/Proto/AVR-USB-162 )
greggo
1
@Malvineous Przy 12 MHz lub tylko 1,5? Okres zegara wynosi [83,33 +/- 0,2 us] dla 12 MHz i [666,6 +/- 10 us] dla 1,5 MHz. Pamiętaj, że musisz odzyskać zegar po otrzymaniu, co prawdopodobnie oznacza próbkowanie co najmniej 5 - 10 razy większą niż częstotliwość zegara. Czy te implementacje pozwalają na przerwanie podczas rozmowy z urządzeniami USB?
greggo
8

W oparciu o szybkie przejrzenie arkusza danych BCM2835 (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf) rozdział 15 wygląda na to, że USB OTG jest obsługiwany w HW, więc teoretycznie może to być kwestia SW, aby wesprzeć proponowany program. Nie jestem ekspertem od protokołu USB (a nawet nowicjuszem, naprawdę), ale fajnie byłoby mieć tę funkcjonalność.

Patrząc na opis BeagleBone (http://elinux.org/BeagleBone), wydaje się on obsługiwać coś podobnego, chociaż jest konkretna wzmianka o złączu obsługującym ten tryb. Byłoby niefortunne, gdyby Raspberry Pi był ograniczony tylko z powodu wyboru złącza.

Mam nadzieję, że to jest pomocne.

Don Christensen
źródło
2
Nawet jeśli SOC to obsługuje, urządzenie koncentrujące LAN9512 w modelu B prawdopodobnie przeszkadza w uruchomieniu portu USB „wstecz” w trybie urządzenia. W modelu A (lub jeśli go usuniesz i zainstalujesz R37 i R38) możesz podłączyć port USB SOCs do zewnętrznego gniazda - ale wtedy nie będziesz miał ethernet, a będziesz mieć tylko kartę SD do potencjalnej pamięci.
Chris Stratton,
6

Wydaje się to teraz możliwe przy użyciu PiZero - więcej informacji można znaleźć na stronie http://pi.gbaman.info/?p=699 .

David Walters
źródło
1
Witamy w Raspberry Pi! Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Ghanima
4

Niestety, choć wydaje się to proste, najlepiej jak mogę stwierdzić, nie zostało to zrobione. Zobacz ten wątek i bardzo szczegółową odpowiedź, aby uzyskać więcej informacji

https://unix.stackexchange.com/questions/2683/serve-files-over-usb

I odpowiedź na konkretne pytanie tutaj: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938

wmarbut
źródło
1
Dzięki za linki. Wygląda na to, że to urządzenie może robić to, co chcę, ale jest zastrzeżone i działa tylko w jednym kierunku (wirtualna pamięć USB tylko do odczytu).
Jakob
3

Jeśli nie martwisz się szczególnie wydajnością, prawdopodobnie możesz uzyskać mikrokontroler obsługujący USB z kodem pamięci masowej USB (możesz na przykład przeprogramować interfejs debugowania STM32F103 na module ewaluacyjnym STM32F0 za 10 USD), ostrożnie podłącz go do portu szeregowego pi jako zaplecze i przebiegają z prędkością kilkuset kilobaud.

Lepszą wydajność zapewne uzyskałby interfejs z komputerem klienckim za pośrednictwem sieci Ethernet, ale wymagałoby to niestandardowego sterownika lub innej prezentacji dla systemu operacyjnego hosta - tzn. Byłbyś urządzeniem pamięci masowej lub serwerem współużytkowanym w sieci.

Sądzę, że gotowe kable do przesyłania plików już wspomniano, ale wymagałoby to odpowiedniego oprogramowania dla komputera klienckiego i obsługi sterowników linux na poziomie źródłowym dla końcówki pi.

Chris Stratton
źródło
Tak. Zobacz także olimex.com/Products/AVR/Proto/AVR-USB-162
greggo
3

Dowiedziałem się, że Arduino może emulować urządzenie USB, Arduino Leonardo nawet po wyjęciu z pudełka. LUFA stos USB może być używany na Arduino i realizuje sterownik urządzenia pamięci masowej USB (patrz samouczek ). Tego ustawienia można użyć do odwzorowania poleceń USB na SCSI, takich jak czytnik kart SD. Nie wiem wystarczająco dużo o SCSI, ale wygląda na to, że karta SD na Raspberry Pi i USB-przez-Arduino mogą być używane razem na tej samej magistrali. Pewnie ten pomysł nie jest pełnym rozwiązaniem ...

Jakob
źródło
-1 Ponieważ temat dotyczy Raspberry Pi, a nie Arduino.
1
Wiem, że ta odpowiedź nie jest pełnym rozwiązaniem! Mam nadzieję, że pytania o Raspberry Pi jako narzędzie zamiast celu same w sobie są tematyczne i poszerzenie widoku na pokrewny projekt pomaga. W tym przypadku znalazłem ten samouczek, jak używać karty SD jako urządzenia pamięci masowej USB. Może ktoś mógłby użyć Arduino lub innego ATMEGA32U4, aby podłączyć USB do magistrali SIP, która jest również dostępna na Raspberry Pi?
Jakob
2
Nie, tak naprawdę nie można udostępniać dostępu do karty SD inaczej niż przez przełączanie elektryczne. Tylko jeden host może „zamontować” dany system plików jednocześnie (dla typów systemów plików używanych na kartach - sieciowe systemy plików różnią się pod tym względem).
Chris Stratton,
1

Sprowadza się to do tego, jak działa USB. Widzisz, że kiedy dwie rzeczy są połączone z USB, host USB i urządzenie USB mogą być używane na różne sposoby. Host USB wykonuje wszelkiego rodzaju rzeczy, których urządzenia USB nie są w stanie zrobić, głównie w celu zsynchronizowania transferu danych między wszystkimi urządzeniami podłączonymi do magistrali USB. Sprawdź stronę wikipedii USB, aby uzyskać więcej informacji .

Mówisz o zmuszeniu dwóch hostów USB (Raspberry Pi i komputera) do komunikacji, co niestety po prostu nie jest obsługiwane przez standard USB. Istnieje kilka urządzeń, które mogą sfałszować transfer danych między dwoma hostami USB, ale jak wspomniał Malvineous, lepiej byłoby korzystać z Ethernetu.

Twoje pytanie wyraźnie wspomina o użyciu Raspberry Pi do emulacji pamięci USB, ale czy zastanawiałeś się nad skonfigurowaniem Raspberry Pi jako NAS? Używanie Raspberry Pi jako urządzenia NAS w zasadzie robi dokładnie to, o co prosiłeś, ale zamiast korzystania z USB, używałby twojej sieci. Oto świetne instrukcje, jak to zrobić, jeśli jesteś zainteresowany.

Dan B.
źródło
Dzięki za wskazówki. Więc moje pytania dotyczą tego, jak zaimplementować urządzenie USB za pomocą Raspberry Pi. NAS nie jest jednak odpowiedzią na to pytanie.
Jakob,
3
Jeśli chcesz, aby Raspberry Pi mógł być urządzeniem USB, sugeruję, abyś zbadał produkty na ftdichip.com, bardziej niż prawdopodobne, że będziesz w stanie podłączyć płytkę, która używa pinów GPIO Pi do połączenia z układem FTDI i to da ci możliwość urządzenia USB. Prawdopodobnie będziesz też musiał napisać sterownik, aby komunikować się z urządzeniem FTDI.
Dan B
Tyle że „twain zamieniają się miejscami”, jeśli są to urządzenia USB OTG ...
Chris Stratton,
1

Mogę to zrobić z moim starym telefonem Nokia N900 za pomocą sterownika gadżetu USB dołączonego do standardowego jądra Nokia. Emulowane urządzenie zachowuje się dokładnie tak, jak prawdziwe, można nawet uruchomić z niego komputer.

Nig
źródło
1
Czy możesz podać jakieś szczegóły? Nie mówisz o zapewnieniu pamięci w telefonie przez USB, jak większość innych smartfonów może, prawda? O ile rozumiem, sterownik gadżetu USB zapewnia tylko mapowanie z SCSI na USB , więc nadal trzeba będzie mapować SCSI na niektóre API pamięci masowej w chmurze.
Jakob
1

Pi Zero i Pi Zero W są teraz dostępne i obsługują interfejs gadżetu ( Kernal.org , linux-sunxi.org ), umożliwiając korzystanie z kilku różnych profili, w tym pamięci masowej USB i sieci wirtualnej.

Najbliższym rozwiązaniem żądania OP jest użycie protokołu sieciowego między Pi a komputerem PC, a następnie innej formy protokołu sieciowego od Pi do dostawcy chmury / sieci. Pi Zero W ma wbudowane Wi-Fi, więc może nawet łączyć się bezpośrednio z dostawcą chmury / sieci. Połączenie obu tych łączy w sieć będzie najłatwiejszym sposobem na wykonanie zadania. Dostępnych jest wiele protokołów sieciowych i dostawców usług w chmurze.

Próba użycia pamięci masowej USB byłaby złym pomysłem; musiałbyś napisać lub przepisać adaptację na poziomie sterownika między USB Mass Storage a Pi. Zaczynasz albo od MTP , albo kończysz na czymś podobnym. MTP ma poważne problemy z wydajnością ( Reddit , XDA , HowToGeek , Reddit ), więc sugeruję podejście sieciowe.

W tym kierunku powinno być wiele programów i projektów. Z punktu widzenia Pi działa on jak serwer plików / serwer synchronizacji, więc każdy podobny samouczek powinien zacząć. Zajrzyj do takich serwerów opartych na Pi , Seafile , Syncthing , SugarSync i OwnCloud , aby zacząć.

Kilka przydatnych przewodników po Pi Zero jako gadżet USB:

YetAnotherRandomUser
źródło
0

Standard USB jest oparty na hoście. Oznacza to, że jedno urządzenie musi kontrolować całą komunikację z podłączonymi urządzeniami. Klienci mogą być prostym urządzeniem lub koncentratorem. Koncentrator jest hostem proxy dla klientów podłączonych do koncentratora i komunikuje się z hostem (lub koncentratorem), z którym jest połączony.

Jak wygląda oryginalna konstrukcja USB, nie można połączyć dwóch hostów (komputera i RPi).

Istnieją jednak rozszerzenia, USB On-The-Go , które pozwalają połączeniu USB sprawdzić, czy jest ono podłączone do hosta lub klienta, i dostosować jego rolę w zależności od tego. Aby to zadziałało, musisz mieć wsparcie sprzętowe. Nie wierzę, że RPi jest do tego przeznaczone.

Aby uzyskać więcej informacji, odwiedź att http://www.usb.org/home lub nawet http://en.wikipedia.org/wiki/Universal_Serial_Bus

Krótko mówiąc, nie wierzę, że da się to zrobić.

Anders
źródło
Inna odpowiedź jest sprzeczna z brakiem uwagi dotyczącej wsparcia OTG.
Alex Chamberlain
1
@Alex, spójrz na datowniki. Anders opublikował to w 2012 roku, zanim pojawiły się Pi Zero lub A +.
YetAnotherRandomUser
@YetAnotherRandomUser, spójrz na datowniki. Wysłałem swoją odpowiedź dzień po tym, jak Anders napisał swój komentarz.
Alex Chamberlain,
@AlexChamberlain, aw 2012 r. Nie było wsparcia dla Raspberry i Rasbperian (ani żadnego innego oprogramowania, które znam). Więc tak, w TYM okresie czasu miałem rację. RPi Zero pojawiło się wiele lat później ... Teraz mamy wsparcie dla RPi Zero, o którym wspomniano w innym poście, jak napisałeś.
Anders