реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Драйвер для 6 UART на PCI шине, как быстрее поднять?
Hoodwin
сообщение Nov 21 2013, 21:43
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Имеется плата PCI, где на ПЛИС сделаны 6 UART с драйверами RS-232. Написана PCI функция, которая управляет шестью UART 16550A, тоже самописными. Все это более менее проверялось раньше по отдельности, но теперь вот есть желание запустить порты из-под линукс. Особенность платы в том, что она позволяет делать резервирование RS-232, то есть кроме самого UART 16550 каждый порт имеет логику, которая управляет выключением микросхемы соответствующего драйвера RS-232. Эта логика имеет определенные настройки, которые определяют правила отключения драйвера в зависимости от состояния внешних сигналов.

Все UART представляют собой стандартные 8 регистров, которые расширены нулями до 32-битных слов и размещены в одном BAR по смежным адресам.

Собственно интересует наиболее простой путь подружить линукс со всеми 6 портами. Пока представляются следующие способы:
1) Писать с нуля PCI драйвер ос своими PID, VID.
2) Подсмотреть готовые конфигурации UART в исходниках драйверов линукс, и изменить PID, VID своего устройства в соответствии с подходящим профилем из поддержаных.
3) Написать свой минидрайвер, который будет находить устройство на шине PCI и регистрировать его UART'ы как serial8250 platfrom_device. После чего его и линукс сам подхватит.

Если делать свой драйвер (модуль), то можно в нем зарегистрировать атрибуты портов, чтобы можно было настраивать правила его резервирования. Не уверен, можно ли это сделать, если пытаться подстроиться под существующий драйвер для шины PCI.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 22 2013, 01:09
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Вот посмотрите:
http://www.sealevel.com/support/article/AA-00525
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Nov 22 2013, 06:55
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Посмотрел. Пока ничего путного не вынес из документа. Пересобирать линукс не хотелось бы, так как у заказчика вообще что-то типа МСВС. И я не уверен, что он так просто сможет повторить его (пере)сборку. Зато есть свобода маневра с vendor id и device id. Можно на уровне устройства притвориться чем-то стандартным, для чего уже есть дескриптор в существующем драйвере PCI.

Кстати говоря, уже сейчас линукс пытается цапануть устройство как serial, видимо, на основе данных о классе устройства PCI. Но обламывается и выдает код -28 (ENOSPC?). Пока думаю, что причина в одном из:
1) Размер BAR не соответствует представлениям драйвера.
2) Размер регистра в PCI устройстве - 32 бита (сдвиг адреса 2), а по умолчанию драйвер ожидает 8 бит (сдвиг адреса 0).

Ну и собственно, остается открытым вопрос, как правильно сделать управление параметрами порта, не относящиеся непосредственно к UART? например, мне нужно для каждого порта делать некую настройку, какие внешние сигналы (из определенного набора) могут отключать сигнальный драйвер, чтобы резервный комплект не мешал основному. Явно надо какой-то модуль ядра писать. Например, был опыт с написанием мини-драйвера, который находил UART-ы на одной шине и регистрировал их на шине platform_bus. Вполне такая схема работает, и можно при регистрации определить заодно атрибуты устройства. В том проекте у меня были атрибуты для выбора дуплекса, и параметра управления передатчиком в RS-422/RS-485.

--
Да, так и есть, по умолчанию драйвер 8250_pci хочет регистрировать устройства с 8-битными регистрами. Отсюда и облом при регистрации устройства с 32-битными регистрами.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 22 2013, 12:33
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Но первый-то вариант без сборки кернела.

там вообще две команды с консоли на каждый интерфейс.
Go to the top of the page
 
+Quote Post
federal
сообщение Nov 22 2013, 15:09
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 74
Регистрация: 12-01-13
Из: Нижний Новгород
Пользователь №: 75 160



жаль мне заказчика
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Nov 22 2013, 15:59
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Естественно Вам придется писать свой драйвер, т.к. железка то нестандартная, "уровень" работы с PCI можно выдернуть из готовых, например для плат ST-Labs, исходники их драйверов можно скачать с офф.сайта.
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Nov 22 2013, 17:06
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Да драйвер-то написать можно, есть и свои драйверы для PCI устройств с DSP, вполне пойдут в основу. Тем более что нужен то мини-драйвер, который выдернет из платы адреса и зарегистрирует стандартные порты 8250. Я надеялся, что линукс сам может определить мультипортовый контроллер на основе данных PCI BAR и т.п., но поглядев исходники 8250_pci.c понял, что особенных чудес ждать неоткуда. В той версии ядра, которая стоит на отладочном стенде, вообще нет 6-портовых конфигураций, только степени двойки.
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Nov 22 2013, 18:57
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Цитата
Я надеялся, что линукс сам может определить мультипортовый контроллер

