DASM 0 11 декабря, 2013 Опубликовано 11 декабря, 2013 · Жалоба Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 9 11 декабря, 2013 Опубликовано 11 декабря, 2013 (изменено) · Жалоба А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании. В том направлении, да http://www.makelinux.net/ldd3/chp-6-sect-3 Изменено 11 декабря, 2013 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 12 декабря, 2013 Опубликовано 12 декабря, 2013 · Жалоба Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании. Драйвер это часть ядра. Все, что в ядре делают, то и в драйвере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 12 декабря, 2013 Опубликовано 12 декабря, 2013 · Жалоба Я не в том смысле. Ну ладно, дальше сам разберусь, главное что верной дорогой идем Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vpd 0 12 декабря, 2013 Опубликовано 12 декабря, 2013 · Жалоба Бывает сложнее, когда один драйвер должен пользоваться другим. Ну например, драйвер UART должен давать задание на DMA, причем DMA выполнен как большой независимый ресурс, а не какой-то там встроенный в UART дополнительный модуль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dvorkin 1 22 января, 2014 Опубликовано 22 января, 2014 · Жалоба Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании. Userspace application делает вызов ioctl(), передавая драйверу команду на начало DMA. И засыпает. Драйвер, получив IOCTL, выполняет транзакцию, делает return, и Userspace application просыпается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 22 января, 2014 Опубликовано 22 января, 2014 · Жалоба Бывает сложнее, когда один драйвер должен пользоваться другим. Это, как раз, тупо и просто - экспортируете функцию в одном драйвере, вызываете в другом. На то он и линукс, что драйвер может вызывать драйвера так, как ему хочется, а не только через недра ОС. DASM, глянь, как это все в libusb 1.0 сделано, асинхронные вызовы, это примерно то, о чем ты спрашиваешь. а на сколько я сам помню, то самый простой способ - FIONBIO, или fcntl c O_NONBLOCK Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 23 января, 2014 Опубликовано 23 января, 2014 · Жалоба O_NONBLOCK это уже как ты сам ф-ции read write опишешь, а у меня их вообще нет. Ну вобщем мог бы, конечно, как и предполагал, использовать select, реализовав метод poll, но сделал еще проще - парочкой DECLARE_WAIT_QUEUE_HEAD и wait_event/wake_up(&dma_done_event); То есть мой ioctl , который проверяет готовноть DMA - просто стал блокирующим и усыплет поток, пока ДМА не будет готова, что мне, в моем очень простом случае, и надо было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 23 января, 2014 Опубликовано 23 января, 2014 · Жалоба просто стал блокирующим и усыплет поток, пока ДМА не будет готова, Ну так бы сразу и сказал, что это допустимо, ioctl сделать блокирующим. Я был почему-то уверен по вопросу, что это как раз недопустимо, а требуется асинхронный вызов. А так собственно все делают, на этом, к примеру v4l2 живет, ф-ция ожидания готовности очередного буфера с видео. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться