5.1 Драйвер последовательного порта в Linux |
Предыдущая Содержание Следующая |
Драйвер последовательного порта в Linux тесно связан с подсистемой TTY. Уровень TTY является отдельным классом символьного устройства. На встраиваемых системах, имеющих последовательный порт, уровень TTY используется для предоставления доступа к низкоуровневому последовательному порту. Часто встраиваемая плата может иметь больше, чем один последовательный порт; обычно другие порты могут использоваться для коммутируемого доступа с использованием таких протоколов, как PPP или SLIP. Часто задаётся вопрос, должны ли в таком случае быть предоставлены разные драйверы последовательных портов. Ответ: нет, так как TTY отделяет драйвер последовательного порта от приложения, так что может быть предоставлен один драйвер последовательного порта, вне зависимости от того, как он используется. Пользовательский процесс не общается с драйвером последовательного порта напрямую. TTY представляет собой стек программного обеспечения над драйвером и экспортирует всю функциональность через устройства TTY. Подсистема TTY разделяется на три слоя, как показано на Рисунке 5.2. Как показывает Рисунок 5.2, каждое устройство, взаимодействующее с подсистемой TTY, связано с дисциплиной линии, которая решает, как передаваемые или принимаемые данные обрабатываются низкоуровневым драйвером. Linux предлагает дисциплину линии по умолчанию N_TTY, которая может быть использована для того, чтобы использовать в качестве стандартного терминала последовательный порт. Но дисциплины линий также могут использоваться для реализации более сложных протоколов, таких как X.25 или протокол PPP/SLIP.
Рисунок 5.2 Подсистема TTY.
В Linux пользовательские процессы обычно имеют управляющий терминал. Управляющий терминал это то, где процесс принимает ввод, и то, где осуществляет стандартный вывод и куда перенаправляются ошибки. TTY и управление процессами автоматически заботятся о назначении и управлении управляющими терминалами. (* Процессы могут предпочесть работать без управляющего терминала. Такие процессы называются службами (daemon, демонами). Службы используются для запуска задач в фоновом режиме после отключения от управляющего терминала, чтобы они не пострадали, когда терминал закрывается.) Существует ещё один набор устройств TTY, которые используются во встраиваемых системах. Это виртуальные или псевдо-TTY устройства (PTY). PTY являются мощным средством межпроцессного взаимодействия. Процессы, использующие псевдо-TTY получают все преимущества межпроцессного взаимодействия и подсистемы TTY. Например, подсистема Telnet на Linux использует псевдо-терминал для связи между telnetd (главной службой Telnet) и процессом, который является порождением telnetd. По умолчанию количество псевдо-терминалов TTY установлено в 256; оно может быть изменено на меньшее число из-за его ограниченного использования во встраиваемых системах. Теперь обсудим реализацию в Linux драйвера последовательного порта. В ядре версии 2.4 структурой данных, используемой для подключения последовательного драйвера к подсистеме TTY, является tty_driver. Драйвер последовательного порта заполняет эту структуру такой информацией, как название устройства, старший/младший номера и всеми необходимыми интерфейсами, требуемыми вводом-выводом TTY и уровнем дисциплины линии для обращения к драйверу последовательного порта. В версии 2.4 функции, экспортируемые в уровень TTY от драйвера последовательного порта, содержит файл drivers/char/generic_serial.c; он может быть использован для подключения к уровню TTY вашего низкоуровневого драйвера последовательного порта. В ядре версии 2.6 уровень драйвера последовательного порта был очищен, так что перенос нового драйвера последовательного порта в Linux становится проще. Драйвер последовательного порта больше не должен беспокоиться о вызовах TTY; вернее, это выполняет уровень абстракции. Это делает работу по написанию драйвера последовательного порта легче. Этот раздел объясняет, как на новой платформе может быть написан драйвер последовательного порта. Путь есть вымышленное оборудование UART MY_UART со следующими функциональными возможностями:
▪Простая логика передачи и приёма; один регистр для передачи данных и один регистр для получения данных ▪Допустимые настройки скорости 9600 или 19200 бод ▪Для оповещения о конце передачи или приёма данных используется прерывание ▪Оборудование имеет только один порт UART (то есть, оно однопортовое)
Мы предполагаем, что макрос, показанный в Распечатке 5.1, уже доступен для доступа к оборудованию. Также эти макросы предполагают, что регистры и буферы отображаются начиная с базового адреса MY_UART_BASE. Мы также предполагаем, что BSP для этой конкретной платы уже сделал это отображение, так что мы можем начать эффективно использовать адрес MY_UART_BASE. Тем не менее, мы не обсуждаем поддержку драйвером модема; это выходит за рамки данного раздела. Сначала мы обсудим конфигурацию устройства. В файл drivers/serial/Kconfig добавляем следующие строки:
config MY_UART select SERIAL_CORE help Test UART driver
Затем в drivers/serial/Makefile добавляем следующую строку:
obj-$(CONFIG_MY_UART)+= my_uart.o
Опция конфигурации выбирает, чтобы файл my_uart.c был скомпилирован вместе с drivers/serial/serial_core.c. Файл serial_core.c содержит общие процедуры UART, которые взаимодействуют с TTY и модулями дисциплины линии. В дальнейшем универсальный уровень UART, реализованный в serial_core.c, упоминается как ядро UART.
|
Предыдущая Содержание Следующая |