Menulis USB Driver dengan libusb

Pada pembahasan sebelumnya, kita belajar menulis USB driver dari sisi kernel. Kode yang dibuat nantinya akan berjalan di kernel space. Kali ini kita akan mencoba untuk menulis sebuah USB driver dengan memanfaatkan libusb (userspace USB driver library).

Dengan libusb kita dapat membuat USB driver tanpa harus menyentuh kode kernel sama sekali. Driver di sini lebih mirip seperti aplikasi yang menggunakan libusb untuk meng-handle operasi dengan USB device.

Prakteknya, saya gunakan BlankOn Ombilin (atau Ubuntu) sebagai host development.

# apt-cache search libusb-dev
   libusb-dev - userspace USB programming library development files

Kita membutuhkan paket libusb-dev, maka wajib diinstall terlebih dahulu😉
Dengan menggunakan libusb, dari segi kode yang ditulis akan jauh lebih ringkas, dan hanya cukup satu kode sumber saja tidak perlu kode sumber driver.

Sama seperti versi kernel drivernya, kita juga membutuhkan VendorID dan ProductID dari device yang bersangkutan, lalu kita akan cari device yang bersangkutan berdasarkan identifier tersebut. Pencarian dilakukan di antara list usb busses dari USB host controller, kemudian dicocokkan apakah VendorId dan ProductID nya sesuai atau tidak. Berikut implementasinya:

/* Definisiken VENDOR ID dan PRODUCT ID device */
#define         USBFOO_VENDOR_ID        0x0fca
#define         USBFOO_PRODUCT_ID       0x8004
struct usb_dev_handle *get_bus()
{
        struct usb_bus *busses, *bus;

        usb_init();
        usb_find_busses();
        usb_find_devices();

Get USB busses, lalu iterasi ke tiap bus yang tersedia.

        busses = usb_get_busses();
        for (bus = busses; bus; bus = bus->next) {
                struct usb_device *dev;

Cek apakah ada device dengan identifier yang cocok?

for (dev = bus->devices; dev; dev = dev->next) {
         if (USBFOO_VENDOR_ID == dev->descriptor.idVendor
             && USBFOO_PRODUCT_ID == dev->descriptor.idProduct) {
             printf("Ketemu target device!!n");

Buka device

             struct usb_dev_handle *foodev = usb_open(dev);
             if (!foodev) {
                    perror("Tidak bisa buka device");
             } else {

Claim interface.

             if (0 != usb_claim_interface(foodev, 0)) {
                    perror("Tidak bisa claim interface");
                    usb_close(foodev);
                    foodev = NULL;
             }
       }
       return foodev;
   :
   :

Setelah berhasil claim interface, silahkan terserah kita untuk menggunakan interface tersebut. Misalkan kita akan mengirim data ke device, kita dapat menggunakan usb_bulk_write()

usb_bulk_write(foodev, 0x2, write_buf + (len - remain),
                                   towrite, 3000))

Testing:

gcc -o usbfoo usbfoo.c
./usbfoo
Target usb device found!
Cannot claim interface: Device or resource busy

NOTE: Pada test di atas, device tidak dapat diclaim karena telah di-mount sebagai mass storage
Referensi:

http://libusb.sourceforge.net/doc/

Pos ini dipublikasikan di Linux. Tandai permalink.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

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