FreeBSD 8.1 a multiportova seriova karta

Dan Lukes dan at obluda.cz
Wed Jan 5 00:27:16 CET 2011


> 2011/1/2 Dan Lukes<dan at obluda.cz>:
> puc0 at pci0:0:17:0:       class=0x070002 card=0x40561409 chip=0x71681409
> rev=0x01 hdr=0x00
>      vendor     = 'Timedia Technology Co Ltd'
>      device     = 'PCI / ISA Asynchronous UART Signal Chips Solution (40371409)'
>      class      = simple comms
>      subclass   = UART
>      bar   [10] = type I/O Port, range 32, base 0xe000, size 32, enabled
>      bar   [14] = type I/O Port, range 32, base 0xe020, size 16, enabled
>
> Ano, bary jsou tam definovane.

Dulezite je, ze 10 a 14. Tim muzes zapomenout, ze by tvuj problem byl 
stejny jako resili v tom patchi.

>> funkci, co se provadela minula oprava (tedy puc_config_timedia) je kod:
>>
>>         case PUC_CFG_GET_OFS:
>>                 *res = (port == 1 || port == 3) ? 8 : 0;
>>
>> Tak tu osmicku nahrad sestnactkou.
>>
>
> Zmenu ve zdrojacich jsem jeste neudelal, ale udelal jsem tu dalsi
> diagnostiku, kterou jsi doporucoval.
> Behem dneska se pokusim udelat tuto zmenu ve zdrojacich a prekompilovat kernel.
>
>>
>> Potrebujeme jeste vypis devinfo -rv , respektive, z nej ten podstrom, ktery
>> popisuje informace o puc0 zarizeni.
>
> Tady je:
>          puc0 pnpinfo vendor=0x1409 device=0x7168 subvendor=0x1409
> subdevice=0x4056 class=0x070002 at slot=17 function=0
>              Interrupt request lines:
>                  10
>              I/O ports:
>                  0xe000-0xe01f
>                  0xe020-0xe02f
>            uart2
>                puc0 I/O port mapping:
>                    57344-57351
>                puc0 port numbers:
>                    1
>            uart3
>                puc0 I/O port mapping:
>                    57352-57359
>                puc0 port numbers:
>                    2

"puc" je blbec ;-)

Proc tam, proboha, maji jednou cisla portu hexa a podruhy decimalne ?

takze - naslo ti to

1. uart2 na portech e000-e007
2. uart3 na portech e007-e00f

Hm, tak to ti ta zmena 8->16 spis nepomuze, protoze to jsou dva seriaky 
v prvnim bloku IO portu

Ale stejne to zkus - pokud to i po zmene najde dva seriaky, tak to budou 
jine dva (ten druhy bude jiny - bude na portech e010-e017, devinfo -rv 
ti to potvrdi).

Pokdu by to vyslo, vedeli bychom uz kde jsou tri ze ctyrech seriaku, coz 
by lepsi nez nic.
No, oabvam se, ze te ceka trocha pokusovani, a ze to zbyva na tebe, 
protoze tohle je neco, co se neda jednoduse uhadnout.

Jak sam vidis, karta si necha pridelit dva bloku IO portu - jeden o 
velikosti 32, druhy o velikosti 16.

Nekde v tomto prostoru jsou rozlozeny tve ctyri seriaky, pricemz jeden 
seriak pravdepodobne zabira osm po sobe jdoucich IO portu.

Takovych osmic mame v tech dvou blocich sest.

O dvou seriacich uz vime - okupuji prvni dve osmice prvniho bloku. 
Hledame druhe dva.

Ve funkci puc_config_timedia je to tak, ze je zavolana s cislem 
hledaneho portu (tedy v tvem pripade 0 - 3) a ceka se, ze funkce vraci:

1) case PUC_CFG_GET_RID: *res = 0x10 nebo 0x14 coz je identifikace 
RID/baru/bloku (to je to misto, ktere opravovali oni v tom patchi)

2) case PUC_CFG_GET_OFS: *res = offset v ramci toho bloku (to je to 
misto, do jehoz opravy jsem te tlacil ja)

No a ty musis

a) zjistit, kde u tve karty ty porty opravdu jsou (dva uz mas na pozici 
[10]:0h a [10]:8h a hledas dalsi dva na ctyrech moznych pozicich, 
pricemz ale [14]:0h a [14]:8h to spis nebudou, protoze tam je hledal 
soucasny ovladac - takze by mely byt na [10]:10h a [10]:18h - a nebo en 
a pak je cela tahle teorie vadna a problem je jinde)

b) az to budes vedet kde IO porty jpro kazdy konkretni seriak jsou tak 
zajistit aby puc_config_timedia vracela prave ty spravne zjistene 
hodnoty pro kazdy s 0-3 portu

Nicmene opravdu to nemusi vyjit - ja z toho jak maji udelane ty dva 
porty o kterych viem dovozuju analogii (ze to budou mit podobne) jak 
budou mit ty druhe dva - jenze - ve skutecnosti by je mohli mit i nejake 
naprosto jinak, a to prakticky libovolne ...

Pak bys asi mel smulu - jedine co bych ti poradil pak je - 
zrekonstruovat navrh hardware z ovladace pro Wokna, coz ovsem pri 
hodinove cene tveho casu vyjde radove draz naz tuhle kartu vyhodit a 
poridit jinou ...

> Jeste jsem prochazel man sio a je tam napsano

> V LINTu pro 8.1 "options COM_MULTIPORT" neni, takze jsem se domnival,
> ze sio je obsolete a ze se v 8-cce preslo ze sio na uart.

No, schizma sio x uart existuje uz v sedmicce a v osmicce se situace 
nemeni - jedine se zmenilo ktery z obou ovladacu prelozili do GENERICu.

Ale jaky si prelozis do svych kernelu ty je jina otazka. Ja nepouzival 
sio a prekladal uart uz na sedmicce ...

Jsou to proste dva ovladace stejneho hardware - tak jako v osmicce muzes 
na AHCI pouzit ataahci.ko nebo ahci.ko

> Nemam pouzit informace z man sio?

Coz, zkusit to urcite muzes, ale davam tomu minimalni nadeji. Jak SIO 
tak UART zavisi na schopnosti vedet kde se v prostoru IO portu dane 
karty nachazeji jednotlive osmice. A predevsim - jak UART tak SIO prave 
tohle nechavaji na PUC, takze prechod na SIO podle meho nebude znamenat 
v nasem problemu zadnou zmenu.

> Pak ale nechapu proc je v systemu 8.1 man sio, kdyz uz se device sio nepouziva?

V GENERICU nepouziva ...

Dan


More information about the Users-l mailing list