Como o Raspberry Pi pode emular um dispositivo de armazenamento USB?

46

Dispositivos de armazenamento USB, como pen drives e discos rígidos, são comuns para anexar armazenamento externo a qualquer tipo de computador. Como o Raspberry Pi pode emular um armazenamento USB? A aplicação mais fácil era acessar diretamente o cartão SD via USB, mas também era possível acessar arquivos via Ethernet. Pensei no seguinte layout para um " pen drive USB ":

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

O computador deve ver apenas um dispositivo USB normal para ler e gravar arquivos. O Raspberry Pi atuaria como uma ponte programável que mapeia listagens de diretórios e acessos a arquivos para solicitar um armazenamento na nuvem. Você pode acessar os hosts de armazenamento em nuvem com qualquer computador (incluindo media players de caixa preta) via USB sem precisar instalar nenhum software adicional no computador. A ponte USB do Raspberry Pi também deve ser capaz de criptografar / descriptografar arquivos em tempo real, para que você possa armazenar arquivos criptografados na nuvem e acessá-los em qualquer dispositivo, como uma unidade USB normal.

Edit: Os produtos existentes com funcionalidade semelhante, mas limitada , incluem o Wireless Media Stick e o USB pela rede . O acesso aos arquivos na nuvem pode ser possível montando armazenamento virtual com unidade de nuvem ou software semelhante e criptografia com TrueCrypt ou EncFS - as senhas seriam armazenadas no cartão SD do Raspberry Pi apenas, mas era possível acessar o armazenamento com qualquer computador sem a necessidade de digite uma senha em uma máquina não confiável.

Jakob
fonte
1
Eu acho que o que ele quer é ter uma partição ou pasta compartilhada em seu Pi que seja montável via USB em outras máquinas. A idéia é que você pode conectar o raspi a qualquer computador e essa pasta / partição funciona como uma unidade flash e pode ser gravada sem nenhum software adicional.
wmarbut
3
O Pi deve atuar apenas como gateway entre qualquer computador, incluindo caixas pretas e, por exemplo, a nuvem da Amazon. O gateway também pode criptografar os arquivos em tempo real.
Jakob
1
Sucata que - isso seria perfeito!
AlexCamplain
1
@AlexChamberlain - não, você não pode. Os dispositivos USB de armazenamento em massa possuem um protocolo específico, suportado pelo sistema operacional host. É claro que você pode criar um driver para fazer com que algo pareça um tipo de dispositivo de armazenamento para um sistema operacional específico, mas não seria um dispositivo "USB Mass Storage", mas um "dispositivo de armazenamento personalizado conectado via USB"
Chris Stratton
1
@ppumkin: Porque "mapear a unidade" ou "conectar à LAN" requer a configuração do PC (ou do media player). Apenas conectar a uma porta USB não requer administração e não é necessário expor senhas ao PC. Observe que quero compartilhar o armazenamento de uma unidade na nuvem, que sempre exige senhas ou até a instalação do software cliente.
Jakob

Respostas:

12

O problema é que a conexão USB do Pi ao PC não tem os pinos de dados conectados - apenas os pinos de energia. Portanto, você não pode usar isso para falar USB porque não está conectado.

Sua única opção com o Pi seria 'bit bang' USB usando os pinos GPIO, mas isso é muito lento e potencialmente não confiável. Eu suspeito que você realmente seria capaz de emular um teclado ou mouse - qualquer largura de banda maior provavelmente seria demais para a CPU suportar, dados os requisitos de tempo apertado de troca de bits de algo como USB.

Outra alternativa seria encontrar um dispositivo que permita conectar dois computadores juntos via USB, para criar um tipo de rede. Mas então você também pode usar a conexão Ethernet ...

