|
|
www.lissyara.su
—> статьи
—> FreeBSD
—> Шелезяки
—> NetMos NM9845
Мультипортовая плата (шесть com-портов) под FreeBSD
Автор: lissyara.
Понадобилось (для модемного пула - на специализированную железку контора не разориться - вот и лепим из чего есть) полтора десятка com-портов на одном компе. Закупили две платы неизвестной конструкции и производителя. На чипах написано "MosChip semiconductor - MCS9845CV" - по 6 портов на каждой. Поставили в старый сервак (там стояли исовые мультипортовые платы - в жизни таких не видел, сами порты выводились шлейфом типа IDE-шного на отдельную плату), тока его это не спасло - как глючило, так и продолжало. Назрело решение - пора менять win2000, что там стоял пять лет (на компе постоянно подключенном к инету!) на что-то более существенное. Собрали другой сервак, накатил FreeBSD6.1, тут и началось веселье - ункновн девайс:
pci0: <simple comms, UART> at device 10.0 (no driver attached)
| Ладно, это победилось влёт - пересборкой ядра (можно подгрузить модуль) с такой опцией:
После перезагрузки, получили такую картину в dmesg:
puc0: <NetMos NM9845 Quad UART> port 0xd400-0xd407,0xd800-0xd807,0xdc00-0xdc07,
0xe000-0xe007,0xe400-0xe407,0xe800-0xe80f irq 11 at device 10.0 on pci0
sio4: <NetMos NM9845 Quad UART> on puc0
sio4: type 16550A
sio4: unable to activate interrupt in fast mode - using normal mode
sio5: <NetMos NM9845 Quad UART> on puc0
sio5: type 16550A
sio5: unable to activate interrupt in fast mode - using normal mode
sio6: <NetMos NM9845 Quad UART> on puc0
sio6: type 16550A
sio6: unable to activate interrupt in fast mode - using normal mode
sio7: <NetMos NM9845 Quad UART> on puc0
sio7: type 16550A
sio7: unable to activate interrupt in fast mode - using normal mode
| Мда... Мало того что ругается, так и портов всего четыре, хотя на плате их шесть :)). Причём в перечислении портов (строка: port 0xd400-0xd407, 0xd800-0xd807, 0xdc00-0xdc07, 0xe000-0xe007, 0xe400-0xe407, 0xe800-0xe80f), их там все шесть. Посмотрел инфу о шине PCI:
/usr/home/lissyara/>pciconf -lv | grep --after-context=4 puc0
puc0@pci0:9:0: class=0x070002 card=0x00061000 chip=0x98459710 rev=0x01 hdr=0x00
vendor = 'MosChip Semiconductors (Was: Netmos Technology)'
device = 'Nm9845 Parallel/Serial Port Adapter'
class = simple comms
subclass = UART
/usr/home/lissyara/>
| Легче не стало :)). Пришлось рыться в исходных кодах ядра, по строке из dmesg:
/usr/home/lissyara/>cd /usr/src/
/usr/src/>find . -exec grep -l "NetMos NM9845 Quad UART" {} \;
./sys/dev/puc/pucdata.c
| В С++ ничё не понимаю, но посмотреть надо было - как-то уже сталкивался с интересными опциями, которые были просто закомменчены - иногда нестабильно работало. В этом файле была такая секция:
/* NetMos 4S0P PCI: 4S, 0P */
{ "NetMos NM9845 Quad UART",
{ 0x9710, 0x9845, 0, 0 },
{ 0xffff, 0xffff, 0, 0 },
{
{ PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ },
{ PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ },
{ PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ },
{ PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ },
},
},
| Несмотря на моё незнание данного языка программирования, первая идея при взгляде на этот кусок и соседний, где описывался восьми портовый адаптер - это добавить ещё две строки, описывающие два неопределившихся порта. Получилось так:
/* NetMos 4S0P PCI: 4S, 0P */
{ "NetMos MSC9845CV HEXA UART",
{ 0x9710, 0x9845, 0, 0 },
{ 0xffff, 0xffff, 0, 0 },
{
{ PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ },
{ PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ },
{ PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ },
{ PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ },
// next 2 line added
{ PUC_PORT_TYPE_COM, 0x20, 0x00, COM_FREQ },
{ PUC_PORT_TYPE_COM, 0x24, 0x00, COM_FREQ },
},
},
| Я поправил название чипа, и добавил две строки для портов. Заодно, вычитал в LINT про ругань, что была на прерывания. Надо было добавить ещё одну опцию:
Пересобираем ядро, перезагружаемся, смотрим dmesg:
puc0: <NetMos MSC9845CV HEXA UART> port 0xd400-0xd407,0xd800-0xd807,0xdc00-0xdc07,
0xe000-0xe007,0xe400-0xe407,0xe800-0xe80f irq 11 at device 9.0 on pci0
sio4: <NetMos MSC9845CV HEXA UART> on puc0
sio4: type 16550A
sio5: <NetMos MSC9845CV HEXA UART> on puc0
sio5: type 16550A
sio6: <NetMos MSC9845CV HEXA UART> on puc0
sio6: type 16550A
sio7: <NetMos MSC9845CV HEXA UART> on puc0
sio7: type 16550A
sio8: <NetMos MSC9845CV HEXA UART> on puc0
sio8: type 16550A
sio9: <NetMos MSC9845CV HEXA UART> on puc0
sio9: type 16550A
| Ну и всё. Главное при пересборках ядра не забывать про этот момент.
P.S. На самом деле, я уже насобирал несколько версий ядра - хотел сделать патч, чтобы отличать адаптеры. Неполучается. Слишком одинаковые... Щас собирается последняя версия, с количеством портов - 8 шт - хочу проверить как он себя поведёт при отсутсвующих портах (на плате-то их всего шесть). Если всё нормально - напишу в баг-лист FreeBSD предложение о увеличении количества портов в драйвере.
размещено: 2006-11-25,
последнее обновление: 2006-12-21,
автор: lissyara
|
|
|
|
2014-07-27, lissyara
gmirror
Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9
Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту
Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis
Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS
Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT
В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat
Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp
Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration
Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster
HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
2011-02-04, BlackCat
Восстановление ZFS
История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
2011-02-03, Капитан
1-Wire
Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
2011-01-28, Капитан
Температура в серверной
Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
|
Комментарии пользователей [5 шт.]