Перейти к содержанию
    

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

Долго спали?

 

/boot/config-3.11.0-13-generic

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

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

 

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

cd /usr/src/linux

cat .config

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

# 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 нету.

Изменено пользователем Hoodwin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

---

Да, вот попробовал написать в комстроку ядра 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 (порт на системной плате) все же работает.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видно, что все 6 UART-ов поднялись. Однако есть проблема с их порядком.

 

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

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 и то куда более внятно было расписано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

 

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

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как поределить какой порт к какому драйверу приписывать. Обычно все порты автотматически цепляются каким-то одним драйвером.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...