Как Raspberry Pi может эмулировать USB-накопитель?

46

USB-устройства хранения данных, такие как USB-накопители и жесткие диски, обычно используются для подключения внешнего хранилища к любому типу компьютеров. Как Raspberry Pi может эмулировать USB-накопитель? Самым простым приложением был прямой доступ к SD-карте через USB, но можно также обеспечить доступ к файлам через Ethernet. Я подумал о следующем макете для « USB-флешки »:

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

Компьютер должен видеть только обычную флешку для чтения и записи файлов. Raspberry Pi будет выступать в качестве программируемого моста, который отображает списки каталогов и доступ к файлам для запроса в облачное хранилище. Вы можете получить доступ к хостерам облачного хранилища с любого компьютера (включая медиаплееры черного ящика) через USB, не устанавливая на компьютер никакого дополнительного программного обеспечения . USB-мост Raspberry Pi также должен иметь возможность шифровать / дешифровать файлы на лету, чтобы можно было хранить файлы, зашифрованные в облаке, и получать к ним доступ на любом устройстве, например на обычном USB-накопителе.

Изменить: Существующие продукты с аналогичными, но ограниченными функциями включают Wireless Media Stick и USB-через сеть . Доступ к файлам в облаке может быть возможен путем подключения виртуального хранилища с помощью облачного диска или аналогичного программного обеспечения и шифрования с помощью TrueCrypt или EncFS - пароли будут храниться только на SD-карте Raspberry Pi, но доступ к хранилищу можно получить с любого компьютера без необходимости введите пароль на ненадежном компьютере.

Jakob
источник
1
Я думаю, что он хочет иметь раздел или общую папку на своем Pi, который можно подключить через USB на других машинах. Идея заключается в том, что вы можете подключить raspi к любому компьютеру, и эта папка / раздел работает как флэш-накопитель и может быть записана без какого-либо дополнительного программного обеспечения.
wmarbut
3
Pi должен действовать только как шлюз между любым компьютером, включая черные ящики, и, например, облаком Amazon. Шлюз также может шифровать файлы на лету.
Якоб
1
Отбрось это - это было бы идеально!
Алекс Чемберлен
1
@AlexChamberlain - нет, вы не можете. Устройства USB Mass Storage имеют определенный протокол, который поддерживается операционной системой хоста. Конечно, вы можете создать драйвер, чтобы сделать что-то еще похожим на устройство хранения данных для конкретной операционной системы, но это будет не «USB Mass Storage», а «пользовательское устройство хранения, подключенное через USB»
Крис Стрэттон
1
@ppumkin: потому что для «подключения диска» или «подключения к локальной сети» требуется настроить компьютер (или медиаплеер). Простое подключение к USB-порту не требует какого-либо администрирования и не нужно предоставлять пароли для ПК. Обратите внимание, что я хочу использовать общий доступ к хранилищу с облачного диска, для которого всегда требуются пароли или даже установка клиентского программного обеспечения.
Якоб

Ответы:

12

Проблема в том, что USB-соединение Pi с ПК не имеет подключенных контактов данных - только контакты питания. Таким образом, вы не можете использовать это, чтобы говорить по USB, потому что он не подключен.

Ваша единственная опция с Pi - «бит бит» USB с помощью выводов GPIO, но это очень медленно и потенциально ненадежно. Я подозреваю, что вы действительно сможете эмулировать клавиатуру или мышь - все, что с более высокой пропускной способностью, вероятно, будет слишком большим для процессора, учитывая жесткие временные требования, предъявляемые к битам, например USB.

Другой альтернативой было бы найти устройство, которое позволит вам соединить два компьютера вместе через USB, чтобы создать своего рода сеть. Но тогда вы можете просто использовать соединение Ethernet ...

