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.
fuente
Respuestas:
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 ...
fuente
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.
fuente
Ahora parece que esto es posible utilizando un PiZero; consulte http://pi.gbaman.info/?p=699 para obtener más información.
fuente
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
fuente
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.
fuente
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 ...
fuente
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.
fuente
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.
fuente
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:
fuente
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.
fuente