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