Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  UPS APC-1500
  NetMos NM9845
  cisco & syslog
  LAN card`s test
  HDD & UDMA100
  S.M.A.R.T.
  D-Link DE-200TP
  Marvell 88E8053
  D-Link DGE530T
  КПК + FreeBSD
  D-Link DWL-G520
  SkyLink-CDMA
  Atheros AR5007EG
  BlueTooth mouse
  Asus Eee PC
  atacontrol
  SkyStar-2+SlonAx
  TT budget S-1401
  SiS*Mirage*1 на D201GLY2
  NetXtreme BCM5722
  snd_hda
  Peoplenet + C-motech (3G)
  freebsd + huawei 162 gsm modem
  tw_cli
  pc_speaker
  Canon/gphotofs
  Охранная система на FreeBSD+LPT
  Даешь 220 в LPT
  Мелочи
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


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)

   Ладно, это победилось влёт - пересборкой ядра (можно подгрузить модуль) с такой опцией:
device          puc

   После перезагрузки, получили такую картину в 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 про ругань, что была на прерывания. Надо было добавить ещё одну опцию:
options         PUC_FASTINTR

   Пересобираем ядро, перезагружаемся, смотрим 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

оценить статью:

butcher, 2006-12-20 в 15:38:04

Если есть время, наложите вот этот патч в дополнение к вашим исправлениям и покажите, что система выводит при загрузке:
+++ puc_pci.c   Wed Dec 20 15:36:02 2006
@@ -123,6 +123,8 @@
   desc = puc_find_description(v1, d1, v2, d2);
   if (desc == NULL)
       return (ENXIO);
+   device_printf(dev, "Vendor: %04X, Device: %04X, SubVendor: %04X, "
+                   "SubDevice: %04X\n", v1, d1, v2, d2);
   device_set_desc(dev, desc->name);
   return (BUS_PROBE_DEFAULT);
}

DS, 2007-03-23 в 22:46:55

Даташит на 9845:
http://www.moschip.com/data/products/NM9845/Data%20Sheet_9845.pdf

Количество комов хранится в младшем ниббле SubsystemID, количество LPT - в старшем ниббле.

Есть еще одна тонкость - прерывание карты ни в коем случае не должно быть зашаренным с кем-то еще, иначе будут проблемы.

tankistua, 2009-08-20 в 20:36:34

у меня от подгрузки модуля 7.2 выпадает в дамп - хочу попробовать в ядро вкомпилить, еще вариант - переставить в другой слот.

tankistua, 2009-08-21 в 18:58:58

завелась у меня на 7.2 карточка, надо было только я ядро вкомпилить. Неправильно чуток завелась - у меня нет lpt-порта, но главное что работает.

puc0@pci0:1:1:0:        class=0x070002 card=0x00041000 chip=0x98459710 rev=0x01 hdr=0x00
   vendor     = 'MosChip Semiconductors (Was: Netmos Technology)'
   device     = 'Nm9845 Parallel/Serial Port Adapter'
   class      = simple comms
   subclass   = UART

alik, 2009-12-03 в 13:41:46

Как раз сейчас этим и занимаюсь, очень приятно что уже существует такая статья!


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

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
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 15 чел.
За последние 30 мин было: 86 человек
За сегодня было
1247 показов,
353 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0409 секунд
Из них PHP: 30%; SQL: 70%; Число SQL-запросов: 77 шт.
Исходный размер: 97393; Сжатая: 18948