In che modo Raspberry Pi può emulare un dispositivo di archiviazione USB?


46

I dispositivi di archiviazione USB, come chiavette USB e dischi rigidi, sono comuni per collegare l'archiviazione esterna a qualsiasi tipo di computer. In che modo Raspberry Pi può emulare un archivio USB? L'applicazione più semplice era accedere direttamente alla scheda SD tramite USB, ma si poteva anche fornire accesso ai file tramite Ethernet. Ho pensato al seguente layout per una " chiavetta USB ":

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

Il computer dovrebbe vedere solo una normale chiavetta USB da cui leggere e scrivere file. Il Raspberry Pi fungerebbe da bridge programmabile per mappare elenchi di directory e accessi ai file da richiedere a un archivio cloud. È possibile accedere agli hoster di archiviazione cloud con qualsiasi computer (inclusi i lettori multimediali della scatola nera) tramite USB senza dover installare alcun software aggiuntivo sul computer. Il bridge USB Raspberry Pi dovrebbe anche essere in grado di crittografare / decrittografare i file al volo, in modo da poter archiviare i file crittografati nel cloud e accedervi su qualsiasi dispositivo come una normale unità USB.

Modifica: i prodotti esistenti con funzionalità simili ma limitate includono Wireless Media Stick e USB-over-Network . L'accesso ai file nel cloud può essere possibile montando l'archiviazione virtuale con unità cloud o software simile e la crittografia con TrueCrypt o EncFS - le password verrebbero archiviate solo sulla scheda SD di Raspberry Pi ma si potrebbe accedere all'archiviazione con qualsiasi computer senza dover digitare una passphrase su una macchina non attendibile.


1
Penso che quello che vuole sia avere una partizione o una cartella condivisa sul suo Pi che sia montabile via USB su altre macchine. L'idea è che è possibile collegare raspi a qualsiasi computer e che la cartella / partion si comporta come un'unità flash e può essere scritta senza alcun software aggiuntivo.
wmarbut,

3
Il Pi dovrebbe agire solo come gateway tra qualsiasi computer, comprese le scatole nere e, ad esempio, il cloud Amazon. Il gateway potrebbe anche crittografare i file al volo.
Jakob,

1
Scartalo - questo sarebbe perfetto!
Alex Chamberlain,

1
@AlexChamberlain - no, non puoi. I dispositivi di archiviazione di massa USB hanno un protocollo particolare che è supportato dal sistema operativo host. Naturalmente puoi creare un driver per far apparire qualcos'altro come una sorta di dispositivo di archiviazione in un particolare sistema operativo, ma non sarebbe un dispositivo "USB Mass Storage" ma piuttosto un "dispositivo di archiviazione personalizzato collegato tramite USB"
Chris Stratton

1
@ppumkin: Perché "mappare l'unità" o "collegarsi alla LAN" richiede la configurazione del PC (o del lettore multimediale). Il semplice collegamento a una porta USB non richiede alcuna amministrazione e non è necessario esporre alcuna password al PC. Nota che desidero condividere l'archiviazione da un'unità cloud, che richiede sempre password o persino l'installazione di software client.
Jakob,

Risposte:


12

Il problema è che la connessione USB del Pi al PC non ha i pin dati collegati, ma solo i pin di alimentazione. Quindi non puoi usarlo per parlare USB perché non è cablato.

L'unica opzione con il Pi sarebbe quella di "bit bang" USB usando i pin GPIO, ma questo è molto lento e potenzialmente inaffidabile. Ho il sospetto che saresti davvero in grado di emulare solo una tastiera o un mouse - qualsiasi larghezza di banda maggiore sarebbe probabilmente troppo per la CPU, dato i rigidi requisiti di temporizzazione del bit bang qualcosa come USB.

Un'altra alternativa sarebbe quella di trovare un dispositivo che ti consenta di collegare due computer insieme tramite USB, per creare una sorta di rete. Ma allora puoi anche usare la connessione Ethernet ...


