Catatan Editor:Linux Tertanam secara konsisten menempati peringkat di antara sistem operasi teratas yang digunakan dalam desain sistem tertanam. Dengan pesatnya pertumbuhan minat terhadap Internet of Things (IoT), kemampuan Linux yang disematkan untuk melayani berbagai peran akan terbukti vital dalam mendukung beragam kebutuhan yang ditemukan di setiap lapisan hierarki aplikasi IoT. Pada gilirannya, kemampuan para insinyur untuk menguasai sistem Linux tertanam akan menjadi penting untuk mencapai perkembangan yang cepat dan andal dari sistem yang lebih canggih. Dalam Menguasai Pemrograman Linux Tertanam – Edisi Kedua, penulis Chris Simmonds membawa pembaca pada tur terperinci melintasi luas dan dalamnya sistem operasi penting ini, menggunakan contoh terperinci untuk mengilustrasikan setiap poin kunci.
Dalam kutipan ini, Bab 9, dari buku ini, penulis menjelaskan bagaimana driver perangkat kernel berinteraksi dengan perangkat keras sistem dan bagaimana pengembang dapat menulis driver perangkat dan menggunakannya dalam aplikasi mereka. Angsuran berikut menyajikan kutipan ini pada driver perangkat Linux Tertanam:
• Memahami peran mereka
• Membaca status driver saat runtime
• Driver perangkat di ruang pengguna
• Menulis driver perangkat kernel
• Menemukan konfigurasi perangkat keras
Diadaptasi dari Menguasai Pemrograman Linux Tertanam – Edisi Kedua, oleh Chris Simmonds.
Bab 9. Berinteraksi dengan Driver Perangkat
Driver perangkat kernel adalah mekanisme di mana perangkat keras yang mendasarinya terpapar ke seluruh sistem. Sebagai pengembang sistem tertanam, Anda perlu mengetahui bagaimana driver perangkat ini cocok dengan arsitektur keseluruhan dan cara mengaksesnya dari program ruang pengguna. Sistem Anda mungkin akan memiliki beberapa perangkat keras baru, dan Anda harus mencari cara untuk mengaksesnya. Dalam banyak kasus, Anda akan menemukan bahwa ada driver perangkat yang disediakan untuk Anda, dan Anda dapat mencapai semua yang Anda inginkan tanpa menulis kode kernel apa pun. Misalnya, Anda dapat memanipulasi pin dan LED GPIO menggunakan file di sysfs , dan ada perpustakaan untuk mengakses bus serial, termasuk SPI (Serial Peripheral Interface) dan Saya2C (Sirkuit Terpadu).
Ada banyak tempat untuk mengetahui cara menulis driver perangkat, tetapi hanya sedikit yang memberi tahu Anda mengapa Anda menginginkannya dan pilihan yang Anda miliki dalam melakukannya. Inilah yang ingin saya ulas di sini. Namun, ingatlah bahwa ini bukan buku yang didedikasikan untuk menulis driver perangkat kernel dan bahwa informasi yang diberikan di sini adalah untuk membantu Anda menavigasi wilayah tetapi tidak harus mengatur rumah di sana. Ada banyak buku dan artikel bagus yang akan membantu Anda menulis driver perangkat, beberapa di antaranya tercantum di akhir bab ini.
Dalam bab ini kita akan membahas topik-topik berikut:
Peran driver perangkat
Perangkat karakter
Blokir perangkat
Perangkat jaringan
Mencari tahu tentang driver saat runtime
Menemukan driver perangkat yang tepat
Driver perangkat di ruang pengguna
Menulis driver perangkat kernel
Menemukan konfigurasi perangkat keras
Peran driver perangkat
Seperti yang saya sebutkan di Bab 4, Mengonfigurasi dan Membangun Kernel , salah satu fungsi kernel adalah untuk merangkum banyak antarmuka perangkat keras dari sistem komputer dan menyajikannya secara konsisten ke program ruang pengguna. Kernel memiliki kerangka kerja yang dirancang untuk memudahkan penulisan driver perangkat, yang merupakan bagian dari kode yang menengahi antara kernel di atas dan perangkat keras di bawah. Driver perangkat mungkin ditulis untuk mengontrol perangkat fisik seperti UART atau pengontrol MMC, atau mungkin mewakili perangkat virtual seperti perangkat null ( /dev/null ) atau ramdisk. Satu pengemudi dapat mengontrol beberapa perangkat dengan jenis yang sama.
Kode driver perangkat kernel berjalan pada tingkat hak istimewa yang tinggi, seperti halnya kernel lainnya. Ini memiliki akses penuh ke ruang alamat prosesor dan register perangkat keras. Ini dapat menangani interupsi dan transfer DMA. Itu dapat menggunakan infrastruktur kernel yang canggih untuk sinkronisasi dan manajemen memori. Namun, Anda harus menyadari bahwa ada sisi negatifnya; jika ada yang tidak beres pada driver buggy, itu bisa benar-benar salah dan menurunkan sistem. Akibatnya, ada prinsip bahwa driver perangkat harus sesederhana mungkin dengan hanya memberikan informasi ke aplikasi di mana keputusan nyata dibuat. Anda sering mendengar pernyataan ini sebagai tidak ada kebijakan di kernel . Ini adalah tanggung jawab ruang pengguna untuk menetapkan kebijakan yang mengatur perilaku sistem secara keseluruhan. Misalnya, memuat modul kernel sebagai respons terhadap kejadian eksternal, seperti mencolokkan perangkat USB baru, adalah tanggung jawab program ruang pengguna, udev , bukan kernel. Kernel hanya menyediakan sarana untuk memuat modul kernel.
Di Linux, ada tiga tipe utama device driver:
Karakter :Ini untuk I/O tanpa buffer dengan beragam fungsi dan lapisan tipis antara kode aplikasi dan driver. Ini adalah pilihan pertama saat menerapkan driver perangkat khusus.
Blokir :Ini memiliki antarmuka yang disesuaikan untuk blok I/O ke dan dari perangkat penyimpanan massal. Ada lapisan buffering tebal yang dirancang untuk membuat disk membaca dan menulis secepat mungkin, yang membuatnya tidak cocok untuk hal lain.
Jaringan :Ini mirip dengan perangkat blok tetapi digunakan untuk mengirim dan menerima paket jaringan daripada blok disk.
Ada juga tipe keempat yang menampilkan dirinya sebagai sekelompok file di salah satu sistem file semu. Misalnya, Anda dapat mengakses driver GPIO melalui sekelompok file di /sys/class/gpio , seperti yang akan saya jelaskan nanti dalam bab ini. Mari kita mulai dengan melihat lebih detail ketiga jenis perangkat dasar.
Perangkat karakter
Perangkat karakter diidentifikasi di ruang pengguna oleh file khusus yang disebut device node . Nama file ini dipetakan ke driver perangkat menggunakan nomor mayor dan minor yang terkait dengannya. Secara garis besar, angka utama memetakan node perangkat ke driver perangkat tertentu, dan nomor kecil memberitahu driver antarmuka mana yang sedang diakses. Misalnya, node perangkat dari port serial pertama pada ARM Serbaguna PB bernama /dev/ttyAMA0 , dan memiliki nomor utama 204 dan nomor kecil 64. Perangkat node untuk port serial kedua memiliki nomor utama yang sama, karena ditangani oleh driver perangkat yang sama, tetapi nomor minornya adalah 65. Kita dapat melihat nomor untuk keempat port serial dari daftar direktori di sini:
# ls -l /dev/ttyAMA*crw-rw---- 1 root root 204, 64 Jan 1 1970 /dev/ttyAMA0crw-rw---- 1 root root 204, 65 Jan 1 1970 /dev/ ttyAMA1crw-rw---- 1 root root 204, 66 Jan 1 1970 /dev/ttyAMA2crw-rw---- 1 root root 204, 67 Jan 1 1970 /dev/ttyAMA3
Daftar nomor mayor dan minor standar dapat ditemukan di dokumentasi kernel di Documentation/devices.txt . Daftar ini tidak sering diperbarui dan tidak menyertakan perangkat ttyAMA yang dijelaskan dalam paragraf sebelumnya. Namun demikian, jika Anda melihat kode sumber kernel di driver/tty/serial/amba-pl011.c , Anda akan melihat di mana nomor mayor dan minor dideklarasikan:
Di mana ada lebih dari satu instance perangkat, seperti driver ttyAMA, konvensi untuk membentuk nama node perangkat adalah mengambil nama dasar, ttyAMA, dan menambahkan nomor instance dari 0 hingga 3 dalam contoh ini.
Seperti yang saya sebutkan di Bab 5, Membangun Sistem File Root , node perangkat dapat dibuat dengan beberapa cara:
devtmpfs :Device node dibuat ketika device driver mendaftarkan antarmuka perangkat baru menggunakan nama dasar yang disediakan oleh driver (ttyAMA ) dan nomor contoh.
udev atau mdev (tanpa devtmpfs ):Pada dasarnya sama dengan devtmpfs , kecuali bahwa program daemon ruang pengguna harus mengekstrak nama perangkat dari sysfs dan buat node. Saya akan berbicara tentang sysfs
mknod :Jika Anda menggunakan node perangkat statis, node tersebut dibuat secara manual menggunakan mknod .
Anda mungkin mendapat kesan dari angka yang saya gunakan di atas bahwa angka mayor dan minor adalah angka 8-bit dalam kisaran 0 hingga 255. Faktanya, dari Linux 2.6 dan seterusnya, angka mayor adalah 12 bit, yang memberikan angka yang valid dari 1 hingga 4.095, dan bilangan minornya adalah 20 bit, dari 0 hingga 1.048.575.