LINUX.ORG.RU

Читать устройство как файл

 , ,


0

1

Есть устройство, называемое программатором. Оно представляет собой флешку, которую можно открывать как файл. Управление устройством заключается в записывании байт в специальные места.

На Windows это делается просто через WinAPI («windows.h»).

Как это обычно делается в Linux? Насколько я помню, по работе с COM портом, необходимо где-то открыть последовательный файл, который создаётся после подключения устройства. Где именно? И какие функции необходимо использовать? Я понимаю что это какие-то версии функций read, write и т.д. Не могли бы вы дать ссылку на подходящие их версии? И существуют ли какие-то тонкости при этом? Буду благодарен за примеры.



Последнее исправление: AlexeyVorobyev (всего исправлений: 1)

если к флешке - то открываешь файл /dev/sdX (X тебе надо указать) и читаешь/пишешь, если RS-232 - QSerialPort и не мучай ни себя ни людей

dib2 ★★★★★
()
Последнее исправление: dib2 (всего исправлений: 1)

Как это обычно делается в Linux?

Открыть файл open(), закрыть — close(). Настроить параметры — ioctl(). Читать-писать — read() и write(). Самые обычные. Если нужно избегать буферизации, нужные флаги передаются в open().

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

В /dev. Скорее всего, это будет /dev/ttyACM0 или /dev/ttyUSB0.

И существуют ли какие-то тонкости при этом?

В отличие от обычных файлов, придётся настраивать скорости передачи и прочее через вызовы ioctl(). В остальном это такие же файлы. «Всё — файл», такие дела.

i-rinat ★★★★★
()

Где именно? И какие функции необходимо использовать?

Зависит от драйвера этого устройства. Обычно, как тебе уже сказали, если устройство последовательное, то работают как с обычным файлом, а если блочное, то если там поддерживаемая ФС её просто монтируют ( или можно написать свой велосипед для fuse), либо его обычно можно заммапить в память и работать просто как с участком памяти, ну и read/write тоже работают.

И существуют ли какие-то тонкости при этом?

Нужно рулить устройством через ioctl, причём некоторые устройства вообще понимают только такой режим работы, особенно если передача больших объёмов данных не нужна. Например я легко могу представить, что регистры/память программатора могут записываться через ioctl.

no-such-file ★★★★★
()

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

Боярского регги, блин, день.

Upd. о

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

К сожалению, ничего не получилось. Устройство без файловой системы. Определяется в /dev/sdb. При считывании буфер пустой. Есть ли ещё какие-нибудь способы?

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

Наверно, надо перед чтением настроить какие-то параметры устройства с помощью ioctl(). Но какие и как - зависит от устройства. Или, если есть драйвер устройства под Linux, то поставить его, тогда он возьмёт на себя управление устройством на низком уровне. В любом случае нужны мануалы от разработчиков устройства и драйвера (при его наличии).

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

Вдогонку: если мануалов и драйверов нет, а разработчики недоступны, то есть ещё один вариант, но он сложный и не всякому под силу: в дебаггере отследить, что посылает и получает от устройства windows-драйвер и сделать так же под Windows. Я знал человека, который, имея ноут с сенсорным экраном и кривой нерабочий драйвер linux для него, в дебаггере посмотрел, что этот драйвер передаёт и получает, нашёл ошибки в драйвере и по аналогии написал рабочий драйвер под QNX-4 безо всякой документации. Но это очень сильный программист, настоящий хакер в самом лучшем смысле этого слова.

aureliano15 ★★
()

avrdude его не поддерживает? Если работает поснифь обмен, что и куда пишет. Или даже через strace посмотри, что она делает с ним.

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

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

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