1
In precedenza ho giocato con un GP32 che può comportarsi come un host anche se collegato a un hub come client. Se il Raspberry può comportarsi come un host sulle porte USB (non quella di alimentazione), anche in questo caso dovrebbe essere possibile un trucco simile. Forse USB-to-go può farlo?
Thorbjørn Ravn Andersen,

2
Eh? Ti sbagli dalla porta micro usb utilizzata per l'alimentatore. Che dire delle 2 porte USB appropriate? Con alcuni software di emulazione sarebbe possibile collegare quell'USB a un PC ed emulare l'archiviazione - ad esempio - il telefono Android quando si collega l'USB. - Ma non c'è motivo perché colleghi il Pi alla tua rete, condividi la tua cartella "cloud" tramite samba o qualsiasi altra cosa (wifi o lan) - e allo stesso tempo fai sincronizzare il tuo cloud qualunque cosa tu voglia fare . La LAN può gestire molte richieste su varie porte
Piotr Kula,

2
@ppumkin: perché mi sbaglio dalla porta micro USB? I pin di dati non sono collegati, quindi non è possibile inviare dati attraverso di esso. Le porte USB "appropriate" a valle sono porte "host", quindi non è possibile collegarle a un PC senza un qualche tipo di dispositivo di conversione nel mezzo. L'emulazione del software non è sufficiente, a causa del modo in cui funziona il protocollo USB. Potresti pensare a Ethernet in cui puoi collegare due dispositivi qualsiasi, ma USB non funziona in questo modo. Se non mi credi, leggi le specifiche USB, in particolare le parti relative agli host USB e alle periferiche.
Malvineous,

1
Volevo solo aggiungere che USB "Bit banging" non è un'opzione. L'USB è molto lontana da qualcosa come I2C che può essere sbattuto. Forse l'approccio più pratico è quello di utilizzare uno di quei micro AVR che ha una porta per dispositivo USB incorporata e quindi comunicare ad esso tramite la porta seriale sul Pi. (es. olimex.com/Products/AVR/Proto/AVR-USB-162 )
greggo

1
@Malvineous A 12 MHz o solo 1,5? Il periodo di clock è [83,33 +/- 0,2 us] per 12 Mhz e [666,6 +/- 10 us] per 1,5 MHz. Tenere presente che è necessario ripristinare l'orologio alla ricezione, il che presumibilmente significa campionare almeno 5-10 volte la frequenza di clock. Queste implementazioni consentono interruzioni mentre si parla con dispositivi USB?
Greggo,

8

Basato su una rapida lettura del foglio dati BCM2835 (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf) capitolo 15, sembra che USB OTG sia supportato in HW, quindi teoricamente, potrebbe essere solo una questione di SW supportare lo schema proposto. Non sono un esperto di protocollo USB (o addirittura principiante, davvero), ma sarebbe bello avere questa funzionalità.

