Studi Kasus: Kontroller i8042 pada Linux


Yo ketemu lagi, kali ini postingannya agak unik. Studi kasus? ya, jadi disini saya akan menguraikan masalah yang saya hadapi pada komputer saya sendiri berikut penanggulangannya dan apa yang ada di balik semua masalah ini.


Sesaat setelah saya dapat solusi touchpad di laptop saya yang tidak work di ubuntu 16.04 saya langsung terpikir untuk memposting ini kalau-kalau nanti saya dapat masalah yang mirip seperti ini saya jadi ingat. Ya, saya adalah tipe orang yang mudah mengingat sesuatu jika saya tuliskan sendiri. Sedikit curhat, waktu SD - SMP dulu untuk menghafal (meh, sejujurnya ini pekerjaan yang paling tidak kusuka) atau mengingat sesuatu saya berusaha sebisa mungkin merasakan 'momen' ketika saya membaca atau menghafal sesuatu. Jadi, ketika saya ingin mengingat hal itu saya hanya perlu me recall momen itu and its work like a charm.

Ok, cukup curhatnya. Jadi singkat cerita touchpad di laptop baru saya tidak work ketika selesai menginstall ubuntu 16.04. Spec laptop baru saya adalah

 ~$ sudo lshw -short  
 [sudo] password for genomexyz:   
 H/W path    Device   Class     Description  
 =====================================================  
               system     X456UF (ASUS-NotebookSKU)  
 /0             bus      X456UF  
 /0/0            memory     64KiB BIOS  
 /0/d            memory     64KiB L1 cache  
 /0/e            memory     64KiB L1 cache  
 /0/f            memory     512KiB L2 cache  
 /0/10           memory     3MiB L3 cache  
 /0/11           processor   Intel(R) Core(TM) i5-6200U CPU @ 2.30G  
 /0/12           memory     4GiB System Memory  
 /0/12/0          memory     4GiB SODIMM DDR3 Synchronous 1600 MHz   
 /0/12/1          memory     [empty]  
 /0/100           bridge     Sky Lake Host Bridge/DRAM Registers  
 /0/100/2          display    Sky Lake Integrated Graphics  
 /0/100/4          generic    Intel Corporation  
 /0/100/14         bus      Intel Corporation  
 /0/100/14/0  usb2    bus      xHCI Host Controller  
 /0/100/14/1  usb1    bus      xHCI Host Controller  
 /0/100/14/1/1       input     USB OPTICAL MOUSE  
 /0/100/14/1/6       multimedia   USB2.0 VGA UVC WebCam  
 /0/100/14/1/8       communication Bluetooth wireless interface  
 /0/100/14.2        generic    Intel Corporation  
 /0/100/15         generic    Intel Corporation  
 /0/100/15.1        generic    Intel Corporation  
 /0/100/16         communication Intel Corporation  
 /0/100/17         storage    Intel Corporation  
 /0/100/1c         bridge     Intel Corporation  
 /0/100/1c/0        display    GM108M [GeForce 930M]  
 /0/100/1c.4        bridge     Intel Corporation  
 /0/100/1c.4/0 enp2s0   network    RTL8111/8168/8411 PCI Express Gigabit   
 /0/100/1c.5        bridge     Intel Corporation  
 /0/100/1c.5/0 wlp3s0   network    QCA9565 / AR9565 Wireless Network Adap  
 /0/100/1f         bridge     Intel Corporation  
 /0/100/1f.2        memory     Memory controller  
 /0/100/1f.3        multimedia   Intel Corporation  
 /0/100/1f.4        bus      Intel Corporation  
 /0/1      scsi0    storage      
 /0/1/0.0.0   /dev/sda  disk      500GB HGST HTS545050A7  
 /0/1/0.0.0/1  /dev/sda1  volume     449MiB Windows NTFS volume  
 /0/1/0.0.0/2  /dev/sda2  volume     99MiB Windows FAT volume  
 /0/1/0.0.0/3  /dev/sda3  volume     15MiB reserved partition  
 /0/1/0.0.0/4  /dev/sda4  volume     97GiB Windows NTFS volume  
 /0/1/0.0.0/5  /dev/sda5  volume     82GiB Windows NTFS volume  
 /0/1/0.0.0/6  /dev/sda6  volume     184GiB Windows NTFS volume  
 /0/1/0.0.0/7  /dev/sda7  volume     97GiB EXT4 volume  
 /0/1/0.0.0/8  /dev/sda8  volume     3991MiB Linux swap volume  
 /0/2      scsi1    storage      
 /0/2/0.0.0   /dev/cdrom disk      CDDVDW SU-228GB  

