Как написать драйвер ядра Linux для UART?
Через UART я получаю непрерывный и асинхронный поток данных: главная задача здесь — не пропустить какие-либо данные. p>
Я использую serdev (http://events17.linuxfoundation.org/sit ... 2017-2.pdf) для получения входящих данных внедрение получения_buf в драйвере. Примечание. Я понятия не имею, как получить номер IRQ, связанный с этим IRQ получения_buf (в противном случае я, вероятно, мог бы использовать потоковое IRQ, как описано позже).
Теперь, в ядре Linux Драйвер, я знаю о механизмах IRQ и верхней-нижней половины: короче говоря, когда срабатывает IRQ, верхняя половина запущенного обратного вызова должна обрабатывать все, что может быть обработано быстро (чтобы сделать прерывание возможным снова как можно скорее, чтобы не пропустить входящие данные) и делегируйте остальную работу нижней половине (которая будет запущена позже).
Для нижней половины, AFAIU, существуют различные возможные механизмы: threadedirq, рабочие очереди , softirq, тасклет. Softirq и Tasklet, похоже, станут кандидатами на прекращение поддержки в ближайшем будущем https://lwn.net/Articles/960041/, поэтому я оставил их позади. Кажется, что рабочие очереди позволяют помещать в очередь только один рабочий элемент за раз, поскольку функцияqueue_work из API возвращает false, если работа уже была в очереди, поэтому я не совсем уверен, смогу ли я использовать эту очередь накапливать по 1 рабочему элементу для каждого фрагмента данных. Наконец, мне кажется, что threadedirq является лучшим кандидатом, но для создания threadedirq нужен номер IRQ: как объяснялось выше, я не понимаю, как получить его от serdev.
Какой путь является «хорошим или предпочтительным»?
Используя serdev, как я могу инициализировать threadedirq из get_buf перезвонить (т.е. как получить IRQ, связанный с этим обратным вызовом)? AFAIU, это был бы лучший путь, верно?
Есть ли другие варианты?
Есть ли пример, с которого я мог бы начать? (не нашел)
Я использую raspberrypi с ядром 6.1.x.
Подробнее здесь: https://stackoverflow.com/questions/791 ... r-for-uart
Как написать драйвер ядра Linux для UART? ⇐ Linux
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение