API v kernel space k seriové lince

API v kernel space k seriové lince
« kdy: 07. 08. 2012, 15:45:00 »
Pěkný den,

musím napsat kernel driver na jednoduché zařízení ovládané přes seriovou linku (jelikož potřebuju nějaká další data z kernelu a se zařízením je potřeba komunikovat poměrně často - v realtime, není vhodné psát ovladač do userspace).

Koukám ale do kernelu už několik dní a stále nedokážu najít odkud rozmotávat API. Tři vrstvy (tty, line discipline a uart driver) a mnoho vzájemě provázaných struktur představují klubko, které se mi nedaří rozmotat.

Je mi jedno, kterou vrstvu využít, potřebuju jen sehnat někde odkaz na strukturu popisující druhou seriovou linku (odpovídající ttyS1), kterou pak mohu použít jako argument pro nastavení rychlosti a parity a pak přečíst a zapsat pár bajtíků.

Nevíte prosím třeba o nějakém vzoru podobného ovladače ?


Sten


Re:API v kernel space k seriové lince
« Odpověď #2 kdy: 07. 08. 2012, 16:23:03 »
To jsem už někde viděl. Prolít jsem to tehdy jen tak v rychlosti. Teď jsem to prošel podrobně a plyne z toho akorát (což jsem trochu už tušil), že korektní by mělo být pro mé účely vytvořit novou line discipline.

Tady je nějaký example, jak to udělat: http://www.linux-mag.com/id/1891/, který ale předpokládá, že budu otvírat device z userspace a tím ho získám. To je ale špatný předpoklad. Já ho musím získat odněkud v kernelu. Userspace nebude se zařízením vůbec komunikovat.


Asi řeknu o co jde: k mainboardu je přes seriovou linku připojen frontpanel. Na něm jsou LEDky, které je potřeba rozsvěcet podle aktivity síťovky a HDD - to získám nejlépe ze SATA řadiče a ze síťovky samotné.

Sten

Re:API v kernel space k seriové lince
« Odpověď #3 kdy: 07. 08. 2012, 16:58:10 »
To záleží, jak raw chcete mít přístup. Pokud vám jde jen o to, aby to bylo v jádře, udělejte ovladač, který bude volat TTY layer těmi samými voláními, jako by to dělal user space, a odněkud dostane major a minor číslo zařízení (třeba z user space jako parametry modprobe). Pokud ale chcete reagovat na interrupty z té linky, budete muset napsat line disciple (asi nejlépe jako „obal“ nad N_TTY).

RDa

Re:API v kernel space k seriové lince
« Odpověď #4 kdy: 07. 08. 2012, 18:54:22 »
Nevim kde berete zduvodneni pro implementaci v jadre... nejjednodussi implementace je spis v userspace, kde si krasne muzete vsechno nakonfigurovat a v pripade potreby restartovat. Informace o provozu lze ziskat z /proc. Kdyz to pobezi jako kernel proces, tak s tim v pripade chyby nic nenadelate.


Re:API v kernel space k seriové lince
« Odpověď #5 kdy: 07. 08. 2012, 19:14:00 »
Sten: díky - ještě zvážím, která z úrovní je lepší.

RDa: no, myslím, že to není zas tak silné železo, abych mohl jen tak plýtvat výkonem na context switche. Přecejenom bude potřeba obsloužit ledky nejméně desetkrát do vteřiny. V kernel space to prostě hodím na nějaké IRQčko nebo nějaké vlákno, které už za nějakým účelem běží a bude se jednat o jednotky CPU cyklů.

dustin

Re:API v kernel space k seriové lince
« Odpověď #6 kdy: 07. 08. 2012, 21:00:22 »
Taky bych to nechal v userspacu. Par bliknuti za sekundu neni zadna zatez.