Доступ к последовательному порту из модуля ядра Linux - PullRequest
11 голосов
/ 21 марта 2011

Здравствуйте, гуру драйвера ядра Linux!

Я пишу драйвер v4l2 для камеры, которая использует последовательный интерфейс для конфигурации.Я бы хотел, чтобы драйвер настраивал камеру, так как он поддерживает код клиента для всех моделей камер.Вопрос в том, каков наилучший способ получить доступ к последовательному интерфейсу камеры из модуля драйвера?

Из того, что я слышал, доступ к файлам из драйвера ядра - это большая проблема, но это можно сделать.Таким образом, в настоящее время я использую следующий фрагмент кода, но это похоже на хак.

oldfs = get_fs();
set_fs(KERNEL_DS);

fd->f_pos=0;
fd->f_op->write(fd, data, data_len, &fd->f_pos);

set_fs(oldfs);

Мой вопрос действительно: как правильно это сделать?

Ответы [ 2 ]

5 голосов
/ 06 апреля 2011

Я предполагаю, что поскольку задействован последовательный порт, это должна быть какая-то встроенная система.В конце концов, не многие ПК даже имеют последовательные порты.Я также предполагаю, что последовательный порт можно считать постоянным соединением, по крайней мере, с точки зрения пользователя.Если это все правда, то вам не нужно устройство TTY.Вы хотите получить доступ к устройству как к частному UART.

Если вы посмотрите на аудиокодеки Wolfson (sound / soc / wm * .c), вы увидите пример устройств, которые в основном обмениваются данными через I2S, ноиметь вспомогательный интерфейс I2C для конфигурации.Это концептуально то, что вы хотите, я считаю.Драйвер представляет унифицированный интерфейс для программного обеспечения и выдает команды для любого оборудования, которое подходит.Очевидно, что это намного чище, чем необходимость раскрывать детали реализации аппаратного обеспечения в пространстве пользователя.

Я не смог найти хороший пример драйвера UART в ядре, который работает таким образом, но, надеюсь, я описал, что искатьза.С практической, а не с технической точки зрения чистоты может быть лучше выполнить файловый ввод-вывод из ядра.

1 голос
/ 22 марта 2011

Во-первых, я бы посоветовал вам найти способ сделать это из пространства пользователя, если это возможно: то, чего вы пытаетесь достичь, это на самом деле код пространства пользователя в коде ядра.

Но если вы не найдете способДля этого в этой статье показано, как выполнять вызовы пространства пользователя в пространстве ядра.

Поскольку вы хотите получить доступ к последовательному порту, у вас должны быть вызовы, ориентированные на tty, например, для open:

serial_fd = sys_open("/dev/ttyS0",  O_RDWR | O_NOCTTY | O_NONBLOCK))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...