Ya, saya dual boot dengan Windows10 (file word, ppt, game etc...belum bisa tergantikan). Kembali ke masalah utama, touchpad saya tidak work, harus pakai mouse untuk menggerakkan kursor. Cek per cek ternyata masalahnya karena ada pada driver i8042. i8042 sendiri adalah controller untuk mouse dan keyboard.

Jadi untuk laptop-laptop keluaran baru, sepertinya dilengkapi dengan kemampuan multiplexing. Multiplexing adalah kemampuan mengirimkan 1 signal yang kompleks, yang mana 1 signal ini merangkap untuk peripheral lainnya. Ini sangat bagus karena menghemat 'jalur' pada rangkaian internal komputer.

Inovasi ini mungkin ada hubungannya dengan tombol disable touchpad pada keyoboard. Laptop keluaran baru saya perhatikan banyak yang punya fitur seperti itu.

Cara kerja dari driver ini ialah, ketika booting, dia akan mengecek apakah device i8042 yang tertanam pada laptop support multiplexing seperti pada source codenya

 /*  
  * i8042_check_mux() checks whether the controller supports the PS/2 Active  
  * Multiplexing specification by Synaptics, Phoenix, Insyde and  
  * LCS/Telegraphics.  
  */  
 static int __init i8042_check_mux(void)  
 {  
      unsigned char mux_version;  
      if (i8042_set_mux_mode(true, &mux_version))  
           return -1;  
      pr_info("Detected active multiplexing controller, rev %d.%d\n",  
           (mux_version >> 4) & 0xf, mux_version & 0xf);  
 /*  
  * Disable all muxed ports by disabling AUX.  
  */  
      i8042_ctr |= I8042_CTR_AUXDIS;  
      i8042_ctr &= ~I8042_CTR_AUXINT;  
      if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {  
           pr_err("Failed to disable AUX port, can't use MUX\n");  
           return -EIO;  
      }  
      i8042_mux_present = true;  
      return 0;  
 }  

Tapi sayangnya, driver ini masih belum sempurna (ada masalah pada pengecekan) sehingga pada beberapa kasus touchpad hanya kadang-kadang saja work dan selebihnya tidak (pada kasus saya, tidak work sama sekali). Untuk memperbaiki ini, pada /etc/default/grub di parameter GRUB_CMDLINE_LINUX_DEFAULT masukkan

 i8042.nomux=1 i8042.reset

lebih jelasnya, file /etc/default/grub menjadi

 # If you change this file, run 'update-grub' afterwards to update  
 # /boot/grub/grub.cfg.  
 # For full documentation of the options in this file, see:  
 #  info -f grub -n 'Simple configuration'  
 GRUB_DEFAULT=0  
 #GRUB_HIDDEN_TIMEOUT=0  
 GRUB_HIDDEN_TIMEOUT_QUIET=true  
 GRUB_TIMEOUT=10  
 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`  
 GRUB_CMDLINE_LINUX_DEFAULT="i8042.nomux=1 i8042.reset quiet splash"  
 GRUB_CMDLINE_LINUX=""  
 #sisanya tidak ada yang berubah, hanya bagian atas ini saja  

Kegunaan dari command ini adalah mereset device yang terkoneksi dengan KBD port. Ada ungkapan yang mengatakan "terkadang kita hanya perlu merestartnya saja agar bisa jalan lagi" dan itu bekerja disini. Saya masih belum tahu mengapa ini bisa berhasil. Tidak lupa setelah mengedit /etc/default/grub ini langsung restart komputer untuk merasakan efeknya.

Mengingat command line itu di tujukan untuk kernel, maka seharusnya solusi ini bisa untuk semua distro linux.

Ya, sepertinya hanya itu saja untuk studi kasus yang pertama ini. Beberapa ide tulisan yang ingin saya masukkan di potingan kali ini kebanyakan sudah lupa, so moral of the story "ketika punya ide, langsung tulis atau kalau tidak sempat, setidaknya catat lah". Sekian.

referensi:
http://unix.stackexchange.com/questions/28736/what-does-the-i8042-nomux-1-kernel-option-do-during-booting-of-ubuntu
http://searchnetworking.techtarget.com/definition/multiplexing
https://forums.gentoo.org/viewtopic-t-336570-start-0.html
http://askubuntu.com/questions/763584/elantech-touchpad-not-working-on-ubuntu-16-04-and-arch-linux
http://lxr.linux.no/#linux+v3.2/drivers/input/serio/i8042.c
https://www.kernel.org/doc/Documentation/kernel-parameters.txt
https://en.wikipedia.org/wiki/Multiplexing

Komentar