Guardando una descrizione di BeagleBone (http://elinux.org/BeagleBone), sembra supportare qualcosa di simile, sebbene ci sia una menzione specifica di un connettore che supporta questa modalità. Sarebbe un peccato se il Raspberry Pi fosse limitato a causa della sola selezione del connettore.

Spero sia utile.


2
Anche se il SOC lo supporta, il dispositivo hub LAN9512 su un modello B probabilmente ostacola l'esecuzione della porta USB "all'indietro" in modalità dispositivo. Su un modello A (o se lo rimuovi e installi R37 e R38) potresti ottenere la porta USB SOCs sul jack esterno - ma non avresti Ethernet e avresti solo la scheda SD per il potenziale spazio di archiviazione.
Chris Stratton,


4

Sfortunatamente, questo sembra semplice, per quanto posso dire, non è stato fatto. Vedi questa discussione e una risposta molto dettagliata per maggiori dettagli

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

E una risposta specifica Pi qui: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938


1
Grazie per i collegamenti. Sembra che questo dispositivo possa fare parte di ciò che voglio, ma è proprietario e funziona solo in una direzione (archiviazione USB di sola lettura virtuale).
Jakob,

3

Se non sei particolarmente preoccupato per le prestazioni, potresti probabilmente ottenere un microcontrollore USB con codice di archiviazione di massa USB (potresti ad esempio riprogrammare l'interfaccia di debug STM32F103 su un modulo di valutazione scoperta STM32F0 da $ 10), collegalo attentamente alla porta seriale del pi come back-end e correre a diverse centinaia di kilobaud.

Probabilmente si otterrebbero prestazioni migliori interfacciarsi con il PC client tramite Ethernet, ma ciò richiederebbe un driver personalizzato o una presentazione diversa al sistema operativo host, ovvero si sarebbe un dispositivo di archiviazione collegato alla rete o un server di condivisione.

Credo che i cavi di trasferimento file standard fossero già menzionati, ma ciò richiederebbe un software adeguato per il PC client e il supporto del driver Linux a livello di sorgente per il terminale.



3

Ho scoperto che Arduino può emulare un dispositivo USB, Arduino Leonardo anche fuori dalla scatola. Lo stack USB LUFA può essere utilizzato su Arduino e implementa un driver di dispositivo di archiviazione di massa USB (vedere questo tutorial ). Questa configurazione può essere utilizzata per mappare i comandi da USB a SCSI , come compreso dal lettore di schede SD. Non so abbastanza su SCSI ma sembra che la scheda SD su Raspberry Pi e l'USB-via-Arduino possano essere usati insieme sullo stesso bus. Sicuramente questa idea non è una soluzione completa ...


-1 Poiché l'argomento riguarda il Raspberry Pi e non Arduino.

1
Lo so, questa risposta non è una soluzione completa! Spero che le domande su Raspberry Pi come strumento anziché fine a se stesso siano in tema e che l'ampliamento della vista ai progetti correlati aiuti. In questo caso ho trovato questo tutorial su come utilizzare una scheda SD come dispositivo di archiviazione di massa USB. Forse si potrebbe usare un Arduino o un altro ATMEGA32U4 per ottenere USB sul bus SIP che è disponibile anche su Raspberry Pi?
Jakob,

2
No, non puoi davvero condividere l'accesso alla sdcard, se non tramite la commutazione elettrica. Solo un host può "montare" un determinato filesystem alla volta (per i tipi di filesystem utilizzati sulle schede - i filesystem di rete sono diversi in questo senso).
Chris Stratton,

1

Questo dipende dal modo in cui funziona USB, vedi ogni volta che due cose sono collegate con USB ci sono tutti i modi in cui un host USB e un dispositivo USB e mai i due si scambiano di posto. Un host USB fa tutto ciò che i dispositivi USB non possono fare principalmente per sincronizzare il trasferimento di dati tra tutti i dispositivi collegati al bus USB. Controlla la pagina USB Wikipedia per maggiori informazioni .

Quello di cui stai parlando è costringere due host USB (il Raspberry Pi e un computer) a comunicare, che purtroppo non è semplicemente supportato dallo standard USB. Ci sono alcuni dispositivi che possono falsificare un trasferimento di dati tra due host USB ma, come ha detto Malvineous, sarebbe meglio usare Ethernet.

La tua domanda menziona specificamente l'utilizzo di Raspberry Pi per emulare l' archiviazione USB ma hai considerato di configurare Raspberry Pi come NAS? L'utilizzo di Raspberry Pi come una scatola NAS sostanzialmente fa esattamente quello che hai chiesto, ma invece di utilizzare USB sarebbe utilizzare la tua rete. Ecco delle ottime istruzioni su come farlo se sei interessato.


Grazie per i suggerimenti. Quindi le mie domande riguardano come implementare un dispositivo USB usando un Raspberry Pi. Un NAS, tuttavia, non è una risposta a questa domanda.
Jakob,

3
Se vuoi che Raspberry Pi abbia la capacità di essere un dispositivo USB, ti suggerisco di studiare i prodotti su ftdichip.com molto probabilmente sarai in grado di collegare una scheda che utilizza i pin GPIO del Pi per interfacciarsi con un chip FTDI e questo ti darà la capacità del dispositivo USB. Probabilmente dovrai anche scrivere un driver per comunicare con il dispositivo FTDI.
Dan B,

Solo che "i due si scambieranno posto" se si tratta di dispositivi USB OTG ...
Chris Stratton

1

Posso farlo con il mio vecchio Nokia N900 utilizzando il driver del gadget USB incluso con il kernel Nokia di serie. Il dispositivo emulato si comporta esattamente come uno reale, è anche possibile avviare un PC da esso.


1
Potresti fornire alcuni dettagli? Non parli solo di fornire l'archiviazione sul tuo telefono tramite USB come può fare la maggior parte degli altri smartphone, vero? A quanto ho capito, un driver per gadget USB fornisce solo una mappatura da SCSI a USB , quindi è ancora necessario mappare SCSI su alcune API di archiviazione cloud.
Jakob,

1

Pi Zero e Pi Zero W sono ora disponibili e supportano l'interfaccia Gadget ( Kernal.org , linux-sunxi.org ) che consente diversi profili, tra cui USB Mass Storage e rete virtuale.

La soluzione più vicina alla richiesta dell'OP è quella di utilizzare un protocollo di rete tra il Pi e il PC host, e quindi qualche altra forma di protocollo di rete dal Pi al provider cloud / di rete. Pi Zero W ha il Wi-Fi integrato, quindi potrebbe persino connettersi direttamente al provider cloud / di rete. Il collegamento in rete di entrambi questi collegamenti sarà il modo più semplice per completare il lavoro. Sono disponibili molti protocolli di rete e provider cloud.

Cercare di utilizzare l'archiviazione di massa USB sarebbe una cattiva idea; dovresti scrivere o riscrivere un adattamento a livello di driver tra USB Mass Storage e Pi. O inizieresti con MTP o finiresti con qualcosa di simile. MTP ha gravi problemi di prestazioni ( Reddit , XDA , HowToGeek , Reddit ), quindi suggerisco l'approccio di rete.

Dovrebbero esserci molti programmi e progetti in quella direzione. Dal punto di vista del Pi, si comporta semplicemente come un file server / server di sincronizzazione, quindi qualsiasi tutorial simile dovrebbe iniziare. Esaminare cose come i server Seafile , Syncthing , SugarSync e OwnCloud basati su Pi dovrebbe iniziare.

Alcune guide utili su Pi Zero come gadget USB:


0

Gli standard USB sono basati su host. Ciò significa che un dispositivo deve controllare tutte le comunicazioni con i dispositivi collegati. I client possono essere un dispositivo semplice o un hub. L'hub è un proxy host per i client connessi all'hub e comunica con l'host (o hub) a cui è connesso.

Come sembra il design originale di USB, non puoi connettere due host insieme (il tuo PC e l'RPi).

Esistono tuttavia delle estensioni, USB On-The-Go , che consente a una connessione USB di vedere se è connessa a un host o un client e ne regola il ruolo a seconda di ciò. Per far funzionare tutto questo, devi avere supporto nell'hardware. Non credo che l'RPi sia progettato per farlo.

Per ulteriori informazioni, consultare http://www.usb.org/home o anche http://en.wikipedia.org/wiki/Universal_Serial_Bus

In breve, non credo che si possa fare.


Un'altra risposta contraddice la tua mancanza di osservazioni sul supporto OTG.
Alex Chamberlain,

1
@Alex, guarda i timbri data. Anders ha pubblicato questo post nel 2012, prima che Pi Zero o A + fossero disponibili.
YetAnotherRandomUser

@YetAnotherRandomUser, guarda i timbri data. Ho pubblicato la mia risposta il giorno dopo che Anders ha scritto il suo commento.
Alex Chamberlain,

@AlexChamberlain e nel 2012 non c'era supporto per quello per Raspberry e Rasbperian (o qualsiasi altro software che conosco). Quindi sì, in quel lasso di tempo, avevo ragione. L'RPi Zero è arrivato molti anni dopo ... Ora abbiamo il supporto per RPi Zero, che è menzionato in un altro post, come hai scritto.
Anders,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.