Он бы и определил, будь бы контроллер из семейства "стандартных", но Вы ведь сами указали что данный контроллер реализован на ПЛИС sm.gif
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Nov 22 2013, 19:07
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Дык на ПЛИС я как раз могу довольно просто переделать архитектуру, чтобы прикинуться "стандартным" устройством, только вот как изобразить 6 стандартных портов в одном устройстве? Ну хотя бы чтобы компорты проверить.
Go to the top of the page
 
+Quote Post
Methane
сообщение Nov 23 2013, 16:56
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(Hoodwin @ Nov 21 2013, 23:43) *
1) Писать с нуля PCI драйвер ос своими PID, VID.

Вот и напишите. Линух про резервирование ком портов не знает. Нет в модулях под линух совершенно ничего сложного.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 23 2013, 23:53
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



lspci показывает ваше устройство?

Если да
lspci -v
Результат опубликуйте здесь.
Какое прерывание используется (номер) для вашего первого (из шести) последовательного интерфейса?

Сообщение отредактировал Tarbal - Nov 24 2013, 00:13
Go to the top of the page
 
+Quote Post
gerber
сообщение Nov 24 2013, 07:36
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(Hoodwin @ Nov 22 2013, 22:07) *
Дык на ПЛИС я как раз могу довольно просто переделать архитектуру, чтобы прикинуться "стандартным" устройством, только вот как изобразить 6 стандартных портов в одном устройстве? Ну хотя бы чтобы компорты проверить.

Очень просто. Для этого Вам нужно, чтобы набор регистров каждого COM-порта вашей платы соответствовал набору стандартного 8250-контроллера, с байтовым смещением регистров. При этом не нужно "подделывать" VID/PID своей платы под другого производителя, достаточно вписать свои VID/PID в тот большой перечень PCI-UART плат, которые поддерживаются стандартным драйвером. Если правильно помню - этот список плат содержится в файле 8250_pci.c, там есть большой массив с описанием плат, для каждой платы задаётся VID/PID, номер BAR, адресный шаг между регистрами разных COM-портов, количество COM-портов, реализуемых PCI-платой.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Nov 24 2013, 19:47
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Да, в итоге действительно потратил полтора часа времени на изучение 8250_pci.c и написал модуль по мотивам оного. К сожалению, сам 8250_pci не подошел, так как в нем нет есть всего одна шестипортовая комбинация, а эвристика мультипортового устройства не цепляла мое устройство. Править стандартный 8250_pci не стал, так как 1) для этого потребуется все ядро пересобирать, что нежелательно; 2) требуется зарегистрировать дополнительные атрибуты устройства, позволяющие управлять внешним драйвером сигналов.

В итоге устройство поднялось и даже вчерне работает. Есть вопрос по поводу количества uart в драйвере 8250. Мой модуль регистрирует 6 портов, но регистрируются только первые два. В принципе это ожидаемо, если в ядре CONFIG_SERIAL_8250_RUNTIME_UARTS и CONFIG_SERIAL_8250_NR_UARTS слишком малы. Так вот:
1) можно ли как-то подсмотреть, с какими настройками собрано текущее ядро?
2) Можно ли как-то увеличить количество уартов без пересборки ядра? Нашел в сети, что можно в комстроке ядра писать 8250.nr_uarts=8, но вот тут http://forums.opensuse.org/english/get-tec...4-detected.html пишут, что это не помогло, и в итоге люди уродовались с пересборкой модуля UART.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 25 2013, 12:08
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(Hoodwin @ Nov 24 2013, 23:47) *
1) можно ли как-то подсмотреть, с какими настройками собрано текущее ядро?

cat /proc/config, если повезет.
zcat /proc/config.gz


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Methane
сообщение Nov 25 2013, 12:20
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(Dron_Gus @ Nov 25 2013, 14:08) *
cat /proc/config, если повезет.
zcat /proc/config.gz


Долго спали?

/boot/config-3.11.0-13-generic
версия - по аналогии.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 07:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016