Меню Рубрики

Работа с usb под linux

Программирование USB в Linux

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

С общими принципами организации работы с USB можно познакомиться в работах Павла Агурова, а здесь будет рассмотрена только одна простая схема, комментирующая принцип работы с любым USB-устройством. В простейшем виде USB-устройство можно представить как некую древовидную структуру, включающую в себя «Конфигурации» (configurations), «Интерфейсы» (interfaces) и «Конечные точки» (endpoints).

«Конечная точка» устройства — это программная сущность, у которой есть свой уникальный идентификатор и которая может иметь буфер с некоторым числом байтов для приема-передачи информации. Но чтобы добраться до нее, приложению (под управлением хоста) нужно программным путем пройти через уровни «Устройства», «Конфигурации» и «Интерфейса». Каждый из них описывается стандартной программной структурой, и есть возможность выбирать, какие именно интерфейсы следует использовать, чтобы попасть в требуемую конечную точку.

Важная особенность USB — наличие только одного Мастера (ведущего), которым обычно является компьютер. Само USB-устройство всегда отвечает на разные запросы компьютера, о чем бы ни шла речь и в какую бы сторону ни передавалась информация.

Разработчик может написать полноценный драйвер для работы со своим USB-устройством, применяя уже имеющийся в системе заголовочный файл linux/usb.h.

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

Драйвер, написанный для поддержки USB-устройства, призван решать следующие задачи:

  • регистрация и удаление драйвера;
  • регистрация и удаление устройства;
  • обмен данными с устройством.

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

А как быть, если нет времени писать драйвер, но надо срочно создать программу, работающую с USB-устройством, которая сама будет решать, как, когда и с каким из таких устройств ей работать? Да к тому же хотелось бы, чтобы она легко переносилась на другие платформы (Windows, Mac OS и т.д.) хотя бы с минимальными изменениями в тексте или вовсе без них.

