Devicetree Zephyr RTOS – Pengantar

Separuh nafasku hilang bersama dirimu…

Dewa19

Konsep devicetree pada Zephyr RTOS meminjam konsep devicetree pada Kernel Linux saat mendeteksi dan berinteraksi dengan perangkat keras. Konsepnya saja, karena resource RTOS di Mikrokontroler terbatas.

Devicetree adalah pohon :).  Tujuannya untuk deskripsi hardware & konfigurasi init system.

Setiap device pada Mikrokontroler seperti GPIO, I2C, SPI, Timer, dan lain-lain dipresentasikan dengan devicetree. Termasuk juga interupt, pemetaan memory, dan init yang diperlukan saat pertama kali boot.

Hal paradox bagi developer di Zephyr? Disatu sisi developer tidak peduli soal pin atau interface, pokoknya tinggal koding. Abstraksi terjadi di sana-sini. Disisi lain, mengetahui koneksi mikrokontroler dengan interface lewat port dan pin diperlukan. Tanpa devicetree,  Zephyr bagai bebek lumpuh alias gak bisa jalan.

Jika rancang bangun misal STM32 memerlukan pengaturan clock speed di aplikasi yang dibuat, maka bagian ini di Zephyr terletak di devicetree yang berupa file .dts.

Penggalan isi script devicetree blackpill_f411ce.dts. Board ini jalan dengan clock 96MHz. Default nilai ini sudah diberikan. Jika ingin mengubah, lakukan lewat “overlay” agar source asli tidak berubah.

Jika dipakai sebuah board development system, maka perangkat selain mikrokontroler yang terhubung juga didefinisikan. Misal LED dan switch. Struktur devicetree berupa file berakhiran .dts dan .dtsi (include dts).

Saya ambil contoh sebuah board STM32F4 Disco. File dts ini tersusun dari 3 file : stm32f4_ disco.dts sebagai file dts utama untuk board. Kemudian Stm32f407xG.dtsi, dan stm32f4.dtsi. Modifikasi dapat dilakukan lewat file overlay. Biasanya terletak (atau letakkan) di direktori /boards pada struktur direktori project Anda.

Node, Label, dan Property

Ada 4 buah LED dan sebuah user switch yang dipunyai. Ambil contoh LED warna hijau (green_led_4) yang terhubung di Pin 12 pada Port GPIOD. Sedang Switch terhubung di GPIOA Pin 0.

Pada devicetree di atas, leds adalah sebuah node. Sedang  led_4 adalah node juga. Leds adalah bapaknya led_4 tapi sama-sama disebut node. Total ada 5 node pada penggalan devicetree di atas. Anak-anak, sebutkan lima node di atas! ๐Ÿ™‚

Sebuah node (kadang) punya label. Pada contoh di atas, blue_led_6 adalah label dari node led_6. Sedang green_led_4 adalah label dari node led_4. Sedang node leds tidak punya label.

Hati-hati dengan bagian label=”User LD4″. Ini bukan label tapi property. Ciri property adalah “name=value”. Selama ada “=” bukan label tapi property.

Trus compatible? Hal ini terkait binding yang akan dibahas dibagian bawah.

Pada baris pertama, gpios_keys adalah node. Sedang button adalah node juga. Label node dari button adalah user_button. Lho kenapa tidak “Key” labelnya? Key adalah property bukan label. Label diakhiri “:” dilanjut node.
Ada 6 node pada gambar di atas. Dimulai dari root node /, soc, sampai i2c_peripheral_3. Tanda ” -” diubah ” _”. Huruf besar diubah menjadi huruf kecil semua dalam penulisan dibahasa C.
Contoh device I2C. Pada kotak area abu-abu adalah node. Sedang area putih adalah property. Penulisan node i2c@40003000 misalnya menjadi i2c_40003000. Tanda “@” menjadi “_”. Property nantinya akan berkaitan dengan binding.

Sekali lagi ingat, saat koding dalam bahasa C,  tanda “-” dan “@” pada devicetree diubah ke “_” dan semua penulisan menjadi huruf kecil. Contoh i2c@40002000 menjadi i2c_40002000. Contoh lain: sensor-controller menjadi sensor_controller.

Aliases dan chosen node

Selain label untuk referensi ke sebuah node, ada opsi aliases dan chosen. Yach, semakin banyak pilihan semakin pusing memilih ๐Ÿ™‚ Anak kost tanggal tua cuma punya 1 pilihan: makan mie instan lol.

Pada gambar di atas ada 3 pilihan : chosen (zephyr,console), aliases (my_uart), dan label (uart0).

Melihat script di atas, led warna hijau aliasnya adalah led0. Led biru punya alias led3. Sedang user_button aliasnya adalah sw0.

Sebelum lanjut ke binding, lebih baik dipahami soal node, label, property, alias, dan chosen.

Devicetree binding

Devicetree hanya separuh nafas dalam deskripsi hardware. Separuhnya lagi devicetree binding. Damnn!

Devicetree binding memberikan syarat isi node yang valid seperti apa. Speed UART tentu tidak bisa diisi nilai Boolean khan. Kalau pin untuk led baru boleh mode Boolean. Devicetree binding ini punya format file YAML.

Sebuah node devicetree mencari separuh nafasnya di binding lewat property compatible.

Pada gambar di atas, perhatikan devicetree node bagian compatible. Maka binding nya mesti punya compatible yang sama. Dalam hal ini compatible = “foo-company,bar-device”.

Dinyatakan Property num-foos= <3> dibagian devicetree. Sedang bagian binding memberikan ketentuan nilai num-foos mesti bertipe int (integer). Anda akan dimarahi ibu kost jika nilai num-foos=<3.7> misalnya :). Property num-foos wajib ada nilainya karena required=true. Yach, seperti wajib bayar uang kost.

Saat build, binding akan melakukan verifikasi apakah Anda sudah bayar kost eh nilai num-foos yang bernilai 3 itu bertipe integer. Kalau benar, buat file header devicetree.h.

File header macro ini yang nantinya berguna menyediakan nilai property dari node untuk diakses lewat API yang disediakan oleh Zephyr.

Ceritanya, yang bikin devicetree dan binding kerja lembur, yang koding kerja santai sambil nyruput kopi lol.

Contoh soal UART. Yang penggalan atas binding, yang bawah devicetree. Perhatikan bagian compatible mesti sama “manufacturer,serial”. Bagian reg bertipe array, sedang current-speed bertipe integer. Baris required sama-sama bernilai true. Jika bagian current-speed di devicetree tidak ada, maka saat build sistem binding akan berteriak “Hoiii mana current-speednya?!”

Ok, tulisan di atas hanya pengantar. Silahkan lihat manual untuk detailnya. Bagian selanjutnya adalah cara akses devicetree dari C. Tapi bagian ini akan ditulis tersendiri.

Incip-incip Akses devicetree dari bahasa C

Hanya mencicip saja ๐Ÿ™‚ Blink LED!

Pertama, led hijau perlu ditunjuk dahulu dengan DT_ALIAS. Masih ingat soal alias? DT_ALIAS adalah API yang disediakan Zephyr untuk merujuk alias dari suatu node. Dari devicetree, alias led hijau adalah led0.

Contoh blink LED di Zephyr. Check error saya hilangkan agar lebih sederhana dan mudah dipahami.

GPIO_DT_SPEC_GET akan mengakses property node LED0_NODE bagian port dan pin. Kemudian dilakukan konfigurasi agar pin yang terhubung led sebagai output. Terus lakukan toggle selamanya dengan delay 1000ms

Cerita selanjutnya bersambung ๐Ÿ™‚

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 )

Connecting to %s