2015-06-24 3 views
3

Недавно я начал учиться писать драйверы устройств Linux для конкретного проекта, над которым я работаю. Раньше большая часть моей работы была связана с устройствами, не использующими ОС, поэтому драйверы и разработка Linux для меня несколько нова. Для проекта, над которым я работаю, у меня встроенная система под управлением операционной системы на базе Linux. У меня есть внешнее устройство с управлением через RS232, для которого мне нужно написать драйвер.Драйвер устройства Linux для устройства RS232 во встроенной системе

Вопросы:

1) Есть ли способ получить доступ к последовательным портам из жгутов пространства ядра (и, возможно, использовать serial.h, serial_core.h и т.д.), как это обычно делается, какие-нибудь хорошие примеры?

2) Из того, что я нашел, было бы намного проще получить доступ к последовательным портам в пользовательском пространстве, просто открыв dev/ttyS * и записывая на него. При написании драйвера для такого устройства (устройство RS232) предпочтительнее делать это в пользовательском пространстве или есть способ написать модуль ядра? Как принято решение написать драйвер в качестве модуля ядра поверх пользовательского пространства или наоборот?

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

+0

Ваше встроенное устройство работает без ОС хоста? (в этом случае не будет/dev/ttySx и, конечно же, не драйвер устройства, поддерживающий этот узел устройства) – wildplasser

+1

Возможно, вам не нужно писать никаких «ядро» * ядра * для этого последовательного устройства. Ядро выполняется в режиме привилегированного процессора и не должно подвергаться риску с ненужными функциями, которые принадлежат в пользовательском пространстве. Вы (должны) хотите, чтобы ваш код был переносимым, и это означает, что это пространство пользователя, где API-интерфейсы стабильны. Также вы, похоже, смущены тем, что делает «драйвер устройства RS232». Драйвер должен передавать только данные; он работает на физическом уровне. Он не должен анализировать или обрабатывать данные каким-либо образом (это для уровня данных или линии линии). – sawdust

+0

Если у вас/dev/ttyS *, то у вас ** уже есть драйвер устройства для UART. – DoxyLover

ответ

2

Существует несколько случаев, когда модуль, который обменивается данными через последовательный порт, может находиться в ядре. Протокол pppd (point-point protocol daemon) является одним из примеров того, что Linux имеет некоторый код ядра, посвященный этому, поскольку он является высокопроизводительным использованием серийного номера, и ему также нужно оборачиваться и помещать IP-пакеты в пространство ядра.

Большинство других применений будет работать лучше с пользовательского пространства, так как у вас есть хороший API, который уже выполняет множество ошибок, которые могут произойти. Это также уменьшает вероятность того, что ваши ошибки приведут к серьезному сбою системы.

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

Сначала я попытался сделать это из пользовательского пространства, а затем при необходимости переместиться в ОС. Даже если это необходимо переместить в драйвер уровня OS, вы, вероятно, сможете добиться определенного прогресса в пользовательском пространстве.

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