Raspberry Pi如何模拟USB存储设备?


46

USB存储设备(例如USB随身碟和硬盘驱动器)通常用于将外部存储设备连接到任何类型的计算机。Raspberry Pi如何模拟USB存储设备?最简单的应用是通过USB直接访问SD卡,但也可以通过以太网访问文件。我考虑过以下“ USB云棒 ”的布局:

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

电脑只能看到普通的USB闪存盘来读取和写入文件。Raspberry Pi将充当可编程的桥梁,映射目录列表和文件访问以请求到云存储。您可以通过USB使用任何计算机(包括黑匣子媒体播放器)访问云存储主机,而无需在计算机上安装任何其他软件。Raspberry Pi USB桥接器还应该能够即时加密/解密文件,因此人们可以将加密的文件存储在云中,并可以在任何设备(如普通USB驱动器)上访问它们。

编辑:具有类似但功能有限的现有产品包括Wireless Media StickUSB-over-Network。通过使用云驱动器或类似软件安装虚拟存储并使用TrueCrypt或EncFS进行加密,可以访问云中的文件-密码仅存储在Raspberry Pi的SD卡上,但是无需任何操作即可使用任何计算机访问存储。在不受信任的机器上输入密码。


1
我认为他想要的是在Pi上具有一个分区或共享文件夹,该分区或共享文件夹可以通过USB安装在其他计算机上。这样的想法是,您可以将raspi插入任何计算机,并且该文件夹/分区的作用类似于闪存驱动器,无需任何其他软件即可写入。
wmarbut

3
Pi仅应充当任何计算机(包括黑匣子)与Amazon云之间的网关。网关还可以动态加密文件。
雅各布2012年

1
废话- 将是完美的!
亚历克斯·张伯伦

1
@AlexChamberlain-不,你不能。USB海量存储设备具有主机操作系统支持的特定协议。您当然可以创建一个驱动程序,使其他东西看起来像某种存储设备,但不是“ USB大容量存储”设备,而是“通过USB连接的自定义存储设备”
Chris Stratton

1
@ppumkin:因为“将驱动器映射”或“插入LAN”需要配置PC(或媒体播放器)。仅插入USB端口就不需要任何管理,也不需要向PC公开任何密码。请注意,我要从云驱动器共享存储,而该驱动器始终需要密码,甚至需要安装客户端软件。
雅各布2012年

Answers:


12

问题在于,Pi到PC的USB连接没有连接数据引脚,只有电源引脚。所以您不能用它来说USB,因为它没有连接好。

Pi的唯一选择是使用GPIO引脚对USB进行“位撞击”,但这非常慢,并且可能不可靠。我怀疑您实际上只能模拟键盘或鼠标-考虑到像USB之类的比特撞击的严格时序要求,任何更高的带宽可能对于CPU来说都无法应付。

另一种选择是找到一种设备,该设备可让您通过USB将两台计算机连接在一起,从而形成一种网络。但是您也可以只使用以太网连接...


1
我以前玩过GP32,即使作为客户端插入集线器,它也可以像主机一样工作。如果Raspberry可以像USB端口上的主机一样工作(而不是电源端口),那么那里也应该有类似的技巧。也许USB-to-go可以做到吗?
托尔比约恩Ravn的安德森

2
??您被电源适配器使用的微型USB端口弄错了。那2个合适的USB端口呢?使用某些仿真软件,可以将USB插入PC并仿真存储-例如-插入USB时的Android手机。-但是没有理由,因为您将Pi插入网络,通过samba或其他(wifi或lan)共享“ cloud”文件夹,同时也可以同步您想要的云同步。局域网可以处理各种端口上的许多请求
Piotr Kula

2
@ppumkin:为什么我会误认为micro USB端口?数据引脚未连接,因此无法通过它发送数据。下游的“适当” USB端口是“主机”端口,因此如果中间没有某种转换器设备,则无法将它们插入PC。由于USB协议的工作方式,软件仿真还不够。您可能会想到以太网,可以将任意两个设备连接在一起,但是USB不能像这样工作。如果您不相信我,请阅读USB规范,尤其是有关USB主机与外围设备的部分。
Malvineous

