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

 
 
 
Reply to this topicStart new topic
> А как синхронизировать событие в драйвере и юзерский код?
DASM
сообщение Dec 11 2013, 17:51
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 11 2013, 18:37
Сообщение #2


Знающий
****

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



Цитата(DASM @ Dec 11 2013, 21:51) *
А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.


В том направлении, да
http://www.makelinux.net/ldd3/chp-6-sect-3

Сообщение отредактировал sasamy - Dec 11 2013, 18:38
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 12 2013, 13:31
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(DASM @ Dec 11 2013, 21:51) *
Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.


Драйвер это часть ядра. Все, что в ядре делают, то и в драйвере.
Go to the top of the page
 
+Quote Post
DASM
сообщение Dec 12 2013, 13:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Я не в том смысле. Ну ладно, дальше сам разберусь, главное что верной дорогой идем
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Dec 12 2013, 17:34
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Бывает сложнее, когда один драйвер должен пользоваться другим. Ну например, драйвер UART должен давать задание на DMA, причем DMA выполнен как большой независимый ресурс, а не какой-то там встроенный в UART дополнительный модуль.
Go to the top of the page
 
+Quote Post
Dvorkin
сообщение Jan 22 2014, 09:23
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 5-03-05
Из: Воронеж
Пользователь №: 3 094



Цитата(DASM @ Dec 11 2013, 21:51) *
Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.

Userspace application делает вызов ioctl(), передавая драйверу команду на начало DMA. И засыпает.
Драйвер, получив IOCTL, выполняет транзакцию, делает return, и Userspace application просыпается.
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 22 2014, 09:32
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Hoodwin @ Dec 12 2013, 21:34) *
Бывает сложнее, когда один драйвер должен пользоваться другим.

Это, как раз, тупо и просто - экспортируете функцию в одном драйвере, вызываете в другом. На то он и линукс, что драйвер может вызывать драйвера так, как ему хочется, а не только через недра ОС.


DASM, глянь, как это все в libusb 1.0 сделано, асинхронные вызовы, это примерно то, о чем ты спрашиваешь.

а на сколько я сам помню, то самый простой способ - FIONBIO, или fcntl c O_NONBLOCK
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 23 2014, 13:20
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



O_NONBLOCK это уже как ты сам ф-ции read write опишешь, а у меня их вообще нет. Ну вобщем мог бы, конечно, как и предполагал, использовать select, реализовав метод poll, но сделал еще проще - парочкой DECLARE_WAIT_QUEUE_HEAD и wait_event/wake_up(&dma_done_event);
То есть мой ioctl , который проверяет готовноть DMA - просто стал блокирующим и усыплет поток, пока ДМА не будет готова, что мне, в моем очень простом случае, и надо было.
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 23 2014, 13:27
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(DASM @ Jan 23 2014, 17:20) *
просто стал блокирующим и усыплет поток, пока ДМА не будет готова,


Ну так бы сразу и сказал, что это допустимо, ioctl сделать блокирующим. Я был почему-то уверен по вопросу, что это как раз недопустимо, а требуется асинхронный вызов. А так собственно все делают, на этом, к примеру v4l2 живет, ф-ция ожидания готовности очередного буфера с видео.
Go to the top of the page
 
+Quote Post

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

 


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


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