LCD kijelző - udev küzdelem

 ( denx | 2006. november 17., péntek - 11:25 )

Sziasztok!

Nem tudom ki az, aki próbálkozott már a fenti problémával, de nekem most utamba akadt egy 2x16 karakteres párhuzamos porton csüngő viszonylag gyakori típus (hd 44780). Ennek életre keltésére találtam több programot is:
- LCDproc: nagyszerű daemon program, van belőle deb package is, csak az ékezetes karakterekre nem leht rábírni.
- lcdmod: egyszerű kis kernel modul, tud ékezeteket is, csak kernel és forrása kell hozzá. Elég halottnak tűnik a project.
- lcd-linux: hasonló az előzőhöz, csak még élőnek látszik.

Szóval a helyzet az, hogy van egy minimális lemezterülettel (fél GB) rendelkező debian-os gépem, amire szeretnék felvarázsolni egy lcd drivert. Az elsőt sikerült is, de az az ékezetek miatt kiesett. A második kettőnek meg az a nagy baja, hogy a fordításukhoz kell a kernel forrása és feltelpített dolgai is. Ez pedig fél gigában nem megoldható dolog, hiszen csak maga a kernel forrása több 400 megánál! (2.6.18)

Szóval az lenne a kérdésem, hogy hogyan lehet valahogy úgy fordítani a kernelmodulokat, hogy ne kelljen hozzájuk a teljes kernel forrás és a lefordított dolgai is?

Arra is kiváncsi lennék, hogy később ebből fogok tudni standalone package-et csinálni? Vagy esetleg másik gépen ezt meg tudom úgy csinálni, hogy elég legyen csak a csomagot átvinni és telepíteni a célgépen?

A segítséget előre is köszönöm!

Üdv:
denx

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

itt van egy leiras hogy hogyan tudsz debian csomagot csinalni a kernelbol: http://www.howtoforge.com/kernel_compilation_ubuntu

udv Zoli

Egy másik gépen fordítsd le a kernelt, készíts belőle deb csomagot és a célgépen telepítsd fel a csomagot.

Azon a gépen, ahol van hely és erős CPU:
cd /usr/local/src/_path_to_kernel_source
make menuconfig (itt beállítod a célgépnek megfelelő konfigot)
make-kpkg --bzimage --revision=1.0 kernel_image
(van még sok szép kapcsoló pl. --appendo-to-version és --append_to_version is hasznos lehet, de először ez is elég, ha úgyanezen kernelverzió még nincs feltelepítve a célgépen)

A létrejött deb csomagot meg átmásolod a célgépre és dpkg -i paranccsal telepíted, majd reboot.
(persze még szebb, ha van az általunk késztett deb csomagokra hivatkozás a source.list-ben)

Bye, Fifi

Na igen az előttem hozzászóló szép színes szagos howto-ra linkelt, amíg én pötyörésztem, de a lényeg a make-kpkg parancs használata.

Bye, Fifi

Köszönöm a gyors válaszokat!

Az oldalt amit fent írtatok, magam is olvastam az alpján fordítottam is egy kernelt. Agond csak az, hogy az lcd driver fordítás közben a következő könyvtárakat használná:

/lib/modules/${KERNEL_VERSION}/build                 #src könyvtár
/lib/modules/${KERNEL_VERSION}/kernel/drivers/misc   #célkönyvtár
/lib/modules/${KERNEL_VERSION}/build/include         #felteszem innen include-ál

Ezek pedig csak akkor jönnek létre, ha fel is telepítem a lefordított kernelt! És természetesen csak akkor, ha a feltelpített kernelnek a forrása is megvan! Szóval a kernel átcipelése triviális, de ebbe a csomagba hogy tudom belevarázsolni a szükséges drivert is, vagy hogy tudok a driverből külön lefirdított bináris csomagot csinálni?

Csinalj a kernel forditas vegen egy make modules_install -t, ez atpakolja oda a leforditott modulokat, de nem zavar be mast a futo rendszerben. Ezutan leforditod az lcd modulokat, kiszeded a konyvtarbol oket, aztan le is torolheted az egeszet. Atmasolod a kis gepre ugyanoda, ahol itt voltak, es kiadsz egy "dempmod -a" -t, ez "beregisztralja" oket, es latni fogja a rendszer, mehet a modprobe..

A fenti 'depmod -a'-ba becsúszott egy 'm'...

Meg egy aprocska kis hiba: a kernel modul forditas az eppen aktualis kernelhez fordit (ha jol tudom, eppen ezert keresi a /lib -ben a forrast). Tehat telepiteni kell szerintem a kernel csomagot, majd akkor leforditani a modult. igy atvive, majd 'depmod -a' parancsot futtatva kellene hogy mukodjon.

Világos. Most ott tartok, hogy fordítottam egy kernelt, meg fordítottam egy modult is hozzá. Először a célgépen felrakom a kernelt, majd mellé pakolom a lefordított modult (meg a szükséges install dolgokat megcsinálom, mint depmod) és így menni fog? Akkor ebből akár csinálhatok deb package-et is, ha jól értem, csak az a lényeg, hogy mindig ugyanazzal a kernellel kell telepíteni, ugye?