Malvineous
fonte
1
Eu já joguei com um GP32 que pode se comportar como um host, mesmo quando conectado a um hub como cliente. Se o Raspberry puder se comportar como um host nas portas USB (e não na de energia), também deverá ser possível um truque semelhante. Talvez o USB-to-go possa fazer isso?
Thorbjørn Ravn Andersen
2
Hã? Você está enganado com a porta micro USB usada para o adaptador de energia. E as 2 portas USB adequadas? Com algum software de emulação, seria possível conectar esse usb a um PC e emular o armazenamento - por exemplo - telefone Android quando você conecta o usb. - Mas não há razão para isso, porque você conecta o Pi à sua rede, compartilha sua pasta "nuvem" via samba ou qualquer outra coisa (wifi ou lan) - e também ao mesmo tempo sincroniza sua nuvem do jeito que você deseja fazer . LAN pode lidar com muitos pedido em vários portos
Piotr Kula
2
@ppumkin: Por que estou enganado com a porta micro USB? Os pinos de dados não estão conectados, então você não pode enviar dados através dele. As portas USB "apropriadas" a jusante são portas 'host', portanto, não é possível conectá-las a um PC sem algum tipo de dispositivo conversor no meio. A emulação de software não é suficiente, devido à maneira como o protocolo USB funciona. Você pode estar pensando em Ethernet, onde pode conectar dois dispositivos, mas o USB não funciona assim. Se você não acredita em mim, leia a especificação USB, especialmente as partes sobre hosts USB e periféricos.
Malvineous
1
Só queria acrescentar que o USB "estrondo" não é uma opção. O USB está muito longe de algo como o I2C, que pode ser afetado por bits. Possivelmente, a abordagem mais prática é usar um desses micros AVR que possui uma porta de dispositivo USB incorporada e, em seguida, comunicar-se a ele por meio da porta serial no Pi. (por exemplo, olimex.com/Products/AVR/Proto/AVR-USB-162 )
greggo 6/01/13
1
@ Malvineous A 12 MHz ou apenas 1,5? O período do relógio é [83,33 +/- 0,2 us] para 12 Mhz e [666,6 +/- 10 us] para 1,5 MHz. Lembre-se de que você precisa recuperar o relógio ao receber, o que presumivelmente significa amostrar pelo menos 5 a 10 vezes a taxa do relógio. Essas implementações permitem interrupções ao falar com dispositivos USB?
Greggo
8

Com base em uma rápida leitura da folha de dados do BCM2835 (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf) capítulo 15, parece que o USB OTG é suportado no HW, então, teoricamente, pode ser apenas uma questão de SW apoiar o esquema proposto. Eu não sou um especialista em protocolo USB (ou mesmo novato, na verdade), mas seria muito legal ter essa funcionalidade.

