¿Cómo puede la Raspberry Pi emular un dispositivo de almacenamiento USB?

46

Los dispositivos de almacenamiento USB, como memorias USB y discos duros, son comunes para conectar el almacenamiento externo a cualquier tipo de computadora. ¿Cómo puede la Raspberry Pi emular un almacenamiento USB? La aplicación más fácil era acceder directamente a la tarjeta SD a través de USB, pero también se podía acceder a los archivos a través de Ethernet. Pensé en el siguiente diseño para una " memoria USB en la nube ":

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

La computadora solo debe ver una memoria USB normal para leer y escribir archivos. El Raspberry Pi actuaría como un puente programable que mapearía listados de directorios y accesos a archivos para solicitar un almacenamiento en la nube. Puede acceder a los servidores de almacenamiento en la nube con cualquier computadora (incluidos los reproductores multimedia de caja negra) a través de USB sin tener que instalar ningún software adicional en la computadora. El puente USB Raspberry Pi también debería poder cifrar / descifrar archivos sobre la marcha, por lo que uno podría almacenar archivos cifrados en la nube y acceder a ellos en cualquier dispositivo como una unidad USB normal.

Editar: los productos existentes con una funcionalidad similar pero limitada incluyen Wireless Media Stick y USB-over-Network . El acceso a los archivos en la nube puede ser posible montando almacenamiento virtual con unidad de nube o software similar y encriptación con TrueCrypt o EncFS: las contraseñas se almacenarían en la tarjeta SD de Raspberry Pi solamente, pero uno podría acceder al almacenamiento con cualquier computadora sin tener que escriba una frase de contraseña en una máquina no confiable.

Jakob
fuente
1
Creo que lo que quiere es tener una partición o carpeta compartida en su Pi que se pueda montar a través de USB en otras máquinas. La idea es que podría conectar el raspi a cualquier computadora y que esa carpeta / partición actúe como una unidad flash y se pueda escribir en ella sin ningún software adicional.
wmarbut
3
El Pi solo debe actuar como puerta de enlace entre cualquier computadora, incluidas las cajas negras y, por ejemplo, la nube de Amazon. La puerta de enlace también podría cifrar los archivos sobre la marcha.
Jakob
1
Deseche eso, ¡ esto sería perfecto!
Alex Chamberlain
1
@AlexChamberlain: no, no puedes. Los dispositivos de almacenamiento masivo USB tienen un protocolo particular que es compatible con el sistema operativo host. Por supuesto, puede crear un controlador para hacer que otra cosa parezca una especie de dispositivo de almacenamiento para un sistema operativo en particular, pero no sería un dispositivo de "almacenamiento masivo USB", sino un "dispositivo de almacenamiento personalizado conectado a través de USB"
Chris Stratton
1
@ppumkin: Porque "mapear la unidad" o "enchufarlo a la LAN" requiere configurar la PC (o reproductor de medios). Solo enchufarlo a un puerto USB no requiere ninguna administración y no es necesario exponer ninguna contraseña a la PC. Tenga en cuenta que quiero compartir el almacenamiento desde una unidad en la nube, que siempre requiere contraseñas o incluso la instalación del software del cliente.
Jakob

Respuestas:

12

El problema es que la conexión USB de Pi a la PC no tiene los pines de datos conectados, solo los pines de alimentación. Por lo tanto, no puede usar esto para hablar USB porque no está conectado.

Su única opción con el Pi sería 'golpear' el USB con los pines GPIO, pero esto es muy lento y potencialmente poco confiable. Sospecho que solo sería capaz de emular un teclado o mouse; cualquier ancho de banda más alto probablemente sería demasiado para que la CPU lo haga frente, dados los estrictos requisitos de sincronización de golpear algo como USB.

Otra alternativa sería encontrar un dispositivo que le permita conectar dos computadoras juntas a través de USB, para hacer una especie de red. Pero también puedes usar la conexión Ethernet ...