Malvineous
источник
1
Ранее я играл с GP32, который может вести себя как хост, даже если он подключен к концентратору в качестве клиента. Если Raspberry может вести себя как хост на USB-портах (не силовой), то подобная хитрость должна быть возможна и там. Возможно, USB-to-go может это сделать?
Турбьёрн Равн Андерсен
2
А? Вы ошибаетесь из-за порта micro-usb, используемого для адаптера питания. А как насчет 2 правильных портов USB? С помощью некоторого программного обеспечения эмуляции можно было бы подключить этот USB к ПК и эмулировать хранилище - например, телефон Android, когда вы подключаете USB. - Но для этого нет причины, потому что вы подключаете Pi к своей сети, делитесь своей «облачной» папкой через samba или что-то еще (Wi-Fi или локальную сеть), а также одновременно синхронизируете свое облако с тем, что вы хотите сделать. , ЛВС может обрабатывать много запросов на различных портах
Петр Кула
2
@ppumkin: Почему я ошибаюсь из-за порта micro-USB? Контакты данных не подключены, поэтому вы не можете отправлять через них данные. Последующие «правильные» USB-порты являются «хостовыми» портами, поэтому их невозможно подключить к ПК без какого-либо конверторного устройства в середине. Программной эмуляции недостаточно, потому что работает протокол USB. Возможно, вы думаете об Ethernet, где вы можете соединить любые два устройства вместе, но USB не работает так. Если вы мне не верите, ознакомьтесь со спецификацией USB, особенно с информацией о хостах USB и периферийных устройствах.
Malvineous
1
Просто хотел добавить, что «бит-грохот» USB не вариант. USB - это длинный, длинный путь от чего-то вроде I2C, который может быть побит битом. Возможно, наиболее практичный подход - использовать один из тех AVR micros, в которые встроен порт USB-устройства, а затем связываться с ним через последовательный порт Pi. (например, olimex.com/Products/AVR/Proto/AVR-USB-162 )
Грегго,
1
@ Malvineous На 12 МГц или только 1,5? Тактовый период составляет [83,33 +/- 0,2 мкс] для 12 МГц и [666,6 +/- 10 мкс] для 1,5 МГц. Имейте в виду, что вам нужно восстановить часы при получении, что, по-видимому, означает выборку, по крайней мере, в 5 - 10 раз превышающую тактовую частоту. Разрешают ли эти реализации прерывания во время разговора с USB-устройствами?
Грегго
8

Основываясь на кратком ознакомлении с таблицей данных BCM2835 (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf), похоже, что USB OTG поддерживается в HW, так что теоретически, это может быть просто вопросом SW, чтобы поддержать предложенную схему. Я не эксперт по протоколу USB (или даже новичок), но было бы неплохо иметь такую ​​функциональность.