Observando uma descrição do BeagleBone (http://elinux.org/BeagleBone), ele parece oferecer suporte a algo semelhante, embora exista uma menção específica de um conector que suporte esse modo. Seria lamentável que o Raspberry Pi seja limitado devido apenas à seleção do conector.

Espero que isso seja útil.

Don Christensen
fonte
2
Mesmo que o SOC o suporte, o dispositivo do hub LAN9512 em um modelo B provavelmente atrapalha a execução da porta USB "para trás" no modo de dispositivo. Em um modelo A (ou se você o remover e instalar o R37 e o R38), você poderá obter a porta USB do SOCs na tomada externa - mas você não teria Ethernet, e apenas o sdcard para armazenamento em potencial.
31412 Chris Stratton
6

Agora isso parece possível usando um PiZero - consulte http://pi.gbaman.info/?p=699 para obter mais informações.

David Walters
fonte
1
Bem-vindo ao Raspberry Pi! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Ghanima
4

Infelizmente, embora isso pareça simples, o melhor que posso dizer, não foi feito. Veja este tópico e resposta muito detalhada para obter mais detalhes

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

E uma resposta específica do Pi aqui: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938

wmarbut
fonte
1
Obrigado pelos links. Parece que este dispositivo pode fazer parte do que eu quero, mas é proprietário e funciona apenas em uma direção (armazenamento USB virtual somente leitura).
Jakob
3

Se você não está particularmente preocupado com o desempenho, provavelmente poderá adquirir um microcontrolador compatível com USB com código de armazenamento em massa USB (você pode, por exemplo, reprogramar a interface de depuração STM32F103 em um módulo de avaliação de descoberta $ 10 STM32F0), conecte-o cuidadosamente à porta serial do pi como back-end e execute a várias centenas de kilobaud.

Provavelmente, obteria melhor desempenho ao fazer interface com o PC cliente via Ethernet, mas isso exigiria um driver personalizado ou uma apresentação diferente para o sistema operacional host - ou seja, você seria um dispositivo de armazenamento conectado à rede ou um servidor de compartilhamento.

Acredito que os cabos de transferência de arquivos prontos para venda já foram mencionados, mas isso exigiria o software apropriado para o PC cliente e o suporte ao driver linux no nível da fonte para a extremidade pi.

Chris Stratton
fonte
3

Eu descobri que o Arduino pode emular um dispositivo USB, o Arduino Leonardo mesmo fora da caixa. A pilha USB LUFA pode ser usada no Arduino e implementa um driver de dispositivo de armazenamento em massa USB (consulte este tutorial ). Essa configuração pode ser usada para mapear comandos USB para SCSI , como é entendido pelo leitor de cartão SD. Não sei o suficiente sobre o SCSI, mas parece que o cartão SD no Raspberry Pi e o USB via Arduino podem ser usados ​​juntos no mesmo barramento. Claro que essa idéia não é uma solução completa ...

Jakob
fonte
-1 Como o tópico é sobre o Raspberry Pi e não o Arduino.
1
Eu sei, essa resposta não é uma solução completa! Espero que essas perguntas sobre o Raspberry Pi como uma ferramenta, em vez de um fim em si, estejam no tópico e ampliem a visão para ajuda relacionada a projetos. Neste caso, encontrei este tutorial como usar um cartão SD como dispositivo de armazenamento em massa USB. Talvez alguém possa usar um Arduino ou outro ATMEGA32U4 para obter USB no barramento SIP, que também está disponível no Raspberry Pi?
Jakob
2
Não, você não pode realmente compartilhar o acesso ao sdcard, a não ser por comutação elétrica. Somente um host pode "montar" um determinado sistema de arquivos por vez (para os tipos de sistemas de arquivos usados ​​nas placas - os sistemas de arquivos de rede são diferentes nesse aspecto).
Chris Stratton
1

Isso se resume ao modo como o USB funciona, você vê que sempre que duas coisas são conectadas ao USB, há sempre um host USB e um dispositivo USB, e nunca os dois trocam de lugar. Um host USB faz todos os tipos de coisas que os dispositivos USB não podem fazer principalmente para sincronizar a transferência de dados entre todos os dispositivos conectados ao barramento USB. Confira a página da Wikipedia sobre USB para mais informações .

O que você está falando sobre fazer é forçar dois hosts USB (o Raspberry Pi e um computador) a se comunicar, o que infelizmente não é suportado pelo padrão USB. Existem alguns dispositivos que podem falsificar uma transferência de dados entre dois hosts USB, mas, como Malvineous mencionou, seria melhor usar ethernet.

Sua pergunta menciona especificamente o uso do Raspberry Pi para emular o armazenamento USB, mas você já pensou em configurar o Raspberry Pi como um NAS? Usar o Raspberry Pi como uma caixa NAS basicamente faz exatamente o que você pediu, mas em vez de usar USB, ele usaria sua rede. Aqui estão ótimas instruções sobre como fazer isso, se você estiver interessado.

Dan B
fonte
Obrigado pelas indicações. Então, minhas perguntas são sobre como implementar um dispositivo USB usando um Raspberry Pi. Um NAS, no entanto, não é uma resposta para esta pergunta.
Jakob
3
Se você deseja que o Raspberry Pi possa ser um dispositivo USB, sugiro que você investigue os produtos em ftdichip.com com mais probabilidade de conectar uma placa que usa os pinos GPIO do Pi para fazer interface com um chip FTDI e isso lhe dará a capacidade do dispositivo USB. Você provavelmente também precisará escrever um driver para se comunicar com o dispositivo FTDI.
22612 Dan B
Só que "os dois devem trocar de lugar" se eles são dispositivos USB OTG ...
Chris Stratton
1

Posso fazer isso com meu antigo Nokia N900 Phone usando o driver do gadget usb incluído no kernel da Nokia. O dispositivo emulado se comporta exatamente como um dispositivo real, você pode até inicializar um PC a partir dele.

Nyg
fonte
1
Você poderia fornecer alguns detalhes? Você não fala apenas em fornecer armazenamento em seu telefone via USB, como a maioria dos outros smartphones pode, não é? Pelo que entendi, um driver de dispositivo USB fornece apenas um mapeamento de SCSI para USB , portanto, ainda é necessário mapear o SCSI para alguma API de armazenamento em nuvem.
Jakob
1

O Pi Zero e o Pi Zero W estão agora disponíveis e suportam a interface do Gadget ( Kernal.org , linux-sunxi.org ), permitindo vários perfis diferentes, incluindo USB Mass Storage e redes virtuais.

A solução mais próxima da solicitação do OP é usar um protocolo de rede entre o Pi e o PC host e, em seguida, alguma outra forma de protocolo de rede do Pi ao provedor de nuvem / rede. O Pi Zero W possui Wi-Fi embutido, podendo até se conectar diretamente ao provedor de nuvem / rede. A conexão em rede desses dois links será a maneira mais fácil de realizar o trabalho. Existem muitos protocolos de rede e provedores de nuvem disponíveis.

Tentar usar o USB Mass Storage seria uma má idéia; você teria que escrever ou reescrever uma adaptação no nível do driver entre o USB Mass Storage e o Pi. Você começaria com o MTP ou acabaria com algo semelhante. O MTP tem problemas graves de desempenho ( Reddit , XDA , HowToGeek , Reddit ), então sugiro a abordagem de rede.

Deve haver muitos programas e projetos nessa direção. Da perspectiva do Pi, ele está apenas agindo como um servidor de servidor de arquivos / sincronização, portanto, qualquer tutorial semelhante deve começar. Examinar coisas como servidores Seafile , Syncthing , SugarSync e OwnCloud baseados em Pi deve começar.

Alguns guias úteis sobre o Pi Zero como um dispositivo USB:

YetAnotherRandomUser
fonte
0

O padrão USB é baseado em host. Isso significa que um dispositivo precisa controlar toda a comunicação com os dispositivos conectados. Os clientes podem ser um dispositivo simples ou um hub. O hub é um proxy de host para os clientes conectados ao hub e se comunica com o host (ou hub) ao qual está conectado.

Como o design original do USB parece, você não pode conectar dois hosts juntos (seu PC e o RPi).

No entanto, existem extensões, o USB On-The-Go , que permite que uma conexão USB veja se está conectada a um host ou cliente, e ajusta sua função dependendo disso. Para que isso funcione, você precisa ter suporte no hardware. Não acredito que o RPi seja projetado para fazer isso.

Para mais informações, consulte http://www.usb.org/home ou mesmo http://en.wikipedia.org/wiki/Universal_Serial_Bus

Em suma, não acredito que isso possa ser feito.

Anders
fonte
Outra resposta contradiz sua falta de observação de suporte do OTG.
Alex Chamberlain
1
@ Alex, veja os carimbos de data. Anders postou isso em 2012, antes de o Pi Zero ou o A + estarem disponíveis.
YetAnotherRandomUser 5/17
@YetAnotherRandomUser, veja os carimbos de data. Publiquei minha resposta no dia seguinte ao de Anders escrever seu comentário.
Alex Chamberlain
@AlexChamberlain e, em 2012, não havia suporte para isso para Raspberry e Rasbperian (ou qualquer outro software que eu conheça). Então, sim, naquele período de tempo, eu estava certo. O RPi Zero veio muitos anos depois ... Agora temos suporte para o RPi Zero, mencionado em outro post, como você escreveu.
Anders