Malvinoso
fuente
1
Anteriormente jugué con un GP32 que puede comportarse como un host incluso cuando está enchufado en un hub como cliente. Si la Raspberry puede comportarse como un host en los puertos USB (no el de alimentación), entonces también debería ser posible un truco similar. ¿Quizás USB-to-go puede hacerlo?
Thorbjørn Ravn Andersen
2
¿Eh? Está confundido con el puerto micro usb utilizado para el adaptador de corriente. ¿Qué pasa con los 2 puertos USB adecuados? Con algún software de emulación, sería posible conectar ese usb a una PC y emular el almacenamiento, por ejemplo, un teléfono Android cuando lo conecte. - Pero no hay razón para eso porque conecta el Pi a su red, comparte su carpeta "en la nube" a través de samba o lo que sea (wifi o lan) - y también al mismo tiempo sincroniza su nube sea lo que sea que quiera hacer . LAN puede manejar muchas solicitudes en varios puertos
Piotr Kula
2
@ppumkin: ¿Por qué me confunde el puerto micro USB? Los pines de datos no están conectados, por lo que no puede enviar datos a través de ellos. Los puertos USB "adecuados" posteriores son puertos 'host', por lo que no es posible conectarlos a una PC sin algún tipo de dispositivo convertidor en el medio. La emulación de software no es suficiente, debido a la forma en que funciona el protocolo USB. Es posible que esté pensando en Ethernet, donde puede conectar dos dispositivos, pero USB no funciona así. Si no me cree, lea las especificaciones de USB, especialmente las partes sobre hosts USB y periféricos.
Malvineous
1
Solo quería agregar que el USB "Bit-banging" no es una opción. USB está muy, muy lejos de algo como I2C que puede ser golpeado. Posiblemente, el enfoque más práctico es usar uno de esos micros AVR que tiene un puerto de dispositivo USB incorporado y luego comunicarse con él a través del puerto serie en el Pi. (por ejemplo, olimex.com/Products/AVR/Proto/AVR-USB-162 )
greggo
1
@ Malvinoso a 12 MHz o solo 1.5? El período de reloj es [83.33 +/- 0.2 us] para 12 Mhz, y [666.6 +/- 10 us] para 1.5 MHz. Tenga en cuenta que necesita recuperar el reloj al recibirlo, lo que presumiblemente significa muestrear al menos 5 a 10 veces la frecuencia del reloj. ¿Estas implementaciones permiten interrupciones al hablar con dispositivos USB?
greggo
8

Basado en una lectura rápida de la hoja de datos BCM2835 (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf) capítulo 15, parece que USB OTG es compatible en HW, por lo que teóricamente, podría ser solo una cuestión de SW apoyar el esquema propuesto. No soy un experto en protocolos USB (o incluso un novato, de verdad), pero sería genial tener esta funcionalidad.

