|
|
  |
А как синхронизировать событие в драйвере и юзерский код? |
|
|
|
Jan 22 2014, 09:23
|
Участник

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

|
Цитата(DASM @ Dec 11 2013, 21:51)  Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании. Userspace application делает вызов ioctl(), передавая драйверу команду на начало DMA. И засыпает. Драйвер, получив IOCTL, выполняет транзакцию, делает return, и Userspace application просыпается.
|
|
|
|
|
Jan 22 2014, 09:32
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Hoodwin @ Dec 12 2013, 21:34)  Бывает сложнее, когда один драйвер должен пользоваться другим. Это, как раз, тупо и просто - экспортируете функцию в одном драйвере, вызываете в другом. На то он и линукс, что драйвер может вызывать драйвера так, как ему хочется, а не только через недра ОС. DASM, глянь, как это все в libusb 1.0 сделано, асинхронные вызовы, это примерно то, о чем ты спрашиваешь. а на сколько я сам помню, то самый простой способ - FIONBIO, или fcntl c O_NONBLOCK
|
|
|
|
|
Jan 23 2014, 13:20
|
Гуру
     
Группа: Свой
Сообщений: 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 - просто стал блокирующим и усыплет поток, пока ДМА не будет готова, что мне, в моем очень простом случае, и надо было.
|
|
|
|
|
Jan 23 2014, 13:27
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(DASM @ Jan 23 2014, 17:20)  просто стал блокирующим и усыплет поток, пока ДМА не будет готова, Ну так бы сразу и сказал, что это допустимо, ioctl сделать блокирующим. Я был почему-то уверен по вопросу, что это как раз недопустимо, а требуется асинхронный вызов. А так собственно все делают, на этом, к примеру v4l2 живет, ф-ция ожидания готовности очередного буфера с видео.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|