Глядя на описание BeagleBone (http://elinux.org/BeagleBone), кажется, что он поддерживает нечто подобное, хотя есть конкретное упоминание о разъеме, который поддерживает этот режим. Было бы прискорбно, если Raspberry Pi ограничен только из-за выбора разъема.

Надеюсь, это полезно.

Дон кристенсен
источник
2
Даже если SOC поддерживает это, устройство-концентратор LAN9512 на модели B, вероятно, будет мешать запуску USB-порта «назад» в режиме устройства. На модели A (или, если вы удалите ее и установите R37 и R38), вы можете подключить USB-порт SOCs к внешнему разъему - но тогда у вас не будет Ethernet, а будет только SD-карта для потенциального хранилища.
Крис Страттон
6

Теперь это представляется возможным с помощью PiZero - см. Http://pi.gbaman.info/?p=699 .

Дэвид Уолтерс
источник
1
Добро пожаловать в Raspberry Pi! Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Ганима
4

К сожалению, хотя это кажется простым, насколько я могу судить, это не было сделано. Смотрите эту тему и очень подробный ответ для более подробной информации

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

И конкретный ответ Pi здесь: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938

wmarbut
источник
1
Спасибо за ссылки. Похоже, что это устройство может выполнять часть того, что я хочу, но оно является фирменным и работает только в одном направлении (виртуальное USB-хранилище только для чтения).
Якоб
3

Если вас не особо беспокоит производительность, вы, возможно, могли бы получить микроконтроллер с поддержкой USB с кодом USB-накопителя (например, вы можете перепрограммировать интерфейс отладки STM32F103 на модуле eval обнаружения STM32F0 за 10 долл.), Осторожно подключив его к последовательному порту pi. в качестве задней части, и работает на несколько сотен килобод.

Скорее всего, лучшая производительность будет достигнута за счет взаимодействия с клиентским ПК через Ethernet, но для этого потребуется пользовательский драйвер или другое представление для операционной системы хоста, т. Е. Вы будете подключенным к сети устройством хранения или общим сервером.

Полагаю, что уже были упомянуты готовые кабели для передачи файлов, но для этого потребовалось бы соответствующее программное обеспечение для клиентского ПК и поддержка драйвера linux на уровне источника для pi-конца.

Крис Страттон
источник
Ага. См. Также olimex.com/Products/AVR/Proto/AVR-USB-162
greggo
3

Я узнал, что Arduino может эмулировать USB-устройство, Arduino Leonardo даже из коробки. Стек USB LUFA может быть использован на Arduino и реализует драйвера запоминающего устройства USB (см этот учебник ). Эту настройку можно использовать для сопоставления команд USB и SCSI, например, для считывателя SD-карт. Я не знаю достаточно о SCSI, но похоже, что SD-карта на Raspberry Pi и USB-через-Arduino могут использоваться вместе на одной шине. Конечно, эта идея не является полным решением ...

Jakob
источник
-1 Так как тема про Raspberry Pi, а не Arduino.
1
Я знаю, этот ответ не является полным решением! Я надеюсь, что эти вопросы о Raspberry Pi как о инструменте, а не о самоцели, являются актуальными и помогают расширить представление о связанных проектах. В этом случае я нашел этот урок, как использовать SD-карту в качестве запоминающего устройства USB. Может быть, можно использовать Arduino или другой ATMEGA32U4 для подключения USB к шине SIP, которая также доступна на Raspberry Pi?
Якоб
2
Нет, вы не можете на самом деле поделиться доступом к SD-карте, кроме как с помощью электрического переключения. Только один хост может «монтировать» заданную файловую систему за раз (для типов файловых систем, используемых на картах - сетевые файловые системы в этом отношении различны).
Крис Страттон
1

Это сводится к тому, как работает USB, вы видите, что когда с USB связаны две вещи, есть все способы, чтобы USB-хост и USB-устройство никогда не переключались между собой. USB-хост делает все, что не могут делать устройства USB, в основном для синхронизации передачи данных между всеми устройствами, подключенными к шине USB. Проверьте страницу википедии USB для получения дополнительной информации .

Вы говорите о том, чтобы заставить два USB-хоста (Raspberry Pi и компьютер) общаться, что, к сожалению, просто не поддерживается стандартом USB. Есть некоторые устройства, которые могут имитировать передачу данных между двумя USB-хостами, но, как упомянул Malvineous, вам лучше использовать Ethernet.

В вашем вопросе конкретно упоминается использование Raspberry Pi для эмуляции USB-накопителя, но рассматривали ли вы возможность настройки Raspberry Pi в качестве NAS? Использование Raspberry Pi в качестве устройства NAS в основном делает то, что вы просили, но вместо использования USB оно будет использовать вашу сеть. Вот отличные инструкции о том, как это сделать, если вы заинтересованы.

Дэн Б
источник
Спасибо за указатели. Поэтому мои вопросы о том, как реализовать USB-устройство с помощью Raspberry Pi. NAS, однако, не является ответом на этот вопрос.
Якоб
3
Если вы хотите, чтобы Raspberry Pi имел возможность быть устройством USB, я советую вам исследовать продукты на ftdichip.com с большей вероятностью, вы сможете подключить плату, которая использует контакты Pi GPIO Pi для взаимодействия с чипом FTDI. и это даст вам возможность устройства USB. Возможно, вам также потребуется написать драйвер для связи с устройством FTDI.
Дан Б
За исключением того, что «двое должны поменяться местами», если они являются устройствами USB OTG ...
Крис Страттон,
1

Я могу сделать это со своим старым телефоном Nokia N900, используя драйвер USB-гаджета, входящий в состав стандартного ядра Nokia. Эмулируемое устройство ведет себя точно так же, как реальное, вы даже можете загрузить с него ПК.

Nyg
источник
1
Не могли бы вы предоставить некоторые детали? Вы говорите не о том, чтобы просто обеспечить память на вашем телефоне через USB, как это делают большинство других смартфонов? Насколько я понимаю, драйвер USB-гаджета обеспечивает только сопоставление между SCSI и USB , поэтому все равно необходимо сопоставить SCSI с некоторым API облачного хранилища.
Якоб
1

Pi Zero и Pi Zero W теперь доступны и поддерживают интерфейс гаджетов ( Kernal.org , linux-sunxi.org ), позволяющий использовать несколько различных профилей, включая USB Mass Storage и виртуальные сети.

Наиболее близкое решение для запроса OP состоит в том, чтобы использовать сетевой протокол между Pi и хост-ПК, а затем некоторую другую форму сетевого протокола от Pi до поставщика облачных / сетевых услуг. Pi Zero W имеет встроенный Wi-Fi, поэтому может даже напрямую подключаться к облачному / сетевому провайдеру. Объединение в сеть этих двух ссылок будет самым простым способом выполнить работу. Есть много сетевых протоколов и облачных провайдеров.

Попытка использовать USB Mass Storage была бы плохой идеей; вам придется написать или переписать адаптацию на уровне драйвера между USB Mass Storage и Pi. Вы либо начинаете с MTP , либо получаете что-то подобное. MTP имеет серьезные проблемы с производительностью ( Reddit , XDA , HowToGeek , Reddit ), поэтому я предлагаю сетевой подход.

В этом направлении должно быть много программ и проектов. С точки зрения Pi, он просто действует как сервер файлового сервера / синхронизации, поэтому любой подобный учебник должен помочь вам начать. Изучите такие вещи, как серверы Seafile , Syncthing , SugarSync и OwnCloud на основе Pi .

Несколько полезных руководств по Pi Zero в качестве USB-гаджета:

YetAnotherRandomUser
источник
0

Стандарт USB основывается на хосте. Это означает, что одно устройство должно контролировать всю связь с подключенными устройствами. Клиенты могут быть простым устройством или концентратором. Концентратор является прокси-сервером для клиентов, подключенных к концентратору, и связывается с хостом (или концентратором), к которому он подключен.

Как выглядит оригинальный дизайн USB, вы не можете соединить два хоста вместе (ваш компьютер и RPi).

Тем не менее, существуют расширения USB On-The-Go , которые позволяют USB-подключению видеть, подключено ли оно к хосту или клиенту, и в зависимости от этого регулировать его роль. Чтобы это работало, вы должны иметь поддержку в оборудовании. Я не верю, что RPi предназначен для этого.

Для получения дополнительной информации, смотрите http://www.usb.org/home или даже http://en.wikipedia.org/wiki/Universal_Serial_Bus

Короче говоря, я не верю, что это можно сделать.

Андерс
источник
Другой ответ противоречит вашему замечанию о поддержке OTG.
Алекс Чемберлен
1
@ Алекс, посмотрите на штампы с датами. Андерс опубликовал это в 2012 году, до того, как Pi Zero или A + стали доступны.
Ещё один случайный пользователь
@ YetAnotherRandomUser, посмотрите на отметки даты. Я отправил свой ответ на следующий день после того, как Андерс написал свой комментарий.
Алекс Чемберлен
@AlexChamberlain и в 2012 году не было поддержки для Raspberry и Rasbperian (или любого другого программного обеспечения, о котором я знаю). Так что да, в эти сроки я был прав. RPi Zero появился много лет спустя ... Теперь у нас есть поддержка для RPi Zero, которая упоминается в другом посте, как вы написали.
Андерс