szerk: torolve

Köszönöm a segítséget, sikerült a kernel és a modul áttelepítése.

Most már csak az a gondom, hogy telepítés közben "mknod" és "ln" parancsokkal csinálódnak meg a /dev alatt a szükséges "fájlok" és symlinkek. Ám ezek egy újraindítás után nem jönnek létre maguktól! Hogyan lehet erre rávenni a rendszert, hogy ezeket minden startup-nál csinálgassa meg? Az tiszta sor, hogy a kernelmodult és pramétereit a /etc/modules fájlba kell rögzíteni, de nyilván kellenek a karakteres device-ok is a /dev alatt a helyes működéshez!

csinálj rá egy udev rule-t.
echo 'KERNEL=="< lcd modul neve >", NAME="%k", MODE="0666"' > /etc/udev/rules.d/xxx_lcd.rules
a NAME-nál nem biztos hogy a modul neve kell (a %k modulnévvel hoz létre device-t), ezen kívül a symlink opciót is használnod kell ha akarsz symlinket, meg a mode sem biztos ez. De valami hasonlót kell csinálnod. Ebben az esetben amikor betöltődik a driver az udevd létrehozza a rule alapján a device-okat.

P.S: persze ha UDEV-et használsz.

Köszi a választ! Valszeg ez lesz a megoldás, de valamit elszúrhattam, mert nem csinál semmilyen dev fájlt a modprobe közben. Ezt írtam de a /etc/udev/lcd.rules fájlba (csináltam egy linket a /etc/udev/rules.d könyvtárban lcd névvel rá):

KERNEL=="hd44780", NAME="%k", MODE="0666", SYMLINK="lcd"

Ez pedig amit kiír az "udevmonitor --env" amikor a "modprobe hd44780" utasítást futtatom:

UEVENT[1164026512.664432] add@/module/lcd_linux
ACTION=add
DEVPATH=/module/lcd_linux
SUBSYSTEM=module
SEQNUM=681

UEVENT[1164026512.667805] add@/module/hd44780
ACTION=add
DEVPATH=/module/hd44780
SUBSYSTEM=module
SEQNUM=682

UDEV  [1164026512.673652] add@/module/lcd_linux
UDEV_LOG=3
ACTION=add
DEVPATH=/module/lcd_linux
SUBSYSTEM=module
SEQNUM=681
UDEVD_EVENT=1

UDEV  [1164026512.687419] add@/module/hd44780
UDEV_LOG=3
ACTION=add
DEVPATH=/module/hd44780
SUBSYSTEM=module
SEQNUM=682
UDEVD_EVENT=1

Szóval mit ronthatok el? Ha kézzel csinálom a device fájlokat, akkor a következőket kell csinálnom:

mknod /dev/lcd0 c 120 0
ln -s /dev/lcd0 /dev/lcd

Ezt kellene udev-vel csináltatni.

Igen.
Elfelejtettem mondani, hogy ahhoz hogy a device létrejöjjön autómatikusan az udev által a major numkbere 0 kell legyen. Így kell betölteni a modult. Ezt a modprobe.d-ben létrehozott < modulnév > fájllal tudod megtenni, amibe beírod, hogy : 'option < modulnév > major=0'. Ebben az esetben echo 'option hd44780 major=0' > /etc/modprobe.d/hd44780 . Persze ez csak akkor lehet, ha van ilyen opciója a modulnak. Mondjuk úgy tudom, hogy ezt már javították az udev-ben, de lehet hogy csak patch-ben elérhető. Tehát ha minden igaz ez nem szükséges hozzá, de azért egy próbát megér. Szóval nézd meg modinfo-val van e ilyen paramétere a modulnak.

A fenti udev rule alapján a betöltött modul hd44780 nevű, ami során létrehozza a /dev/hd44780 eszközt és csinál egy /dev/lcd symlinket rá. Ha lcd0 nevűt akarsz, akkor a NAME után ezt add meg. A %k behejettesíti a kernelmodul nevét, és neked nem ez kell.

A másik megoldás, hogy ha nincs major opciója amodulnak, akkor futtathatsz parancsokat is a rule-on belül, pl egy mknod-ot és egy ln-t is. Erre való a RUN directíva.

Persze lehet hogy nem jól tudom. Annyit én sem foglalkoztam a dologgal.

Köszi, de nem jött be ez se. A modulnak nincs major paramétere, csak minor! Szóval első lehetőség kilőve, a második meg szintén! Ha jól sejtem az udev eleve csak akkor foglalkozik a dologgal, ha a major-ja 0, így a RUN direktívát sem tudom használni, mert eleve nem veszi észre a rá vonatkozó sort! Más ötlet?

/etc/rc.local -ba bele aztán éljen :)

Ez marad! :)
Azért köszi a segítséget!