При этом ее требуется писать на Паскале или даже на С#. Возможно ли это? Вполне. Но для этого необходима библиотека libusb (http://www.libusb.org/). Если в дистрибутиве Linux нет такого «зверя» (ничего не отображается в ответ на команду locate libusb.so), то существует несколько путей:

  1. поставить этот пакет с помощью штатного инсталлятора, к примеру, для Fedora написать в консоли: yum install libusb;
  2. самостоятельно скачать RPM-пакет (http://sourceforge.net/projects/libusb/) и попробовать его установить;
  3. скачать пакет «исходников» (http://sourceforge.net/projects/libusb/files/) и собрать на своей машине библиотеку.

Важное замечание. На сайте libusb.org выложены две ветки проекта — версии 1.0 и 0.1. В статье описана работа со старой стабильной версией, по этому будьте внимательны: при использовании версии 1.0, есть расхождения в API.

Чтобы понять, имеются ли в системе устройства, соответствующие USB-интерфейсу, можно, например, воспользоваться утилитой usbview (http://usbview.sourceforge.net) либо ее продвинутым аналогом — usbview2 (http://usbview2.sourceforge.net/), хотя в любом современном Linux найдутся встроенные консольные команды для таких целей.

В этой статье мы ограничимся основами и попробуем разобраться в алгоритме создания аналогичной программы для просмотра устройств USB, только работать она будет в консоли.

А за основу мы возьмем простую программу вот отсюда — http://www.linuxquestions.org/linux/answers/Programming/Developing_Linux_Device_Drivers_using_Libusb_API. Внесем в нее русские комментарии и откомпилируем в режиме программы С++. При этом в настройках компилятора укажем на использование библиотеки libusb.so (листинг 1).

Как видно, этот пример полностью соответствует описанной ранее логической схеме — мы начинаем работу с общего перебора устройств и заканчиваем конкретными логическими точками. В данном примере идет простой перебор всего, что содержится в системе и что имеет отношение к USB. Но так делать необязательно. Для работы с конкретным устройством нас может интересовать определенный код изготовителя продукта (idVendor) и код продукта (idProduct). Если в этом примере уже указанный заголовочный usb.h заменить на , то это будет уже совсем другая библиотека, которую используют для создания полноценных (непереносимых на другие типы систем) драйверов в среде Linux.

Аналогичный пример нетрудно найти в Сети для языка Free Pascal, а значит, несложно написать собственную графическую утилиту, аналогичную usbview, и в среде Lazarus (http://www.lazarus.freepascal.org/).

Для этого потребуется скачать файл libusb.pp (например, здесь http://www.sciencetronics.com/download/fpc_libusb.tgz).

Фрагмент программы, написанной в Lazarus для чтения списка устройств USB (листинг 2) представлен на стр. 58.

Итак, мы выяснили, что в нашем распоряжении языки Си, C++ и Паскаль. Но это не предел, рассмотрим простой пример на языке С# (листинг 3).

В данном примере (который успешно запускается в среде Linux с помощью платформы Mono) для доступа к библиотеке libusb.so применяется специальная .NET-обертка под названием #USBlib. Разработчики утверждают, что она одинаково подходит как для libusb.so, так и для своего собрата, функционирующего под управлением Windows (http://libusb-win32.sourceforge.net/). Кстати, важно отметить, что наборы функций libusb-win32 и libusb совпадают, а особые платформенные различия указаны в документации. Это и есть основное достоинство библиотеки libusb — блестящая платформенная переносимость исходного кода.

В заключение стоит напомнить, что та конкретная задача, над которой мы трудились, используя разные языки и инструментарии, — вывод списка устройств USB, решается в Linux с помощью встроенных команд

Источник

Как примонтировать флешку в Linux

В наши дни очень большую популярность у пользователей набрали USB флешки. Они используются для обмена файлами, различными фильмами и документами, установки операционных систем, а также восстановления системы после сбоя. Чтобы работать с флешкой в Linux ее нужно примонтировать в корневую файловую систему.

Дело в том, что организация файловой системы Linux немного отличается от того, что мы привыкли видеть в Winodws. Здесь нет никаких дисков C,D,E и так далее, есть только корень, самая верхняя точка файловой системы, в подкаталоги которой подключаются все жесткие диски и внешние носители.

Если в системе используется окружение рабочего стола, то оно, как правило, берет на себя всю низкоуровневую работу чтобы выполнить монтирование флешки в linux. Система обнаруживает подключенную флешку и в системном лотке всплывает уведомление о подключенном устройстве. Дальше остается кликнуть по значку флешки, чтобы система выполнила все нужные для ее монитрования действия. Но если окружение рабочего стола не запущенно или вам нужно работать в консоли можно выполнить все действия по монтированию флешки вручную.

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

Монтирование флешки в Linux

Самое первое, что нужно сделать после того, как вы подключили флешку — узнать имя ее файла в системе. В Unix все устройства имеют свои файлы и именно через эти файлы система и программное обеспечение взаимодействуют с ними.

Файлы флешек и других устройств хранения данных находятся в каталоге /dev. Устройства нумеруются по алфавиту sda, sdb, sdc, sdd и т д. Так как флешка подключается последней у нее будет старшая буква. Например, sdb или sdc. Имя sda принадлежит жесткому диску. Можно, конечно, просто посмотреть содержимое каталога /dev/, но такой способ ненадежный. Мы воспользуемся утилитой fdisk.

Подключите флешку и выполните:

Как видите, здесь мы можем посмотреть детальную информацию об устройстве. Имя файла, список разделов, формат таблицы разделов, список разделов. А главное для нас, размер раздела и его файловую систему. Теперь не сложно понять какая из них флешка. В этом примере это /dev/sdc1

Создаем папку для монтирования:

Теперь монтируем флешку с помощью команды mount:

sudo mount /dev/sdc1 /mnt/usb

Если знаете файловую систему флешки, то лучше ее указать с помощью опции -t. Чаще всего используется FAT, так как ее легко открывают как Windows так и Linux системы:

sudo mount -t vfat /dev/sdc1 /mnt/usb

Монтирование осуществляется от суперпользователя, но если нужно чтобы отмонитровать флешку мог любой нужно указать опцию users:

sudo mount -t vfat -o users /dev/sdc1 /mnt/usb

По умолчанию владельцем файлов на флешке при монтировании устанавливается root, поэтому если вы захотите работать с флешкой через файловый менеджер, то нужно будет его запускать с правами суперпользователя или же сразу примонтировать флешку в linux таким образом, чтобы владельцем был ваш пользователь. Для этого укажите группу и id своего пользователя в опциях uid и gid:

sudo mount -o users,uid=1000,gid=1000 /dev/sdc1 /mnt/usb

Удостовериться что флешка подключена можно посмотрев содержимое каталога, в который мы ее монтировали:

Или выполнив команду mount:

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

sudo umount /dev/sdc1

Автоматическое монтирование флешки в Linux

Популярные окружения рабочего стола выполняют монтирование флешки linux автоматически, как только она подключена к системе или по клику на ярлыке. Мы можем это реализовать с помощью службы udisks2.

Udisks — это служба dbus, позволяющая другим программам и пользователю взаимодействовать с udev. Мы можем получать сообщения о только что подключенных устройствах, выполнять их монтирование и отключение. Окружения рабочего стола используют именно этот сервис для монтирования устройств.

Мы тоже можем использовать его для ручного монтирования. Здесь даже есть несколько плюсов. Во-первых, мы можем монтировать без прав суперпользователя, во-вторых, не нужно создавать папку.

Для монтирования используется такая команда:

udisksctl mount -b /dev/sdc1

Здесь /dev/sdc1 — файл нашей флешки, а опция -b указывает, что нужно монтировать блочное устройство. Так же как и в mount здесь можно задать опции монтирования -o и файловую систему -t. Флешка будет примонтирована в папку /run/имя_пользователя/uuid-флешки/

Для размонтирования используется аналогичная команда:

udisksctl unmount -b /dev/sdc1

Автоматическое монтирование usb флешки в linux можно настроить с помощью утилиты udiskie. Все новые подключенные флешки будут автоматически подключаться, после подключения устройства будет всплывать окно с предложением открыть файловый менеджер, а также значок, с помощью которого можно получить доступ к каждому из устройств.

Устанавливается утилита в Ubuntu командой:

sudo apt install udiskie

Дальше остается запустить программу:

Теперь все подключаемые устройства будут автоматически монтироваться с помощью udisks. Рассмотрим что значат опции:

  • -a — выполнять автоматическое монтирование
  • -n — показывать всплывающее уведомление
  • -t — показывать значок в трее.

Выводы

Теперь монтирование флешки linux не вызовет у вас проблем. Даже если у вас не будет работать окружение рабочего стола и придется делать все вручную. Если остались еще вопросы, спрашивайте в комментариях.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Работа с postgresql linux
  • Работа с pdf в linux
  • Работа с lvm разделами linux
  • Работа с linux разделами в windows
  • Работа с linux консолью