Jak na speciální klávesy v Linuxu Tomáš, Zbyněk
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
1
Obsah ●
Zprovoznění speciálních kláves v Xorg –
použití hotkeys
–
použití xbindkeys
●
Zprovoznění speciálních kláves v konzoli
●
Jak si pomoci když klávesy negenerují žádný kód
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
2
Hotkeys (1) ●
●
Balíček hotkeys umožňuje zprovoznit některé speciální klávesy, resp. přiřadit jim nějakou akci –
typicky se jedná o klávesy ovládající zvuk na multimediálních klávesnicích (na notebooku jde o kombinaci Fn+X)
–
funguje pouze v Xorg, nikoli v konzoli
Nastavení: –
z adresáře /usr/share/hotkeys vybereme nejvhodnější typ klávesnice a vyzkoušíme: hotkeys -t typ_klávesnice
–
případně můžeme vytvořit vlastní mapu klávesnice ●
●
cp /usr/share/hotkeys/XXX.def ~/.hotkeys/mykeyb.def a lehce upravíme nastavení vlastního ~/.hotkeys/hotkeys.conf Kbd=mykeyb
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
3
Hotkeys (2) ●
Spouštění při startu Xorg: –
●
přidání řádku hotkeys -b do ~/.xsession
Příklad (notebook Dell Latitude D505) –
výchozí mapa klávesnice /usr/share/hotkeys/inspiron8100.def
–
přidání akce pro "Win"-klávesu: ●
~/.hotkeys/mykeyb.def: <Shell
keycode="115"/>
●
~/.hotkeys/hotkeys.conf: Shell=xterm
(příslušný keycode zjistíme např. v xsonsoli) –
funguje regulace zvuku (Up/Down, Mute/Unmute) a spuštění xterm
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
4
Xbindkeys (1) ●
Alternativní způsob přiřazení akce k různým klávesám s použitím balíčku xbindkeys. –
●
poněkud složitější než v případě hotkeys, nespouští ovšem žádný "nápis" na obrazovce (vše plně v našich rukou)
Postup (detaily viz.
http://www.abclinuxu.cz/clanky/hardware/multimedialni-a-jinak-vylepsene-klavesnice –
–
zjištění mapy klávesnice ●
zjištění, jaký kód generuje naše klávesa (e008 - viz. xconsole)
●
viz. soubory /usr/share/keymaps/i386/qwerty/us-*.kmap.gz
●
nalezení volného "klíče" Do (kód 116)
přiřazení kódu naší klávesy kódu akce Do ●
přidání setkeycode e008 116 do souboru /etc/rc.local
●
tento skript musí končit příkazem exit 0
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
5
Xbindkeys (2) –
zjištění mapy klávesnice v Xorg (jiné než v konzoli !!) ●
–
–
pomocí xev (zjistíme, že 116 -> 222)
přiřazení zjištěného kódu k nějaké akci typu FX ●
pomocí xmodmap -e "keycode 222=F19"
●
spuštění nejlépe v ~/.xsession
spuštění daemonu xbindkeys a přiřazení určité akce, obsah ~/.xbindkeysrc: "/usr/local/bin/wifi_switch" F19
●
Uvedený příklad ukazuje použití klávesy Fn+F2 (WiFi switch). Šlo by to také jednoduše udělat pomocí hotkeys
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
6
Speciální klávesy v konzoli (1) ●
Mapa v konzoli funguje trochu jinak než mapa v Xorg –
●
nepotřebujeme žádné speciální balíčky, vystačíme s nástroji z balíčku console-tools
Postup je také zdokumentován na Webu
http://www.abclinuxu.cz/clanky/hardware/multimedialni-a-jinak-vylepsene-klavesnice
příklad pro Fn+F2: –
vytvoření vlastní mapy klávesnice: ●
●
vyjdeme ze současné mapy: dumpkeys > /usr/local/share/keymap_td (kód 116 stále odpovídá akci Do, náhoda?) modifikace souboru tak, aby Do spouštěl příslušný program: string Do="/usr/local/bin/wifi_switch\n"
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
7
Speciální klávesy v konzoli (2) –
přiřazení kódu klávesy kódu akce Do (viz. dříve) a zároveň aktivace naší modifikované mapy klávesnice v souboru /etc/rc.local setkeycodes e008 116 loadkeys /usr/local/share/keymap_td exit 0
●
Pozor: pokud stejný skript používáme v Xorg i v konzoli, měl by umět rozpoznat prostředí: –
použití konstrukce if [ -z $DISPLAY ] ....
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
8
Když to nefunguje, staňme se experty... ●
Všechny výše zmíněné postupy vyžadují, aby naše klávesa generovala nějaký kód. Pokud tomu tak není, což typicky platí pro klávesy přímo ovládající hardware (jas LCD displeje, on/off wireless, on/off zvuk ...), existuje zde pravděpodobnost, že jejich nefunkčnost je způsobena problémem s DSDT ... –
Co je ACPI (Advanced Configuration Power Interface)? ●
–
jedná se o společný standard (firem Intel, Microsoft, Toshiba), který definuje, jak má OS komunikovat s BIOSem a přes něj řídit “power management” jednotlivých periferií
Co je DSDT (Differentiated System Description Table)? ●
“tabulka” popisující konfiguraci systému; obsahuje definice všech periférií, která podporují ACPI + popisuje jejich funkce
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
9
Expertem na DSDT(1) ●
V čem je problém? (v několika málo bodech) –
DSDT – napsáno v jazyce ASL (ACPI source language) a zkompilováno do AML (ACPI machine language)
–
Někteří výrobci periferií používají při generování DSDT ASL kompilátor firmy Microsoft (místo firmy Intel), který je liberálnější vůči mírným nepřesnostem standardům ACPI ●
●
●
OS Windows – poradí si i s problematickým kódem (používá výstup vlastního kompilátoru) - OK OS Linux – neporadí si s problem. kódem (striktně vyžaduje dodržování standardů ACPI) - možné problémy
Jak to řešit? –
Informace z DSDT je vložena do ACPI namespacu v době bootování
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
10
Expertem na DSDT(2) –
●
Nutné opravit DSDT tabulku, uložit opravenou verzi do souboru a ten zakompilovat do jádra – informace o perifériích bude natažena přímo z jádra, nikoliv z BIOSu
Krok za krokem ... –
Stáhnout debianní balíček iasl (Intel ASL kompilátor)
–
Extrahovat obsah DSDT do souboru a získat zdroj. kód cat /proc/acpi/dsdt > dsdt.dat iasl -d dsdt.dat, což vytvoří soubor dsdt.dsl
–
Opravit chyby a rekompilovat (zde bohužel obecný návod neexistuje, při kompilaci se dá zjistit, kde jsou problémy, a pak je nutné googlit řešení nebo stáhnout již opravenou verzi, více na: http://acpi.sourceforge.net/dsdt/index.php iasl -tc dsdt.dsl
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
11
Expertem na DSDT(3) –
Upravit konfiguraci jádra .config, tj. uložit zde adresu opravené DSDT tabulky, a překompilovat jádro Device drivers ---> Generic Driver Options ---> [ ] Select only drivers that don't need compile-time external firmware [ ] Prevent firmware from being built
Power management options (ACPI, APM) ---> ACPI (Advanced Configuration and Power Interface ) Support ---> [*] Include Custom DSDT (path/.../dsdt_table.hex) Custom DSDT Table File to include
Power management –
Nyní by už vše mělo zafungovat ... (jedná se o řešení skutečně pro experty, kód je v assembleru)
Linux seminář, 9.1.2009
Tomáš Davídek, Zbyněk Drásal
12