I/O Programming: Mengatur Lampu LED di Keyboard


Belakangan ini saya kerap bertemu dengan seorang dosen yang mengajar mata kuliah sistem operasi, dan kami sering terlibat dalam diskusi menarik.  Mengajarkan materi sistem operasi yang berorientasi praktek membutuhkan tantangan lebih besar.  Hal ini tidaklah berlebihan, karena kebanyakan teori sistem operasi tidak cukup berguna untuk dipakai dalam membuat sistem operasi.  Misalnya, dalam mata kuliah sistem operasi, hampir tidak pernah membahas tentang keyboard controller.  Tetapi, pada kenyataannya, pemahaman akan cara kerja keyboard controller wajib dibutuhkan dalam pembuatan sebuah sistem operasi.

Untuk membaca dan menulis informasi ke keyboard controller, seseorang perlu membaca dan menulis port 0x60 dan 0x64.  Dengan membaca port 0x64, programmer dapat mengetahui status keyboard controller.  Dengan menulis pada port 0x60, seseorang dapat mengirimkan perintah pada keyboard controller.  Misalnya, dengan mengirim nilai 0xED pada port 0x60, programmer dapat mengatur indikator LED apa saja yang nyala yang diwakili dengan nilai berikutnya yang dikirim pada port 0x60.

Pertanyaan pertama yang harus dijawab adalah platform apa yang harus dipergunakan oleh mahasiswa?  Bahasa pemograman yang dipergunakan dapat berupa assembly dan C, dimana bahasa C adalah pilihan yang lebih masuk akal.    Bila menggunakan platform Windows, maka mahasiswa akan memakai Visual C++, sebuah tools standar untuk pemograman low-level di Windows.  Sayangnya, penggunaan fungsi _inp() dan _outp() di Visual C++ dibatasi hanya pada pemograman driver saja.   Hal ini dilakukan dengan alasan keamanan, sehingga tidak sembarangan aplikasi boleh melakukan akses I/O yang notabene dapat berbahaya sekali.  Pilihan lain adalah menggunakan platform lain, misalnya menggunakan sistem operasi Linux.  Pada Linux, tersedia fungsi ioperm() yang memungkinkan program biasa melakukan operasi I/O.  Syaratnya adalah program tersebut dijalankan dengan hak akses super user.

Berikut adalah sebuah contoh program C di Linux yang membuat LED keyboard (LED indikator num lock, caps lock, dan scroll lock) menyala berurutan:

#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>

void kirimCommand(char command) {
  char c = 0;
  while (1) {
    c = inb(0x64);
    if ((c&2)==0) break;
  }
  outb(command, 0x60);
}

int main() {
  if (ioperm(0x60,5,1)) {
    printf("Program tidak memiliki hak akses\n");
    return -1;
  }
  printf("Perhatikan indikator LED di keyboard!\n");
  int i=0;
  char statusLED = 1;
  while (i<100) {
    kirimCommand(0xED);
    kirimCommand(statusLED);
    if (statusLED==4) statusLED=1; else statusLED<<=1;
    i++;
    sleep(1);
  }
}

Pada fungsi kirimCommand(char command) di atas, setiap kali sebelum mengirim command ke port 0x60, program akan memeriksa apakah buffer input sudah kosong.  Hal ini dilakukan dengan membaca status keyboard controller di port 0x64, dan memeriksa isi dari bit 2.

Variabel statusLED berisi pola LED yang akan dinyalakan nantinya.  Hanya tiga bit yang dipakai, yaitu bit 0 untuk LED Scroll Lock, bit 1 untuk LED Caps Lock, dan bit 2 untuk LED Num Lock.

Setelah itu, program dapat di-compile dengan gcc dan dijalankan, dengan memberikan perintah seperti:

$ gcc -o keyboard keyboard.c
$ sudo ./keyboard
[sudo] password for user:
Perhatikan indikator LED di keyboard!

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: