Porting Linux 2.6 ke Platform ARM Baru (bagian 1)

Bagian 1 Bagian 2 Bagian 3

Artikel ini akan membahas bagaimana melakukan porting kernel 2.6 ke platform ARM baru. Artikel ini ditulis berdasarkan pengalaman memporting kernel Linux 2.6 ke sebuah network attached storage (NAS) yang saya miliki. Tulisan ini bisa menjadi panduan bagi Anda untuk memporting Linux ke device lain yang Anda miliki.

Ketika saya membeli casing hard disk yang sekaligus berfungsi sebagai NAS, saya tidak menyangka bahwa sistem operasi yang digunakan oleh NAS tersebut adalah Linux karena kotaknya tidak mencantumkan apapun. Hal ini berbeda dengan ketika saya membeli router Linksys WRT54GL yang dengan jelas mencantumkan bahwa software yang digunakan berlisensi GPL.

Hal yang segera terpikirkan oleh saya adalah proyek NSLU2-Linux, sebuah proyek yang mengkhususkan diri pada penggunaan Linux pada NAS NSLU2 keluaran Linksys. NSLU2 merupakan device Linux yang sangat populer saat ini, pada chart popularitas Debian, popularitas arsitektur ARM menduduki No 3 karena NSLU2 ini. NSLU2 hemat energi (jauh lebih hemat dibanding PC), dan dapat digunakan sebagai server, mulai dari File Server, Web Server, SQL Server, dan lain-lain. Jika device seharga sekitar 800 ribu rupiah yang saya miliki bisa melakukan hal yang sama dengan NSLU2, tentunya NAS tersebut akan sangat berguna.

Sayangnya kernel default yang diberikan sangat minim fitur, dan saya tidak bisa mengkompilasi kernel baru, karena source code kernel tidak disediakan. Umumnya sulit sekali meminta source code Linux dari perusahaan di Cina, Taiwan, dan Rusia (dan kebetulan perusahaan ini pusatnya di Rusia dan produksinya di Cina). Padahal source code kernel merupakan hak pengguna karena Linux menggunakan lisensi GPL.

Device yang saya beli bermerek Agestar, tadinya saya pikir ini hanya merk yang tidak terkenal, dan memporting Linux ke benda ini tidak akan banyak berguna. Namun setelah diselidiki lebih lanjut, ternyata ada setidaknya setengah lusin merk lain yang memiliki hardware yang sama (Coolmax CN-570, NS-348S, NS-347S, Emprex NSD-100, Revoltec rs049, FT3563 BT), jadi benda ini cukup populer dalam berbagai merk.

Dengan sedikit trik yang saya perolah dari Internet, saya dapat mengakses device saya menggunakan telnet. Dengan perintah-perintah standar seperti dmesg, cat /proc/cpuinfo, cat /proc/meminfo saya mendapatkan informasi berikut mengenai hardware saya: CPU Arm 200Mhz, RAM 32 Mb, Flash Memory (ROM) 8 Mb, USB high speed dan low speed, ethernet 10/100 Mbps.

Melalui perjuangan yang panjang (sekitar 1 bulan waktu luang saya), saya berhasil menginstall Debian Etch versi ARM pada device yang saya miliki ini, dan kini device tersebut dapat digunakan sebagai web server, File server (FTP dan SAMBA), iTunes music server, dan sebagai download station 24 jam untuk mendownload file-file besar dari Internet.

Sekilas Mengenai ARM dan SoC

Banyak pembuat chip yang yang mengintegrasikan prosessor ARM ke dalam SoC (System-on-a-chip) mereka. SoC menggabungkan banyak komponen elektronik ke dalam satu chip, misalnya sebuah chip untuk PDA bisa berisi prosessor, LCD controller, dan digital card reader. Meskipun banyak SoC memiliki prosessor yang sama, umumnya setiap SoC memiliki komponen tambahan yang berbeda-beda.

