LINUX.ORG.RU

Аппаратная эмуляция USB Flash

 ,


0

1

Допустим, надо воткнуть в устройство некий USB-девайс, при этом чтобы устройство видело этот девайс как обычную USB флешку и могло бы ее подмонтировать и использовать. Но при этом у меня должна быть возможность менять байтики на этой недофлешке через другое устройство. Т.е. такая недофлешка может быть реализована как оперативка, запаянная в какую-то микросхему с двумя male USB проводами, в которую могут записывать одновременно два устройства, которые ее подмонтировали. Или чтобы ПК мог эмулировать сам USB накопитель. Есть уже что-то готовое, или подобное устройство надо с нуля разрабатывать? Как это лучше реализовать?

★★★★★

Тебе нужна эмуляция блочного устройства? Если твой носитель данных поддерживается подсистемой MTD, то есть mtdblock

annulen ★★★★★
()

Можно попробовать модуль ядра g_mass_storage (понятно что на устройстве которое это умеет).

yax123 ★★★★★
()

Да куча сейчас микроконтроллеров с USB.

HeipaVai1o
()
Ответ на: комментарий от annulen

Мне нужно устройство с двумя USB вилками. Одну вилку засовываю в устройство и оно думает что это флешка и работает с ней как флешкой. Другую всовываю в комп и с помощью специального софта эмулирую эту самую флешку, с возможностью менять байты на ней. Желательно чтобы это было уже готовое устройство с поддержкой линукса в качестве ОС которая может эмулировать и менять байтики на виртуальной флешке

SZT ★★★★★
() автор топика
Ответ на: комментарий от yax123

А при использовании этого g_mass_storage образ флешки можно менять с обеих сторон?

SZT ★★★★★
() автор топика

Есть dual port диски с интерфейсом SAS. Наверное можно к каждому SAS-порту такого диска подключить USB-to-SAS конвертер.

iliyap ★★★★★
()
Ответ на: комментарий от annulen

Ну как бы драйвер NFS понимает, что данные могут быть изменены третьими лицами, а значит нельзя всё подряд кешировать. А драйвер USB MSD понимает, что такого быть не может. И, соответственно, можно кешировать всё, что влезет в кеш. Опять же NFS в некотором плане является драйвером ФС (то есть поверх него не будет работать другой драйвер ФС). А поверх USB MSD будет работать какой-нибудь драйвер FAT или EXT4. Который опять же понимает, что никто кроме него не может изменить метаданные ФС, а значит их можно кешировать. Если ты сделаешь dd if=/dev/zero of=/dev/sdX && sync, то твои файлы из файлового менеджера никуда не пропадут, пока ты будешь ходить по каталогам, которые успели закешироваться драйвером ФС (главное не пытаться их открыть), хотя тут даже ядро в курсе, что теперь на диске одни нули, но драйвер ФС кеширует метаданные независимо от дискового кеша (а вот данные файлов ты уже не сможешь прочитать). А если данные будут изменяться аппаратно, то и дисковый кеш будет влиять.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

А поверх USB MSD будет работать какой-нибудь драйвер FAT или EXT4

Вот это по-серьезнее будет, «нижний» драйвер и подкостылить не проблема

annulen ★★★★★
()
Ответ на: комментарий от SZT

Похоже мне надо смотреть в сторону

Это именно то про что сказал я.
Там правда в лоб не получится одновременно одному читать, а другому писать.
Когда я это пробовал, у меня был небольшой раздел который я мог примонтировать к свой файловой системе (я говорю про устройство которое может прикидываться флешкой) и туда читать-писать. Для отдачи этого раздела внешнему устройству как флешки, нужно было его размонтировать и указать модулю g_mass_storage как параметр. После чего другой комп внезапно видел подключенную флеш которую опять же мог примонтировать.

То есть в один момент иметь доступ к этой области памяти с двух устройств не получится.

Есть второй замороченный вариант, но в силу его гибкости можно, что угодно делать (хоть на лету байты менять). Берем какую-нидь stm32f3/4disco отладочную плату. На ней есть 2 usb-порта. Вкорячивам прошивку которая эмулирует две флешки с общей памятью. В силу того, что все доступно в кодах можем делать любой мыслимый изврат. Только аккуратно все засинхронизировать. Причин почему это может не взлететь не вижу.

yax123 ★★★★★
()
Ответ на: комментарий от yax123

Там правда в лоб не получится одновременно одному читать, а другому писать. Когда я это пробовал, у меня был небольшой раздел который я мог примонтировать к свой файловой системе (я говорю про устройство которое может прикидываться флешкой) и туда читать-писать. Для отдачи этого раздела внешнему устройству как флешки, нужно было его размонтировать и указать модулю g_mass_storage как параметр. После чего другой комп внезапно видел подключенную флеш которую опять же мог примонтировать.

Ну значит надо мне разобраться в коде ядра и написать некий модуль с использованием этого usb gadget api, чтобы можно было менять байты на эмулируемой флешке во время работы.

Есть второй замороченный вариант, но в силу его гибкости можно, что угодно делать (хоть на лету байты менять). Берем какую-нидь stm32f3/4disco отладочную плату. На ней есть 2 usb-порта. Вкорячивам прошивку которая эмулирует две флешки с общей памятью. В силу того, что все доступно в кодах можем делать любой мыслимый изврат.

А готовые прошивки для этого уже есть? С тем же успехом можно под usb gadget api написать что-то подобное

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Ну значит надо мне разобраться в коде ядра и написать некий модуль с использованием этого usb gadget api, чтобы можно было менять байты на эмулируемой флешке во время работы.

