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.
fonte
Respostas:
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 ...
fonte
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.
fonte
Agora isso parece possível usando um PiZero - consulte http://pi.gbaman.info/?p=699 para obter mais informações.
fonte
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
fonte
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.
fonte
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 ...
fonte
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.
fonte
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.
fonte
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:
fonte
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.
fonte