Libusb - это библиотека для взаимодействия с USB-устройствами таким же образом, как curses - это библиотека для взаимодействия с текстовыми терминалами, ALSA (точнее, ее компонент libasound) - это библиотека для взаимодействия с устройствами audi и т. Д. Ядро обрабатывает аппаратные взаимодействия. Он предоставляет файлы устройств , что приложения могут открывать для взаимодействия с аппаратными средствами, через read, writeи системные вызовы .ioctl
ioctl это системный вызов: он позволяет приложениям (пользовательскому коду) выдавать запросы, которые обрабатываются ядром.
Libusb позволяет приложениям регистрировать функции обратного вызова, которые выполняются, когда устройству есть, что сообщить. Вот приблизительный обзор потока информации под капотом:
Электрический сигнал на шине запускает событие на контроллере USB.
Контроллер USB генерирует сигнал прерывания на главном процессоре.
Процессор выполняет обработчик прерываний в ядре операционной системы.
Извещения ядра , что процесс находится в настоящее время в блокировании read, writeили ioctlсистемный вызов на файл устройства и причины, системный вызов к возвращению.
В процессе пользовательской земли, когда системный вызов возвращается, выполняется код библиотеки.
Код библиотеки выполняет функцию обратного вызова, зарегистрированную программистом приложения.
так нет необходимости писать драйверы устройств для USB-устройств? (если не возможно для оптимизации скорости)
Томас
@Thomas Вам нужно написать драйвер ядра, если вы хотите подключиться к инфраструктуре, которая не зависит от транспорта: клавиатура, хранилище, Ethernet и т. Д. В противном случае, я думаю, что вам нужен драйвер, только если задержка пользовательской программы слишком высока.
Жиль "ТАК ... перестать быть злым"
Если устройство не распознается компьютером (для него нет драйвера), все libusbравно будет доступ к нему?
Томас
@ Томас Я не знаю, сможет ли libusb справиться со всеми аспектами протокола USB, но в принципе да. Пользовательская программа может связываться с любым последовательным устройством RS232 через /dev/ttyS*. USB тот же принцип, только быстрее и сложнее.
Жиль "ТАК - перестань быть злым"
3
Linux использует два кольца, кольцо 0 называется уровнем ядра, кольцо 3 называется уровнем пользователя. Соединение пользователя с ядром осуществляется (как уже было сказано) через системные вызовы. Между ними находятся библиотеки, как видно из пользовательского пространства. Таким образом, самый низкий уровень доступа к ядру реализован в библиотеках по соображениям стабильности, безопасности, синхронизации, интервалов сохранения и так далее. Драйвер ядра предоставляет различные интерфейсы для пользовательского пространства: (ioctl, sysfs, сокеты, символьные и блочные устройства и т. Д.) Интерфейсы пространства пользователя . Поэтому, если вы хотите, вы можете реализовать свой доступ к драйверу ядра, не используя библиотеки, или значительно упростить компиляцию двоичного файла со статическими связанными библиотеками.
Хорошей отправной точкой является чтение исходных текстов libusb, они хорошо документированы.
Так что все работает так, как будто ядро создало специальный драйвер для неизвестных устройств, который принимает чтение и запись? Как мы узнаем о прерываниях и так далее?
libusb
равно будет доступ к нему?/dev/ttyS*
. USB тот же принцип, только быстрее и сложнее.Linux использует два кольца, кольцо 0 называется уровнем ядра, кольцо 3 называется уровнем пользователя. Соединение пользователя с ядром осуществляется (как уже было сказано) через системные вызовы. Между ними находятся библиотеки, как видно из пользовательского пространства. Таким образом, самый низкий уровень доступа к ядру реализован в библиотеках по соображениям стабильности, безопасности, синхронизации, интервалов сохранения и так далее. Драйвер ядра предоставляет различные интерфейсы для пользовательского пространства: (ioctl, sysfs, сокеты, символьные и блочные устройства и т. Д.) Интерфейсы пространства пользователя . Поэтому, если вы хотите, вы можете реализовать свой доступ к драйверу ядра, не используя библиотеки, или значительно упростить компиляцию двоичного файла со статическими связанными библиотеками.
Хорошей отправной точкой является чтение исходных текстов libusb, они хорошо документированы.
источник
Он использует syscalls (2) и файлы устройств, подготовленные ядром (
/dev/bus/usb/*
)источник