Тут есть некая тонкость связанная с тем что нужна аппаратная поддержка. Я не уверен, что можно взять любой usb-порт на PC и сказать ему чтобы он вел себя как периферийное устройство. Нужно искать некий девайс где есть линукс и при этом usb-порт был рассчитан на подключение как периферии к PC. Как правило это всякие устройства на базе arm/mips и т.д. И может оказаться так что найти отладку на stm32 и написать для нее прошивку, будет проще чем найти подходящий дейвас с линуксом.

yax123 ★★★★★
()
Ответ на: комментарий от SZT

А готовые прошивки для этого уже есть?

Есть готовые прошивки где реализуется одна флешка. Развить ее на 2 флешки в одном корпусе и все.

yax123 ★★★★★
()
Ответ на: комментарий от yax123

Ну у меня один такой девайс есть. Электронная книга на базе линукса. Исходники ядра есть, root доступ есть. Да и многие (почти все наверно) телефоны на базе андроида умеют под флешку «маскироваться» при подключении к компу

SZT ★★★★★
() автор топика
Ответ на: комментарий от yax123

Есть готовые прошивки где реализуется одна флешка. Развить ее на 2 флешки в одном корпусе и все.

А не будет ли оно глючить при одновременном доступе? Мне б лучше сделать так: с одной стороны девайс видится как флешка, с другой стороны видится как нечто, чему надо дать доступ на запись и чтение к некоему файлу фиксированного размера на компе, и чтобы оно все обращения на чтения-запись на себя как на флешку транслировало в чтение-запись на тот файл.

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Ну у меня один такой девайс есть

отлично

Но при этом у меня должна быть возможность менять байтики на этой недофлешке через другое устройство

а это придется делать только через последовательный порт (вряд ли там еще какие-то доступные интерфейсы есть).

yax123 ★★★★★
()
Ответ на: комментарий от yax123

а это придется делать только через последовательный порт (вряд ли там еще какие-то доступные интерфейсы есть).

Хех, вообще-то есть. Только это будет мегакостыли. Там есть возможность слушать радио в FM диапазоне через наушники, соответственно есть возможность принимать FM сигнал и выводить некий звуковой через мини-джек. Уже двусторонний канал связи есть, через FM модулятор подаем данные на устройство, через мини-джек принимаем данные с устройства

SZT ★★★★★
() автор топика

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

ну и добавь сюда траблы с тем, как обычно работают с флэшем: в смысле, кэширование системы для уменьшения количества перезаписей

Для некоторых сценариев использования это совершенно не критично. Например если есть некий девайс который на флешку тупо записывает видео, а я вместо флешки цепляю этого «монстра» чтобы он эти операции записи на флешку упаковывал в ethernet фреймы и слал в сеть

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Уже двусторонний канал связи есть, через FM модулятор подаем данные на устройство, через мини-джек принимаем данные с устройства

хехех. Прикол в том, сигнал с радио никак не заводится в ядро. Так что только usart.

yax123 ★★★★★
()
Ответ на: комментарий от yax123

Ну это я сейчас проверю. Емнип там оно через v4l или v4l2 через /dev/radio0 работает

SZT ★★★★★
() автор топика
Ответ на: комментарий от yax123

Вообще, usart это слишком медленно. Можно попробовать припаяться к каким-нибудь GPIO на SoC-е (там стоит S3C2416 проц), соединить его с писишным LPT портом или с FT232 через USB и написать соответствующий софт... Но лучше наверное все с нуля делать, чем корежить девайс

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Да, /dev/radio есть

Вряд ли через fm-приемник просунешь больше 56Кб/с, так что uart на 115200 или даже 256Кбит/с выглядят очень заманчиво.

Можно попробовать припаяться к каким-нибудь GPIO на SoC-е (там стоит S3C2416 проц)

В BGA корпусе. У нас конечно есть мастера которые ко второму ряду шаров припаивали «зонды» (руками точили отдельные жилы от мгтф). Но чую таких спецов по пальцам одной руки можно пересчитать.

Раз все равно прогать, то проще уж взять нормальную подходящую железяку за $15 и сделать на ее базе конфетку.

yax123 ★★★★★
()
Ответ на: комментарий от Iron_Bug

Ну так можно просто слать их на ПК который подключен с другой «стороны» устройства. ПК будет хранить байты и иметь возможность их читать и подменять

SZT ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Опять же NFS в некотором плане является драйвером ФС (то есть поверх него не будет работать другой драйвер ФС).

А если я файл-образ из NFS подмонтирую через mount -o loop ? Вполне может

SZT ★★★★★
() автор топика

Допустим, надо воткнуть в устройство некий USB-девайс, при этом чтобы устройство видело этот девайс как обычную USB флешку и могло бы ее подмонтировать и использовать.

Реализовать USB Mass Storage device. Например в SDK к 13-евровой stm32discovery-f4 такое есть.

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

Это - мечта. Я тоже хочу в qemu гонять винду, и чтобы её ntfs-диск был примонтирован напрямую в линуксе. Так, для эффективного файлообмена. Но для этого кто-то должен написать драйвер, через который сама винда будет обращаться к винту, и который будет общаться с guestfs. Короче, кто будет синхронизировать доступ к псевдо-флешке? Или она будет без ФС и нужен просто raw-доступ к блокам?

Или чтобы ПК мог эмулировать сам USB накопитель.

Например, тот-же discovery-board или что угодно с USB OTG в режиме device (а не host). Смартфон с андроидом?

gag ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.