LINUX.ORG.RU

Очень нужен пример драйвера символьного устройства, реализующего метод «Poll»


0

1

Добрый день !

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

Вопрос вот в чем. Нужно добавить в драйвер метод «Poll», а в пользовательскую программу - функцию Select(), чтобы исключить ресурсоемкое циклическое чтение из устройства. Проблема в том, что я не могу найти цельного примера подобного драйвера. В третьей редакции книги «Драйверы устройств Linux» приводится только функция, реализующая сам метод «Poll», но если я вставляю ее в свой модуль, то он попросту перестает собираться. Если кто может, поделитесь, пожалуйста, примером такого модуля ...

только функция, реализующая сам метод «Poll», но если я вставляю ее в свой модуль, то он попросту перестает собираться.

почему? В смысле ты тупо его скопипастил?

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

Да. Я, вообще-то, начинающий, после написания десятка несложных пользовательских программ приступил к написанию драйверов. Разбираюсь в основном по указанной выше книжке. И все было более-менее ясно, пока не потребовалось реализовать poll/select. В книжке приводится только функция «poll». Если я вставляю ее в текст драйвера, он перестает собираться (естественно, я модифицировал структуру «file_operations», добавив в нее метод «poll»).

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

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» передавать нечего, и он передает «ноль» символов ...

kovigor
() автор топика

$cd <path_to_kernel_source>/drivers/ $find -name «*.[ch]» | xargs grep -E ".poll"

Ищи и выбирай...

Dennis7
()
Ответ на: комментарий от kovigor

zOMG!!!11 Срочно читать Documentation/CodingStyle.txt!!!!

anonymous
()

Драйвер rtc или какой-нибудь мыши.

Но сначала тебя следует расстрелять за rar и стиль кода.

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

Прошу прощения, я всего лишь начинающий, а совсем не профессиональный программист ...

P.S. Смотрю драйвер генератора случайных чисел. Попробую разобраться. Всем спасибо за помощь ...

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

Проверяй значения, возвращаемые функциями copy_(to|from)_user

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