2011-05-09 4 views
2

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

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

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

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

#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> 

ответ

0

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

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

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

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

+0

Драйвер PPP делает это, используя так называемую «последовательную линейную дисциплину», которая представляет собой некоторую магию ttyS .... Технически можно открыть fds и сделать syscalls на них из контекста ядра. Но зачем вам это делать? – datenwolf

Смежные вопросы