Jump to content

    
Sign in to follow this  
vpd

Драйвер для 6 UART на PCI шине

Recommended Posts

Долго спали?

 

/boot/config-3.11.0-13-generic

версия - по аналогии.

Это сильно зависит от дистрибьютива. Если он туда что-то кладет - повезло. Автор ничего про это не сказал.

 

В Генту вообще можно сделать

cd /usr/src/linux

cat .config

Share this post


Link to post
Share on other sites

В общем вот что имеем:

# cat /boot/config-2.6.24-1-686 | grep 8250 | grep UART

CONFIG_SERIAL_8250_NR_UARTS=32

CONFIG_SERIAL_8250_RUNTIME_UARTS=4

 

а вот в /proc/ никакого намека на config нету.

Edited by Hoodwin

Share this post


Link to post
Share on other sites

---

Да, вот попробовал написать в комстроку ядра 8250.nr_uarts=8. Даже сработало. Получился такой лог:

ACPI: PCI Interrupt 0000:01:0b.0[A] -> GSI 23 (level, low) -> IRQ 22
0000:01:0b.0: Probing COMB6U PCI driver for 6 ports...
0000:01:0b.0: setup port df80, irq 22, type 0
0000:01:0b.0: ttyS4 at I/O 0xdf80 (irq = 22) is a 16550A
0000:01:0b.0: setup port df88, irq 22, type 0
0000:01:0b.0: ttyS5 at I/O 0xdf88 (irq = 22) is a 16550A
0000:01:0b.0: setup port df90, irq 22, type 0
0000:01:0b.0: ttyS6 at I/O 0xdf90 (irq = 22) is a 16550A
0000:01:0b.0: setup port df98, irq 22, type 0
0000:01:0b.0: ttyS7 at I/O 0xdf98 (irq = 22) is a 16550A
0000:01:0b.0: setup port dfa0, irq 22, type 0
0000:01:0b.0: ttyS2 at I/O 0xdfa0 (irq = 22) is a 16550A
0000:01:0b.0: setup port dfa8, irq 22, type 0
0000:01:0b.0: ttyS3 at I/O 0xdfa8 (irq = 22) is a 16550A

 

Видно, что все 6 UART-ов поднялись. Однако есть проблема с их порядком. Пока поднимались только первые два, то ttyS2 приходился на порт df80, а ttS3 - на порт df88. Теперь порядок другой, скажем прямо, не порядок. Вопрос: почему так? Регистрировал то я все это одним циклом тупо по порядку.

 

 

И еще вопрос. Существует ли в природе какой-нибудь тест для стандартного UART 16550 (для linux 2.6)? Интересен тест, который бы позволил по возможности наиболее полно протестировать UART. Можно даже с неким внешним loopback'ом для 9-контактного разъема D-Sub.

 

Есть один непонятный момент.

echo 123 > /dev/ttyS2

не выводит ничего, можно хоть 100 раз подряд такое выполнить.

echo 1234567890 > /dev/ttyS2

выводит все правильно.

cat Makefile > /dev/ttyS2

выводит все правильно и без потерь.

запуск bash </dev/ttyS2 >/dev/ttyS2 2>/dev/ttyS2 &

дает совершенно нормальную консоль, эхо идет на каждый введенный символ.

 

прямой вывод в обход драйвера - outb 0xdf80 0x21 - работает, как часы.

Однако

echo 123 > /dev/ttyS0 (порт на системной плате) все же работает.

В общем, хочется понять в чем тут дело.

 

Share this post


Link to post
Share on other sites
Видно, что все 6 UART-ов поднялись. Однако есть проблема с их порядком.

 

Можно указать через setserial какой угодно

http://linux.die.net/man/8/setserial

 

И еще вопрос. Существует ли в природе какой-нибудь тест для стандартного UART 16550 ... Можно даже с неким внешним loopback'ом для 9-контактного разъема D-Sub.

 