ARM adalah arsitektur komputer dari ARM Limited. Prosessor ARM banyak digunakan di sistem embedded seperti misalnya ponsel dan PDA. Semua smartphone keluaran Nokia dan Sony Ericsson menggunakan prosessor ARM, semua iPod dan bahkan Apple iPhone menggunakan prosessor ARM. Prosessor ARM hemat energi, dan designnya sederhana. Tidak seperti perusahaan Intel atau AMD, ARM Limited tidak menjual prosessor ARM itu sendiri. ARM Limited hanya menjual design prosessornya ke berbagai perusahaan. Karena setiap perusahaan memiliki keperluannya sendiri-sendiri, maka ada cukup banyak perbedaan antara berbagai prosessor yang berbasis ARM (besar cache, set instruksi yang didukung, dll).

Linux saat ini mendukung banyak jenis prosessor ARM standar, dan mendukung banyak SoC. Sebagian device yang populer masuk ke dalam “mainline kernel” (kernel standar), sebagian lagi didukung dengan menggunakan patch yang bisa didownload dari penyedia SoC tersebut. Satu set SoC, atau satu development board dianggap sebagai suatu platform di Linux. Jika kita ingin membuat Linux berjalan di sebuah device tertentu dengan prosessor yang sudah didukung, kita mengatakan akan memporting Linux ke platform tersebut. Jika kita ingin membuat Linux berjalan di prosessor baru, kita mengatakan akan memporting Linux ke arsitektur baru.

Beberapa perusahaan besar seperti Marvell menyediakan spesifikasi SoC mereka secara lengkap. Sebagian perusahaan lagi, seperti StorLink hanya menyediakan source code, tanpa dokumentasi. Kadang source code yang diberikan hanya untuk Linux versi lama (2.4 atau bahkan sebelumnya).

Memiliki dokumentasi biasanya sangat membantu, tapi tanpa dokumentasi dan source code bukan berarti porting tidak bisa dilakukan. Beberapa PDA (seperti Palm Tungsten E, dan aneka HP iPaq) diporting tanpa dokumentasi. Prosessnya lebih susah, karena programmer harus bisa melakukan reverse engineering. Dalam kasus saya, saya mendapatkan source code, tapi hanya untuk kernel 2.4 dan bukan untuk device yang sama persis.

Mengenai STAR 9104

Dari berbagai tempat di Internet, saya berhasil mengumpulkan informasi berikut ini mengenai NAS yang saya beli:

Platform yang dipakai adalah SoC STAR 9104 dari http://www.StarSemi.com.tw

Prosessor yang dipakai adalah FA526, dari sebuah perusahaan bernama Faraday

Kernel Linux versi 2.4 dari LinkSys WAP2000G dan WRVS4400N ternyata kompatibel dengan casing hard disk tersebut meski tidak semua hardware bisa berjalan. Hardware yang tidak berjalan meliputi I2C, RTC, Button, flash memory dan watchdog timer. Driver pada kernel versi 2.4 ini juga ternyata memiliki beberapa bug.

STR 9104 memiliki built in UART controller, dan bisa dihubungkan ke serial port dengan mudah

Spesifikasi prosessor FA526 ini tidak diberikan sehingga menyulitkan dalam pengembangan kernel 2.6, namun ternyata keberuntungan ada di pihak saya, penyelidikan lebih lanjut menunjukkan bahwa ada SoC lain yang berbasis pada prosessor yang sama, yaitu StorLink dan SoC ini dipakai oleh Icy Box. Icy Box dibuat oleh perusahaan Raidsonic, dan mereka menggunakan kernel 2.6. Ini merupakan titik terang, karena kode spesifik prosessor tidak perlu ditulis lagi. Yang diperlukan dalam porting lebih ke pembuatan aneka macam driver.

Keahlian yang diperlukan

Untuk memporting kernel Linux ke platform baru, keahlian yang dibutuhkan adalah sebagai berikut:

Kemampuan memprogram C, ini wajib karena kernel ditulis dalam C

Kemampuan memahami kode assembly ARM, ini setengah wajib. Sebaiknya Anda bisa setidaknya membaca kode assembly ARM kalau tidak bisa menulisnya

Pemahaman dasar sistem operasi (manajemen memori, interrupt, dll). Buka kembali buku operating system Anda jika sudah lupa

Anda bisa mengkompilasi dan mengkonfigurasi kernel Linux standar. Hal ini cukup mudah dipelajari. Adalah nilai tambah jika Anda sering mengkonfigurasi kernel untuk keperluan sendiri.

Hardware yang dibutuhkan