Al observar una descripción del BeagleBone (http://elinux.org/BeagleBone), parece admitir algo similar, aunque hay una mención específica de un conector que admite este modo. Sería desafortunado si Raspberry Pi es limitado debido solo a la selección del conector.

Espero que esto sea útil.

Don Christensen
fuente
2
Incluso si el SOC lo admite, el dispositivo concentrador LAN9512 en un modelo B probablemente se interponga en la ejecución del puerto USB "hacia atrás" en modo de dispositivo. En un modelo A (o si lo quita e instala R37 y R38), podría obtener el puerto USB de SOC en el conector externo, pero no tendría ethernet y solo tendría la tarjeta sd para almacenamiento potencial.
Chris Stratton
6

Ahora parece que esto es posible utilizando un PiZero; consulte http://pi.gbaman.info/?p=699 para obtener más información.

David Walters
fuente
1
¡Bienvenido a Raspberry Pi! Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Ghanima
4

Desafortunadamente, aunque esto parece simple, lo mejor que puedo decir es que no se ha hecho. Vea este hilo y una respuesta muy detallada para más detalles.

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

Y una respuesta específica de Pi aquí: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938

wmarbut
fuente
1
Gracias por los enlaces. Parece que este dispositivo puede hacer parte de lo que quiero, pero es propietario y solo funciona en una dirección (almacenamiento USB virtual de solo lectura).
Jakob
3

Si no está particularmente preocupado por el rendimiento, probablemente podría obtener un microcontrolador compatible con USB con código de almacenamiento masivo USB (por ejemplo, podría reprogramar la interfaz de depuración STM32F103 en un módulo de evaluación de descubrimiento STM32F0 de $ 10), conéctelo cuidadosamente al puerto serie del pi como back end y correr a varios cientos de kilobaudios.

Es probable que se obtenga un mejor rendimiento al interactuar con la PC del cliente a través de Ethernet, pero eso requeriría un controlador personalizado o una presentación diferente para el sistema operativo host, es decir, sería un dispositivo de almacenamiento conectado a la red o un servidor compartido.

Creo que ya se mencionaron cables de transferencia de archivos estándar, pero eso requeriría un software apropiado para la PC del cliente y soporte de controlador de Linux de nivel de origen para el extremo pi.

Chris Stratton
fuente
3

Descubrí que Arduino puede emular un dispositivo USB, el Arduino Leonardo incluso fuera de la caja. La pila USB LUFA se puede usar en Arduino e implementa un controlador de dispositivo de almacenamiento masivo USB (consulte este tutorial ). Esta configuración podría usarse para asignar comandos USB a SCSI, tal como los entiende el lector de tarjetas SD. No sé lo suficiente sobre SCSI, pero parece que la tarjeta SD en Raspberry Pi y el USB a través de Arduino podrían usarse juntos en el mismo bus. Claro que esta idea no es una solución completa ...

Jakob
fuente
-1 Dado que el tema es sobre la Raspberry Pi y no sobre Arduino.
1
Lo sé, esta respuesta no es una solución completa. Espero que las preguntas sobre Raspberry Pi como una herramienta en lugar de un fin en sí mismo sean sobre el tema y amplíen la vista a los proyectos relacionados. En este caso, encontré este tutorial sobre cómo usar una tarjeta SD como dispositivo de almacenamiento masivo USB. ¿Tal vez uno podría usar un Arduino u otro ATMEGA32U4 para llevar el USB al bus SIP que también está disponible en Raspberry Pi?
Jakob
2
No, realmente no puede compartir el acceso a la tarjeta sd, aparte de la conmutación eléctrica. Solo un host puede "montar" un sistema de archivos determinado a la vez (para los tipos de sistemas de archivos utilizados en las tarjetas; los sistemas de archivos de red son diferentes a este respecto).
Chris Stratton
1

Esto se reduce a cómo funciona el USB, ves que cuando hay dos cosas conectadas con USB, hay todas las formas en que un host USB y un dispositivo USB y nunca los dos deben cambiar de lugar. Un host USB hace todo tipo de cosas que los dispositivos USB no pueden hacer principalmente para sincronizar la transferencia de datos entre todos los dispositivos conectados al bus USB. Consulte la página de Wikipedia en USB para obtener más información .

De lo que estás hablando es de forzar a dos hosts USB (la Raspberry Pi y una computadora) a comunicarse, lo que desafortunadamente simplemente no es compatible con el estándar USB. Hay algunos dispositivos que pueden falsificar una transferencia de datos entre dos hosts USB, pero como Malvineous mencionó, sería mejor usar Ethernet.

Su pregunta menciona específicamente el uso de Raspberry Pi para emular el almacenamiento USB, pero ¿ha considerado configurar Raspberry Pi como NAS? Usar la Raspberry Pi como una caja NAS básicamente hace exactamente lo que pediste, pero en lugar de usar USB, usaría tu red. Aquí hay excelentes instrucciones sobre cómo hacer esto si está interesado.

Dan B
fuente
Gracias por los consejos. Entonces, mis preguntas son sobre cómo implementar un dispositivo USB usando una Raspberry Pi. Sin embargo, un NAS no es una respuesta a esta pregunta.
Jakob
3
Si desea que el Raspberry Pi tenga la capacidad de ser un dispositivo USB, le sugiero que investigue los productos en ftdichip.com, lo más probable es que pueda conectar una placa que utiliza los pines GPIO de Pi para interactuar con un chip FTDI y eso te dará capacidad de dispositivo USB. Probablemente también deba escribir un controlador para comunicarse con el dispositivo FTDI.
Dan B
Excepto que "los dos cambiarán de lugar" si son dispositivos USB OTG ...
Chris Stratton
1

Puedo hacerlo con mi viejo teléfono Nokia N900 usando el controlador de dispositivo usb incluido con el kernel de Nokia. El dispositivo emulado se comporta exactamente como uno real, incluso puede arrancar una PC desde él.

Nyg
fuente
1
¿Podría darnos algunos detalles? No habla de proporcionar el almacenamiento en su teléfono a través de USB como la mayoría de los teléfonos inteligentes pueden hacer, ¿verdad? Según tengo entendido, un controlador de dispositivo USB solo proporciona una asignación de SCSI a USB , por lo que aún sería necesario asignar SCSI a alguna API de almacenamiento en la nube.
Jakob
1

Pi Zero y Pi Zero W ahora están disponibles y son compatibles con la interfaz Gadget ( Kernal.org , linux-sunxi.org ) que permite varios perfiles diferentes, incluido el almacenamiento masivo USB y las redes virtuales.

La solución más cercana a la solicitud del OP es utilizar un protocolo de red entre el Pi y la PC host, y luego alguna otra forma de protocolo de red desde el Pi al proveedor de la nube / red. El Pi Zero W tiene Wi-Fi incorporado, por lo que incluso podría conectarse directamente al proveedor de red / nube. La conexión en red de ambos enlaces será la forma más fácil de hacer el trabajo. Hay muchos protocolos de red y proveedores de nube disponibles.

Intentar usar el almacenamiento masivo USB sería una mala idea; tendría que escribir o reescribir una adaptación a nivel de controlador entre USB Mass Storage y Pi. Comenzaría con MTP o terminaría con algo similar. MTP tiene graves problemas de rendimiento ( Reddit , XDA , HowToGeek , Reddit ), por lo que sugiero el enfoque de red.

Debería haber muchos programas y proyectos en esa dirección. Desde la perspectiva de Pi, solo está actuando como un servidor de archivos / servidor de sincronización, por lo que cualquier tutorial similar debería comenzar. Investigar cosas como los servidores Seafile , Syncthing , SugarSync y OwnCloud basados ​​en Pi debería ayudarlo a comenzar.

Algunas guías útiles sobre el Pi Zero como un gadget USB:

YetAnotherRandomUser
fuente
0

El estándar USB está basado en host. Eso significa que un dispositivo tiene que controlar toda la comunicación con los dispositivos conectados. Los clientes pueden ser un dispositivo simple o un centro. El concentrador es un proxy de host para los clientes conectados al concentrador y se comunica con el host (o concentrador) al que está conectado.

Como se ve en el diseño original de USB, no puede conectar dos hosts juntos (su PC y el RPi).

Sin embargo, existen extensiones, USB On-The-Go , que permiten que una conexión USB vea si está conectada a un host o un cliente, y ajusta su función dependiendo de eso. Para que esto funcione, debe tener soporte en el hardware. No creo que el RPi esté diseñado para hacer eso.

Para obtener más información, visite http://www.usb.org/home o incluso http://en.wikipedia.org/wiki/Universal_Serial_Bus

En resumen, no creo que se pueda hacer.

Anders
fuente
Otra respuesta contradice su falta de comentario de soporte OTG.
Alex Chamberlain
1
@ Alex, mira los sellos de fecha. Anders publicó esto en 2012, antes de que Pi Zero o A + estuvieran disponibles.
YetAnotherRandomUser
@YetAnotherRandomUser, mira los sellos de fecha. Publiqué mi respuesta el día después de que Anders escribió su comentario.
Alex Chamberlain
@AlexChamberlain y en 2012, no había soporte para eso para Raspberry y Rasbperian (o cualquier otro software que conozca). Entonces sí, en ESE marco de tiempo, tenía razón. El RPi Zero llegó muchos años después ... Ahora tenemos soporte para RPi Zero, que se menciona en otra publicación, como usted escribió.
Anders