реклама на сайте
подробности

 
 
> Linux. Очень нужен пример драйвера символьного устройства, реализующего метод "Poll", Пересмотрел кучу материалов, а примера не нашел
kovigor
сообщение Apr 18 2012, 18:04
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Добрый день !

Написал простейший драйвер символьного устройства, который при обращении к нему посредством функции "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" передавать нечего, и он передает "ноль" символов ...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
sasamy
сообщение Apr 20 2012, 19:52
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(kovigor @ Apr 18 2012, 22:04) *
Вопрос вот в чем. Нужно добавить в драйвер метод "Poll", а в пользовательскую программу - функцию Select(), чтобы исключить ресурсоемкое циклическое чтение из устройства. Проблема в том, что я не могу найти цельного примера подобного драйвера.


Вот тут посмотрите
http://rus-linux.net/MyLDP/BOOKS/Moduli-ya...-mod-index.html
то что вас интересует
http://rus-linux.net/MyLDP/BOOKS/Moduli-ya...-mod-05-07.html

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

Сообщение отредактировал sasamy - Apr 20 2012, 20:02
Go to the top of the page
 
+Quote Post
kovigor
сообщение Apr 21 2012, 18:37
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(sasamy @ Apr 20 2012, 22:52) *
Вот тут посмотрите
http://rus-linux.net/MyLDP/BOOKS/Moduli-ya...-mod-index.html
то что вас интересует
http://rus-linux.net/MyLDP/BOOKS/Moduli-ya...-mod-05-07.html

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


Спасибо, я уже решил задачу - добавил в драйвер символьного устройства метод "Poll", а в пользовательской программе вызываю функцию "Select()", которая усыпляет пользовательскую программу, если не было прерываний от GPIO. В обработчике прерывания от GPIO (этот обработчик входит в состав драйвера моего символьного устройства) вызываю функцию "wake_up_interruptible()", которая будит пользовательское приложение при возникновении прерывания. И уже разбуженное пользовательское приложение вызывает функцию чтения байта данных по I2C и функцию "ioctl()". Книжку Цилюрика читал, и еще очень много всего читал. Но разобраться по ней не смог. Зато здорово помог исходник драйвера genrtc.c - по нему удалось понять, как должен выглядеть метод "Poll".
А вообще, больше всего мне помогли консультации коллег-программистов, без них я бы решал эту задачу еще, наверное, неделю, не меньше ...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016