Selain keahlian, Anda juga butuh beberapa hardware untuk porting kernel. Pertama Anda butuh Hardware target, ini wajib, karena tujuan porting adalah membuat Linux bisa berjalan di hardware baru. Hardware baru ini bisa berupa development board yang khusus Anda beli, atau sebuah hardware yang dijual bebas yang belum pernah dieksplorasi orang lain.

Anda juga perlu komputer untuk development, Sebelum driver-driver dasar bisa berfungsi, Anda tidak akan bisa melakukan apapun di hardware target. Setelah driver dasar (serial console, disk, network) berfungsi, Anda bisa menginstall aneka macam tools (editor, compiler, dll) di hardware target, dan Anda bisa meneruskan mengembangkan driver untuk hardware-hardware yang lain. Saya menyarankan sebaiknya komputer yang dipakai untuk development cukup cepat, karena kadang Anda perlu melakukan rebuild kernel (membersihkan semua kode lalu mengkompilasi lagi), dan hal itu butuh waktu cukup lama.

Tergantung hardware yang Anda miliki, kemungkinan besar Anda akan butuh konektor Serial Port. Serial port ini memiliki tiga fungsi:

Sebagai akses ke boot loader (semacam bios di PC). Ada boot loader yang bisa diakses dari jaringan, sehingga fungsinya bisa digantikan dengan kabel ethernet.

Sebagai console awal untuk melihat output kernel. Output awal kernel tidak bisa ditampilkan via jaringan (karena device jaringan belum aktif), jika device Anda punya layar dan keyboard Anda bisa menggunakannya sebagai console.

Sebagai koneksi untuk debugging. Ini tidak perlu jika Anda punya kabel JTAG (yang harganya cukup mahal). Saya sendiri tidak menggunakan kabel JTAG.

Jika komputer Anda baru dan sudah tidak memiliki port serial lagi, Anda bisa membeli USB to serial. Perlu diperhatikan juga bahwa sebagian besar device embedded tidak beroperasi pada voltase yang sama dengan RS232 pada PC. Baca dengan teliti sebelum Anda menyambungkan apapun. Anda mungkin perlu membuat rangkaian converter dengan IC MAX232 atau MAX323.

Hardware yang saya pakai memakai voltase TTL 3.3V, sehingga saya memerlukan konverter yang berbasis MAX323. Karena tidak ingin repot, saya membeli sebuah kabel data handphone lalu memotong ujungnya. Umumnya kabel data handphone menggunakan serial port TTL 3.3V (kecuali kabel data mini USB), sehingga bisa dipakai daripada menyolder komponen sendiri.

Langkah porting secara umum

Setelah membaca langkah-langkah porting aneka macam arsitektur, saya dapat merangkum langkah-langkah yang diperlukan. Langkah porting yang paling bagus saya temui pada situs www.linux-mips.org yang menjelaskan mengenai Linux pada arsitektur prosessor MIPS. Berdasarkan daftar langkah pada situs tersebut dan berdasarkan pengalaman pribadi, saya dapat menyimpulkan langkah-langkah porting secara umum. Langkah-langkah porting berikut tidak selalu harus dilakukan sesuai urutan ini, mungkin untuk kombinasi hardware tertentu, Anda bisa melewatinya atau melakukannya dalam urutan yang berbeda:

  1. Setup sebuah lingkungan cross-development.

  2. Setup serial port dan buat kode yang mencetak "Hello, world!" melalui port serial

  3. Download kernel terbaru

  4. Tambahkan kode dasar di direktori arch dan include/asm-arch/.

  5. Kompilasi kernel, dan lihat hasilnya (tidak ada hasilnya, karena memang belum ada kode untuk mengoutputkan apapun :), langkah ini hanya untuk mencoba bahwa cross compiler bisa berjalan)

  6. Buat kode untuk early printk dan lihat output dari kernel. Dengan ini Anda bisa melihat output awal kernel.

  7. Buat driver serial driver dan console serial. Dengan ini Anda akan bisa melihat output lengkap kernel, dan Anda bisa berinteraksi dengan aplikasi.

  8. Setup kernel debugger (KGDB). KGDB bisa sangat membantu, tapi sulit disetup jika Anda hanya punya satu port serial (seperti dalam kasus saya).

  9. Jika CPU belum disupport, Anda perlu menulis kode khusus untuk CPU tersebut.

  10. Tulis Kode platform spesifik (timer, IRQ).

  11. Tulis kode untuk mendukung subsistem PCI. Ini diperlukan jika platform Anda mendukung PCI. Jika platform Anda mendukung PCI, kemungkinan device yang lain (seperti ethernet) akan diakses melalui PCI ini.

  12. Tulis kode untuk subsistem USB. Jika device Anda mendukung USB, ini sangat berguna, setelah Anda bisa membuat sistem ini berjalan, Anda bisa menggunakan aneka macam device USB (seperti misalnya USB Ethernet atau USB disk) sehingga Anda bisa mengerjakan driver yang lain dengan lebih mudah.

  13. Tulis driver Ethernet. Jika Anda bisa membuat ethernet bekerja, Anda bisa membuat root filesystem menggunakan NFS, sangat memudahkan untuk membuat lingkungan user.

  14. Buat root file system ROMFS. Jika device Anda tidak punya ethernet, atau driver ethernet terlalu sulit, Anda bisa menggunakan file system ROMFS yang disimpan sebagai ramdisk.

