Перейти к содержанию
    

А как синхронизировать событие в драйвере и юзерский код?

Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.

 

В том направлении, да

http://www.makelinux.net/ldd3/chp-6-sect-3

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.

 

Драйвер это часть ядра. Все, что в ядре делают, то и в драйвере.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не в том смысле. Ну ладно, дальше сам разберусь, главное что верной дорогой идем

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бывает сложнее, когда один драйвер должен пользоваться другим. Ну например, драйвер UART должен давать задание на DMA, причем DMA выполнен как большой независимый ресурс, а не какой-то там встроенный в UART дополнительный модуль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.

Userspace application делает вызов ioctl(), передавая драйверу команду на начало DMA. И засыпает.

Драйвер, получив IOCTL, выполняет транзакцию, делает return, и Userspace application просыпается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бывает сложнее, когда один драйвер должен пользоваться другим.

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

 

 

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

 

а на сколько я сам помню, то самый простой способ - FIONBIO, или fcntl c O_NONBLOCK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

O_NONBLOCK это уже как ты сам ф-ции read write опишешь, а у меня их вообще нет. Ну вобщем мог бы, конечно, как и предполагал, использовать select, реализовав метод poll, но сделал еще проще - парочкой DECLARE_WAIT_QUEUE_HEAD и wait_event/wake_up(&dma_done_event);

То есть мой ioctl , который проверяет готовноть DMA - просто стал блокирующим и усыплет поток, пока ДМА не будет готова, что мне, в моем очень простом случае, и надо было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

просто стал блокирующим и усыплет поток, пока ДМА не будет готова,

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...