А что там тестировать ?

http://linux.die.net/man/1/minicom

Share this post


Link to post
Share on other sites

sasamy

 

Ну, вот раньше в CheckIT были тесты ком-портов, которые проверяли правильность работы UART-а. Например:

1) Правильность логики установки статусов внешних сигналов

2) Правильность работы механизмов RTS-CTS

3) правильность работы флагов прерываний на передачу, прием данных и таймаут приема,

4) Правильную работу регистров MSR, LSR.

5) Правильную работу контроля четности.

6) Отсутствие пропадания прерываний при скоростном обмене.

7) Точность бодового генератора.

 

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

 

К сожалению, я не смог найти внятного описания как правильно работать с FIFO в через драйвер 8250. Точнее, как управлять его настройками. Судя по коду, драйвер сам принимает решение об использовании FIFO, исходя из типа UART. Ну например, для стандртного UART 16550A выбирается FIFO threasholds 8 и все. Ни разу не видел, как через stty это скорректировать. И даже просто как посмотреть, то что есть по факту, не особо описано. В QNX и то куда более внятно было расписано.

Share this post


Link to post
Share on other sites
Ну, вот раньше в CheckIT были тесты ком-портов, которые проверяли правильность работы UART-а. Например:

 

Таких тестов скорей всего не найдете - если только у производителей многопортовых плат на сайтах рыть

 

7) Точность бодового генератора.

 

и типа можно верить этим измерениям ? лучше измерить осцилом - посылать в порт число 0x55 и смотреть частоту.

 

драйвер сам принимает решение об использовании FIFO, исходя из типа UART.

 

зачем пользовательским программам управлять размерами аппаратного FIFO - чтобы отключить, указываете тип уарта без FIFO (16450) в setserial.

Edited by sasamy

Share this post


Link to post
Share on other sites
Таких тестов скорей всего не найдете - если только у производителей многопортовых плат на сайтах рыть

Жаль, я думал, в линуксе подобные вещи есть.

 

и типа можно верить этим измерениям ? лучше измерить осцилом - посылать в порт число 0x55 и смотреть частоту.

Не вижу принципиальной разницы, чем мерить. Точность и стабильность бодового генератора не зависят от делителя, поэтому для измерений можно взять скорость ну хоть 9600. Но зато на такой скорости можно обеспечить выдачу подряд большого количества байт без зазоров, и измерив время передачи можно вполне точно измерить время одного бода. Осциллограф сам по себе довольно неточно меряет частоту, даже для периодического сигнала типа тактовой частоты он может выдавать значения с разбросом около 1%, если не больше.

 

зачем пользовательским программам управлять размерами аппаратного FIFO - чтобы отключить, указываете тип уарта без FIFO (16450) в setserial.

Ну вот, например, у нас был один проект, где протокол был так устроен, что передавались посылки по два байта, с периодом в 20-30 байтовых интервалов. В протоколе не было никаких признаков первого байта, за исключением того, что он первый после паузы. И вот когда сели делать через /dev/ser* (дело было под QNX), то выяснилось, что никак нельзя гарантировать синхронизацию по первым байтам. Тогда включили FIFO с порогом 4, и стали ловить прерывания по таймауту данных. С помощью этого прерывания синхронизацию удалось восстановить. Таким образом, аппаратные особенности UART вполне могут играть ключевую роль при программировании решения. Конечно, можно сказать, что берите и пишите для такого случая специальный драйвер. Можно было бы согласиться, однако в случае многопортового устройства появляется нюанс. Как поределить какой порт к какому драйверу приписывать. Обычно все порты автотматически цепляются каким-то одним драйвером.

Share this post


Link to post
Share on other sites
Как поределить какой порт к какому драйверу приписывать. Обычно все порты автотматически цепляются каким-то одним драйвером.

 

Драйвер будет один, но устройства разные. Драйвер всегда знает с каким устройством он работает в данный момент.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this