Добрый день !
Написал простейший драйвер символьного устройства, который при обращении к нему посредством функции "read()" при наличии данных в устройстве возвращает некоторый символ, а при отсутствии данных - возвращает "ноль" символов.
Далее, я написал пользовательскую программу, читающую данные из устройства, которая циклически вызывает функцию "read()". Если эта функция возвращает символ, то он выводится на экран и программа завершается, если же при чтении было получено "ноль" символов, то происходит очередной виток цикла, и т.п. Все это проверено и работает.
Вопрос вот в чем. Нужно добавить в драйвер метод "Poll", а в пользовательскую программу - функцию Select(), чтобы исключить ресурсоемкое циклическое чтение из устройства. Проблема в том, что я не могу найти цельного примера подобного драйвера. В третьей редакции "Драйверы устройств Linux" приводится только функция, реализующая сам метод "Poll", но если я вставляю ее в свой модуль, то он попросту перестает собираться.
Если кто может, поделитесь, пожалуйста, примером такого модуля ...
Дополнение от 19.04.2012Вот исходные тексты драйверов:
http://zalil.ru/33101144Там два файла. Первый - драйвер без "Poll", проверенный и работающий. Второй - тот же драйвер, но со вставленной из книжки функцией "Poll" и модифицированной структурой "file_operations".
Небольшое пояснение. Драйвер устанавливает обработчик прерывания от одной из линий ввода/вывода некоторого микропроцессора. Если прерывание произошло, то драйвер устанавливает флажок "does_gpio_interrupt_detected" - признак того, что ему есть что передать пользовательской программе в ответ на ее вызов "read()" из представляемого драйвером символьного устройства. Если теперь пользовательская программа вызывает функцию чтения "read()", то драйвер возвращает ей символ "i" (т.е., "interrupt" - драйвером было зарегистрировано прерывание), после чего сбрасывает флажок "does_gpio_interrupt_detected" и ждет очередного прерывания. Если же прерываний не было, то флажок "does_gpio_interrupt_detected", естественно, сброшен, драйверу в ответ на "read" передавать нечего, и он передает "ноль" символов ...