Setup Dokumentasi LXR

Kernel Linux berukuran sangat besar (jutaan baris kode), Dokumentasi kernel adalah sesuatu yang sangat penting. Sayangnya saat ini tidak ada buku yang up to date membahas kernel versi terbaru. Jika Anda punya koneksi Internet yang cepat dan always on waktu development, Anda bisa mengakses situs LXR (http://lxr.linux.no), dan langsung menggunakan dokumentasi yang ada di sana. Dokumentasi pada situs tersebut dihasilkan dari source code kernel terbaru, sehingga selalu up to date.

Jika koneksi Anda lambat, atau tidak selalu ada, sebaiknya Anda menginstall LXR secara lokal. Setup LXR tidak sederhana, ada cukup banyak modul yang perlu diinstall, untuk mempersingkat artikel ini, silakan Anda baca artikel cara menginstall di situs http://lxr.linux.no. Bagi Anda yang suka menggunakan Doxygen, tools tersebut tidak didesign untuk bernavigasi di jutaan baris kode (dibutuhkan waktu sangat lama untuk memproses keseluruhan kernel dan hasilnya pun tidak memuaskan).

Sofware yang dibutuhkan

Tidak banyak software yang dibutuhkan, yang paling perlu hanyalah cross compiler dan editor. Cross compiler akan dijelaskan pada bagian berikut. Mengenai editor, Anda dapat memilih sendiri yang mana yang menurut Anda paling nyaman. Saya sendiri menggunakan Emacs.

Saat ini kernel Linux hanya dapat dikompilasi dengan menggunakan GCC (GNU Compiler Collection), jadi dalam artikel ini, jika disebutkan "compiler" maka yang dimaksud adalah GCC. Untuk mengkompilasi kernel, Anda perlu compiler yang menghasilkan kode untuk CPU target. Kompilator yang menghasilkan kode biner untuk CPU atau sistem operasi lain disebut dengan cross compiler. Umumnya Anda dapat mendownload cross compiler dari aneka situs di Internet. Beberapa distribusi Linux, seperti Debian, juga memungkinkan Anda menginstall langsung package cross compiler. Jika Anda tidak bisa menemukan cross compiler yang cocok, mungkin Anda harus mengkompilasi sendiri source code GCC. Untuk mempermudah kompilasi GCC, Anda bisa menginstall program yang bernama crosstool atau buildroot.

Khusus untuk arsitektur ARM, saat ini ada dua Application Binary Interface (ABI) yang digunakan, standar dan EABI. ABI adalah standar mengenai bagaimana cara pemanggilan kode program dan struktur biner program agar dapat berinteroperasi. EABI adalah ABI yang baru, dan baru didukung Linux belum lama ini. ABI yang digunakan menentukan compiler apa yang perlu Anda gunakan.

Di bagian berikutnya

Pada bagian berikutnya saya akan membahas mengenai pembuatan driver console, pemetaan memori, interrupt dan timer, USB, PCI, serta network driver. Pada bagian terakhir saya akan membahas mengenai cara memporting user land (program/aplikasi) ke sebuah platform baru, dan bagaimana menginstall distribusi Debian ke sebuah platform baru.

blog comments powered by Disqus

Copyright © 2009-2018 Yohanes Nugroho