Linux с использованием драйвера внутри драйвера

Я пытаюсь подключиться к микроконтроллеру из моего Linux-бокса через последовательный порт RS232.

Я написал драйвер и реализовал протокол b/n pc и микроконтроллер, который использует устройство tty(/dev/ttyS0), уже присутствующее в ядре в качестве модуля (например, через вызовы open, close и т. д.). Однако, когда я пытаюсь скомпилировать, он говорит, что не может найти ссылку для открытия, записи, чтения и т.д.

Как мне просто использовать существующий драйвер устройства из драйвера? Есть ли что-то еще, что мне нужно включить?

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

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/cdev.h>
#include <linux/spinlock.h>
#include <linux/termios.h>
#include <linux/fcntl.h>
#include <linux/unistd.h>

person user623879    schedule 09.05.2011    source источник


Ответы (1)


Обычно вы должны делать это в пользовательском пространстве - реализовывать протокол вашего устройства в обычной программе пользовательского пространства.

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

Вы не можете вызывать произвольные библиотечные функции из ядра или вообще любые библиотечные функции (кроме библиотек, которые фактически поставляются как часть ядра). Сюда входят системные вызовы ядра. Существуют эквивалентные функции, которые можно вызвать, например, filp_open.

В большинстве случаев вы не можете просто вызвать обычный системный вызов из ядра, так как они ожидают, что указатели будут указывать на данные пользовательского пространства, но в ядре ваши (выделенные через kalloc и т. д.) обычно будут указывать на данные пространства ядра. Два не могут быть свободно смешаны.

person MarkR    schedule 09.05.2011
comment
Драйвер PPP делает это, используя так называемую дисциплину последовательной линии, которая представляет собой некую специфическую магию ttyS. Технически можно открывать fd и выполнять системные вызовы для них из контекста ядра. Но зачем тебе такое? - person datenwolf; 03.01.2012