1
只是想补充一点,“ Bit-banging” USB不是一个选择。USB与I2C之类的东西相距很远。可能最实用的方法是使用其中内置USB设备端口的AVR微型计算机之一,然后通过Pi上的串行端口与其通信。(例如olimex.com/Products/AVR/Proto/AVR-USB-162
greggo

1
@Malvineous在12 MHz或仅1.5?对于12 Mhz,时钟周期为[83.33 +/- 0.2 us],对于1.5 MHz,时钟周期为[666.6 +/- 10 us]。请记住,您需要恢复接收时的时钟,这大概意味着采样至少是时钟速率的5-10倍。这些实现在与USB设备通信时是否允许中断?
greggo

8

快速浏览BCM2835数据表(http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf)第15章,看起来USB OTG支持硬件,因此从理论上讲,支持提议的方案可能只是软件问题。我不是USB协议专家(或者甚至不是新手),但是拥有此功能将非常酷。

查看BeagleBone(http://elinux.org/BeagleBone)的描述,它似乎支持类似的内容,尽管其中具体提到了支持此模式的连接器。如果Raspberry Pi仅由于选择了连接器而受到限制,那将是不幸的。

希望这会有所帮助。


2
即使SOC支持,模型B上的LAN9512集线器设备也可能会妨碍在设备模式下“向后”运行USB端口。在型号A上(或者如果卸下该型号并安装R37和R38),则可以将SOCs USB端口连接到外部插孔-但是,您将没有以太网,只有sdcard进行潜在的存储。
克里斯·斯特拉顿


4

不幸的是,尽管这看起来很简单,但据我所知,还没有完成。请参阅此线程和非常详细的答案以获取更多详细信息

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

还有一个关于Pi的特定答案http : //www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t =4938


1
感谢您的链接。看起来这台设备可能满足了我的要求,但是它是专有的,只能在一个方向上工作(虚拟只读USB存储设备)。
雅各布2012年

3

如果您不特别关心性能,则可能会获得具有USB功能的微控制器,并带有USB大容量存储代码(例如,您可以在价格为10美元的STM32F0发现评估模块上对STM32F103调试接口进行重新编程),然后小心地将其连接到pi的串行端口作为后端,并以数百公斤的价格运行。

通过以太网与客户端PC连接可能会获得更好的性能,但这将需要自定义驱动程序或对主机操作系统的不同表示-即,您将是网络连接的存储设备或共享服务器。

我相信已经提到了现成的文件传输电缆,但是这将需要用于客户端PC的适当软件以及对pi端的源级Linux驱动程序的支持。



3

我发现Arduino可以仿真USB设备,甚至可以直接使用Arduino Leonardo。所述LUFA USB协议栈可在Arduino的一起使用,并且实现了USB大容量存储设备驱动程序(参见本教程)。此设置可用于将USB映射到SCSI命令,例如SD卡读取器可以理解的命令。我对SCSI不太了解,但是看起来Raspberry Pi上的SD卡和USB-via-Arduino可以在同一总线上一起使用。确定这个主意不是完整的解决方案...


-1因为主题是Raspberry Pi而非Arduino。

1
我知道,这个答案不是完整的解决方案!我希望有关Raspberry Pi作为工具而不是目的本身的问题能够引起人们的关注,并且将其视野扩大到相关项目会有所帮助。在这种情况下,我发现了本教程如何将SD卡用作USB大容量存储设备。也许有人可以使用Arduino或另一ATMEGA32U4将USB连接到SIP总线,Raspberry Pi也可以使用它?
雅各布2012年

2
不,除了通过电气开关之外,您不能真正共享对sdcard的访问权限。一次只能有一个主机“装载”给定的文件系统(对于卡上使用的文件系统的类型-网络文件系统在这方面是不同的)。
克里斯·斯特拉顿

1

这归结为USB的工作原理,您可以看到,只要有两件事与USB连接,USB主机和USB设备就会以各种方式相继通过,并且永远不会切换位置。USB主机执行USB设备通常无法做的所有事情,以同步连接到USB总线的所有设备之间的数据传输。请查看USB维基百科页面以获取更多信息

您正在说的是强迫两个USB主机(Raspberry Pi和一台计算机)进行通信,不幸的是USB标准根本不支持这些主机。有些设备可以伪造两个USB主机之间的数据传输,但是正如Malvineous提到的,最好使用以太网。

您的问题特别提到使用Raspberry Pi模拟USB存储,但是您是否考虑过将Raspberry Pi设置为NAS?使用Raspberry Pi作为NAS盒基本上可以满足您的要求,但是如果不使用USB,它将使用您的网络。 如果您有兴趣,这是有关如何执行此操作的重要说明


感谢您的指导。所以我的问题是关于如何使用Raspberry Pi 实现USB设备。但是,NAS并非此问题的答案。
雅各布2012年

3
如果您希望Raspberry Pi能够成为USB设备,我建议您在ftdichip.com上对产品进行更多的研究,您将有可能连接使用Pi的GPIO引脚与FTDI芯片接口的电路板这将为您提供USB设备功能。您可能还需要编写驱动程序才能与FTDI设备通信。
Dan B

如果它们是USB OTG设备,则除外“吐温将切换位置” ...
克里斯·斯特拉顿

1

我可以使用库存的诺基亚内核随附的usb小工具驱动程序,使用旧的诺基亚N900电话来完成此操作。仿真设备的行为与真实设备完全相同,您甚至可以从该设备启动PC。


1
您能提供一些细节吗?您不是在谈论像大多数其他智能手机一样通过USB在手机上提供存储设备吗?据我了解,USB小工具驱动程序仅提供从SCSI到USB映射,因此仍然需要将SCSI映射到某些云存储API。
雅各布2012年

1

Pi Zero和Pi Zero W现在可用,并支持Gadget界面(Kernal.orglinux-sunxi.org),该界面允许几个不同的配置文件,包括USB Mass Storage和虚拟网络。

与OP的请求最接近的解决方案是使用Pi与主机PC之间的网络协议,然后使用从Pi到云/网络提供商的其他某种形式的网络协议。Pi Zero W内置了Wi-Fi,因此甚至可以直接连接到云/网络提供商。将这两个链接联网将是完成工作的最简单方法。有许多可用的网络协议和云提供商。

尝试使用USB海量存储将是一个坏主意;您将不得不在USB Mass Storage和Pi之间编写或重写驱动程序级别的适配。您可以从MTP开始,或者以类似的方式结束。MTP存在严重的性能问题(RedditXDAHowToGeekReddit),因此我建议使用网络方法。

在这个方向上应该有很多程序和项目。从Pi的角度来看,它就像文件服务器/同步服务器一样,因此任何类似的教程都可以帮助您入门。研究基于Pi的SeafileSyncthingSugarSyncOwnCloud服务器之类的东西应该可以帮助您入门。

Pi Zero作为USB小工具的一些实用指南:


0

USB标准基于主机。这意味着一个设备必须控制与所连接设备的所有通信。客户端可以是简单的设备或集线器。集线器是连接到该集线器的客户端的主机代理,并与其连接的主机(或集线器)进行通信。

正如USB的原始设计一样,您不能将两个主机(您的PC和RPi)连接在一起。

但是,USB On-The-Go有一些扩展,它允许USB连接查看它是连接到主机还是客户端,并据此调整其角色。为此,您必须在硬件方面获得支持。我不相信RPi旨在实现这一目标。

有关更多信息,请访问http://www.usb.org/home或什至http://en.wikipedia.org/wiki/Universal_Serial_Bus

简而言之,我不相信可以做到。


另一个答案与您缺乏OTG支持的说法相矛盾。
亚历克斯·张伯伦

1
@Alex,看看日期戳。Anders于2012年在Pi Zero或A +发布之前发布了此消息。
YetAnotherRandomUser17年

@YetAnotherRandomUser,看看日期戳。在安德斯发表评论的第二天,我发表了自己的回应。
亚历克斯·张伯伦

@AlexChamberlain,在2012年,Raspberry和Rasbperian(或我所知的任何其他软件)不支持该功能。是的,在那个时间范围内,我是对的。RPi Zero诞生了很多年……现在我们为RPi Zero提供了支持,正如您所写的那样,在另一篇文章中也提到了。
安德斯(Anders)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.