Изучаю написание драйверов по книге "Linux device drivers". И в то же время смотрю в готовый исходник опроса драйвера АЦП. В связи с чем возник вопрос: хоть в кгиге и описан метод ожидания готовности данных(poll), можно ли те же функции(ожидание готовности данных) выполнить посредствам ioctl, передавая в качестве третьего арогумента указатель.
но зачем ?? есть стандартные ф-ции (poll/select)- зачем городить непонятно что ? какую задачу вы не можете решить используя стандартные методы (poll/select + read) ?
Дело в том что я изучаю чужой исходник комерческого проекта, и там чтение производится путём ioctl(ioctl принимает в качестве аргумента указатель, который по всей видимости и указывает на блок данных, которые прочитаны). Вот и ломаю голову, зачем.
Попутно есть ещё один вопрос, я решил задать его здесь дабы не городить много тем.
Хочу забирать данные в драйвере во внутренний буфер по внешнему прерыванию, в книге "Linux device driver" это описано очень хорошо. Но я не пойму как задать номер прерывания (наверное это есть в даташите, но я пока не смог найти) и условия, если на AT91SAM9XE512 я хочу использовать прерывание IRQ1 по неспадающему фронту.
Хотя номер прерывания, думаю, должен быть отображён в виде макроса IRQ1. А вот как быть с ниспадающим фронтом - незнаю.
если нет исходника драйвера, то остаётся только догадываться как читаются данные из устройства путём ioctl, НО!
если кроме ioctl в приложении ничего нет для чтения данных (указателя), то, вероятно, в драйвере используется DMA а в приложении используется ioctl, через которые юзерспейс просит драйвер замапить ему в адресное пространство dma-буфер. Мапится в драйвере через io_remap_pfn_range.
А я еще через рт-сигналы посылал сразу по готовности данные в свой юзерспейс. Понятное дело, что перед этим при старте юзерспейса я передавал пид в драйвер. Наверное подход для извращенцев, но интересно поиграться со всякими разными механизмами чтобы выбрать наиболее эффективный-удобный в том или инном конкретном случае. Можно передавать обычный сигнал без данных, а данные уже вычитывать при приходе такого сигнала.
Думаю селект-полл неплохой вариант. И конечно же разбирайтесь в вашем случае. Кстати, кроме ЛДД3 (или ЛДД2) могу посоветовать вот это
Essential Linux device drivers, Author: Venkateswaran, Sreekrishnan
Если знаете немецкий то еще и http://www.amazon.de/gp/product/3898646963/ref=oh_details_o00_s00_i00
У меня обе книжки в бумажном виде с библиотеки взятые, поэтому где скачать поищите. Будет как дополнение к достаточно непростой и не совсем удобной ЛДД3.