Модель устройства Linux: то же устройство, но разные драйверы - PullRequest
0 голосов
/ 27 января 2011

Я настраиваю Linux для платы ARM9 Atmel AT91SAM960.

В файле устройства Atmel назвал все USART одинаковыми atmel_usart.Конечно, с перечислением идентификатора:

static struct platform_device at91sam9260_uart0_device = {
        .name           = "atmel_usart",
        .id             = 1,
        .dev            = { ...}
}

В соответствии с моделью устройства Linux все эти устройства (5 UARTS на SAM9260) будут привязаны к драйверу с именем atmel_usart.

Я не хочу устанавливать драйвер TTYS на всех UARTS, которые будут зарегистрированы.У меня есть несколько собственных драйверов, которые служат для различных специализированных целей (LON, RS-485 и т. Д.). Я хочу указать, какой драйвер служит определенному USART.Итак, что я мог сделать:

  • Файлы устройства Atmel неудовлетворительны, и я могу сделать это лучше.Поэтому я переименовываю (исправляю) устройства в файле устройства.Однако в случае, если я хочу драйвер TTYS на UART4, у меня будут проблемы.

  • Я манипулирую (исправляю) файл устройства, чтобы получить доступ к структурам platform_device.Я мог бы поменять их имена, прежде чем зарегистрировать их.Но насколько я понял идею Linux Driver Model , устройства должны быть зарегистрированы рано во время загрузки, но привязка к драйверу следует .... позже.

  • Я мог бы написать драйвер с псевдонимом, который был бы привязан к определенному bus_Id -> atmel_usart.4.Могу ли я на самом деле?

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

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

  • с драйвером Atmel-Serial (ttyS)
  • с моими собственными драйверами

Это также означает, что изменения в ядреисточник минимален.

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Я создал свои собственные линейные дисциплины водителей.Вы можете собрать их как модули ядра и прикрепить их к UART во время выполнения.Никаких изменений в исходном коде Linux не требуется.

Любые забавные временные или контрольные вещи можно выполнить с помощью ioctl ().В частности, я реализовал протокол RS-485, чувствительный ко времени.

Когда я делал это (Linux 2.6.17), не было никакого механизма динамической регистрации, поэтому я переписал существующие дисциплины линии.Код Linux довольно прост, и я был удовлетворен тем, что это будет безопасно.

0 голосов
/ 17 апреля 2011

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

at91_register_uart () вызывается из файла вашего форума для каждого UART, который необходимо зарегистрировать. at91_add_device_serial () будет затем platform_device_register всех тех, кого вы настроили. Одно из решений - разрешить вызов at91_register_uart () для всех 5 UARTS, но затем удалить вызов at91_add_device_serial () с вашей доски. Затем вы можете сделать это экспортированной функцией, которую могут вызывать загружаемые драйверы. Вы даже можете добавить к нему аргумент (int), чтобы вместо циклического выполнения всех UARTS вы могли выбрать, какие из них следует регистрировать по отдельности. Вы также можете отразить эту функцию, создав функцию, которая отменяет регистрацию устройств.

ПРИМЕЧАНИЕ. Я думаю, вам всегда нужно будет выделять один UART в качестве консоли, если вы используете его таким образом. Возможно, вы могли бы скрыть это в экспортируемой функции, разрешив индекс 0-> 3 только для ввода, а затем отобразив 0-> 3 на 0-4, пропустив UART, который вы хотите использовать для консоли.

...