Thursday

19-06-2025 Vol 19

How to Control GPIO on OK3568-C Using libgpiod (Buildroot Linux 4.19.206)

Mengontrol GPIO di OK3568-C Menggunakan libgpiod (Buildroot Linux 4.19.206)

General Purpose Input/Output (GPIO) adalah pin serbaguna pada mikrokontroler atau sistem on a chip (SoC) yang dapat dikonfigurasi sebagai input atau output digital. Pin ini sangat penting untuk berinteraksi dengan perangkat keras eksternal, seperti LED, sensor, relay, dan banyak lagi. Dalam tutorial ini, kita akan mempelajari cara mengontrol GPIO pada OK3568-C menggunakan pustaka libgpiod di lingkungan Buildroot Linux 4.19.206.

Daftar Isi

  1. Pendahuluan
    • Apa itu GPIO?
    • Apa itu libgpiod?
    • Mengapa Menggunakan libgpiod?
    • OK3568-C dan Buildroot Linux 4.19.206
  2. Persiapan Lingkungan
    • Menyiapkan Buildroot
    • Membangun Image Buildroot untuk OK3568-C
    • Mem-flash Image ke OK3568-C
    • Akses Shell OK3568-C
  3. Memasang libgpiod
    • Menambahkan libgpiod ke Buildroot
    • Membangun Kembali Image Buildroot
  4. Identifikasi Pin GPIO
    • Memahami Skema Penamaan GPIO
    • Menemukan Chip GPIO yang Tepat
    • Mengidentifikasi Nomor Garis GPIO
  5. Menggunakan libgpiod dari Baris Perintah
    • gpiodetect: Mendeteksi Chip GPIO
    • gpioinfo: Mendapatkan Informasi tentang Chip GPIO dan Garis
    • gpioset: Mengatur Output GPIO
    • gpioget: Membaca Input GPIO
    • gpiomon: Memantau Perubahan GPIO
  6. Menggunakan libgpiod dalam Program C/C++
    • Membuat Proyek C/C++
    • Menyertakan Header libgpiod
    • Menginisialisasi Chip dan Garis GPIO
    • Mengatur Output GPIO
    • Membaca Input GPIO
    • Menangani Kesalahan
    • Contoh Kode Lengkap
  7. Troubleshooting
    • Permasalahan Izin
    • GPIO Tidak Berfungsi Seperti yang Diharapkan
    • Kesalahan libgpiod Umum
  8. Praktik Terbaik
    • Menggunakan Resistansi Pull-Up/Pull-Down
    • Melindungi Pin GPIO
    • Dokumentasi Kode
  9. Kesimpulan

1. Pendahuluan

Apa itu GPIO?

GPIO (General Purpose Input/Output) adalah pin serbaguna yang ditemukan pada mikrokontroler dan SoC (System on a Chip). Pin ini dapat dikonfigurasi secara terprogram untuk bertindak sebagai input atau output digital. Sebagai input, pin GPIO dapat mendeteksi status perangkat eksternal, seperti sakelar, sensor, atau tombol. Sebagai output, pin GPIO dapat mengontrol perangkat eksternal, seperti LED, relay, atau motor.

Pin GPIO merupakan jembatan penting antara perangkat lunak dan perangkat keras, memungkinkan mikrokontroler untuk berinteraksi dengan dunia luar.

Apa itu libgpiod?

libgpiod adalah pustaka ruang pengguna (userspace) untuk berinteraksi dengan subsistem GPIO di kernel Linux. Pustaka ini menyediakan API yang stabil dan mudah digunakan untuk mengontrol GPIO dari aplikasi ruang pengguna. Pustaka ini menggantikan metode yang lebih lama dan kurang fleksibel untuk mengakses GPIO melalui /sys/class/gpio.

libgpiod menyediakan serangkaian alat baris perintah (command-line) dan API pemrograman untuk mengelola dan menggunakan GPIO.

Mengapa Menggunakan libgpiod?

Berikut adalah beberapa alasan mengapa menggunakan libgpiod lebih disukai daripada metode yang lebih lama:

  • API yang Stabil: libgpiod menyediakan API yang lebih stabil dan terdokumentasi dengan baik dibandingkan dengan antarmuka /sys/class/gpio.
  • Fleksibilitas: Mendukung berbagai operasi GPIO, termasuk pengaturan output, membaca input, memantau interupsi, dan mengelola beberapa baris secara bersamaan.
  • Performa: Dirancang untuk performa dan efisiensi, meminimalkan overhead untuk operasi GPIO.
  • Alat Baris Perintah: Menyediakan serangkaian alat baris perintah yang berguna untuk debugging, pengujian, dan mengontrol GPIO secara langsung.
  • Dukungan: Mendapatkan dukungan yang baik dari komunitas Linux dan terus dikembangkan dan dipelihara.

OK3568-C dan Buildroot Linux 4.19.206

OK3568-C adalah papan pengembangan yang menampilkan prosesor Rockchip RK3568. Ini adalah platform yang kuat dan serbaguna yang cocok untuk berbagai aplikasi tertanam. Buildroot adalah sistem build Linux ringan yang memungkinkan Anda membuat image sistem yang disesuaikan untuk platform tertanam. Buildroot Linux 4.19.206 adalah versi spesifik dari Buildroot yang akan kita gunakan dalam tutorial ini.

Kombinasi OK3568-C dan Buildroot Linux menyediakan fondasi yang sangat baik untuk mengembangkan aplikasi tertanam yang membutuhkan kontrol GPIO.

2. Persiapan Lingkungan

Menyiapkan Buildroot

Jika Anda belum menginstal Buildroot, Anda perlu mengunduh dan mengekstraknya. Anda bisa mendapatkan Buildroot dari situs web resminya: https://buildroot.org/

  1. Unduh Buildroot:

    Unduh rilis Buildroot terbaru dari situs web Buildroot atau menggunakan wget:

    wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
  2. Ekstrak Buildroot:

    Ekstrak arsip yang diunduh:

    tar -xzvf buildroot-2024.02.tar.gz

    Ganti buildroot-2024.02.tar.gz dengan nama file yang sebenarnya yang Anda unduh.

  3. Pindah ke Direktori Buildroot:
    cd buildroot-2024.02

    Ganti buildroot-2024.02 dengan nama direktori yang diekstrak.

Membangun Image Buildroot untuk OK3568-C

Untuk membangun image Buildroot untuk OK3568-C, Anda perlu mengonfigurasi Buildroot dengan opsi yang benar. Ini biasanya melibatkan pemilihan konfigurasi defconfig yang sesuai dan membuat penyesuaian yang diperlukan.

  1. Konfigurasi Buildroot:

    Gunakan konfigurasi defconfig yang sesuai untuk OK3568-C. Konfigurasi defconfig ini menyediakan konfigurasi dasar untuk papan Anda. Anda mungkin perlu mencari konfigurasi defconfig yang spesifik untuk OK3568-C atau yang serupa. Jika tidak ada konfigurasi defconfig yang spesifik, Anda mungkin perlu membuat konfigurasi defconfig dari awal, atau menggunakan konfigurasi generik dan menyesuaikannya.

    Untuk contoh, asumsikan ada konfigurasi defconfig bernama ok3568-c_defconfig. Anda dapat mengonfigurasi Buildroot menggunakan perintah berikut:

    make ok3568-c_defconfig

    Jika tidak ada defconfig, Anda dapat memulai dengan konfigurasi menu:

    make menuconfig

    Di dalam menuconfig, navigasikan ke:

    • Target architecture: ARM (atau ARM 64 tergantung versi dan spesifikasi OK3568-C)
    • Target Architecture Variant: Pilih varian yang sesuai (misalnya, Cortex-A55)
    • Board vendor: [Sesuaikan jika ada pilihan spesifik]
    • Board name: [Sesuaikan jika ada pilihan spesifik]

    Simpan konfigurasi Anda.

  2. Sesuaikan Konfigurasi (Opsional):

    Anda mungkin perlu menyesuaikan konfigurasi lebih lanjut untuk memenuhi kebutuhan spesifik Anda. Anda dapat menggunakan menuconfig untuk menyesuaikan berbagai opsi, seperti kernel, sistem file, dan paket.

    make menuconfig
  3. Bangun Image Buildroot:

    Setelah Anda mengonfigurasi Buildroot, Anda dapat membangun image menggunakan perintah berikut:

    make

    Proses build mungkin memakan waktu beberapa menit hingga beberapa jam, tergantung pada kecepatan komputer Anda dan konfigurasi Anda.

Mem-flash Image ke OK3568-C

Setelah image Buildroot selesai dibangun, Anda perlu mem-flashnya ke papan OK3568-C. Proses ini biasanya melibatkan penggunaan alat flashing, seperti dd atau alat khusus yang disediakan oleh produsen papan.

  1. Siapkan Kartu SD:

    Identifikasi perangkat blok yang sesuai dengan kartu SD Anda. Pastikan Anda memilih perangkat yang benar, karena ini dapat menyebabkan kehilangan data jika Anda memilih yang salah.

    Anda dapat menggunakan perintah lsblk untuk melihat daftar perangkat blok Anda.

    lsblk
  2. Flash Image:

    Gunakan perintah dd untuk mem-flash image Buildroot ke kartu SD. Ganti /dev/sdX dengan perangkat blok yang sesuai dengan kartu SD Anda dan output/images/rootfs.ext4 (atau nama file yang relevan dari output build) dengan jalur ke image rootfs Anda. Perintah ini akan menghapus semua data yang ada di kartu SD.

    sudo dd if=output/images/rootfs.ext4 of=/dev/sdX bs=4M status=progress conv=fsync

    Anda mungkin juga perlu mem-flash image bootloader dan image kernel secara terpisah, tergantung pada persyaratan papan Anda. Konsultasikan dokumentasi OK3568-C untuk mengetahui petunjuk khusus tentang cara mem-flash papan.

Akses Shell OK3568-C

Setelah Anda mem-flash image ke papan OK3568-C, Anda dapat mem-boot papan dan mengakses shell. Ini biasanya dilakukan melalui koneksi serial atau SSH.

  1. Koneksi Serial:

    Sambungkan kabel serial dari komputer Anda ke header serial di papan OK3568-C. Gunakan program terminal, seperti minicom atau PuTTY, untuk terhubung ke papan. Anda mungkin perlu mengonfigurasi pengaturan serial yang benar (baud rate, data bits, parity, stop bits) agar sesuai dengan papan Anda.

  2. SSH:

    Jika papan Anda dikonfigurasi dengan SSH, Anda dapat terhubung ke papan menggunakan perintah ssh. Anda perlu mengetahui alamat IP papan. Alamat IP biasanya diperoleh melalui DHCP atau dikonfigurasi secara statis.

    ssh root@<alamat_ip_papan>

    Kata sandi default untuk pengguna root di Buildroot biasanya kosong, atau ‘root’.

3. Memasang libgpiod

Secara default, libgpiod mungkin tidak terpasang dalam image Buildroot Anda. Anda perlu mengaktifkannya di konfigurasi Buildroot dan membangun kembali image.

Menambahkan libgpiod ke Buildroot

  1. Buka Konfigurasi Buildroot:

    Jalankan perintah make menuconfig di direktori Buildroot.

    make menuconfig
  2. Aktifkan libgpiod:

    Navigasikan ke Target packages -> Hardware handling -> libgpiod dan pilihnya. Pastikan tanda ‘*’ muncul di samping libgpiod.

  3. Simpan Konfigurasi:

    Simpan perubahan Anda dan keluar dari menuconfig.

Membangun Kembali Image Buildroot

  1. Bangun Kembali Image:

    Bangun kembali image Buildroot menggunakan perintah make.

    make
  2. Flash Image:

    Flash image yang dibangun kembali ke papan OK3568-C Anda menggunakan langkah-langkah yang dijelaskan sebelumnya.

4. Identifikasi Pin GPIO

Sebelum Anda dapat menggunakan GPIO, Anda perlu mengidentifikasi pin GPIO yang tepat yang ingin Anda kontrol. Ini melibatkan pemahaman skema penamaan GPIO dan menemukan chip GPIO yang benar.

Memahami Skema Penamaan GPIO

Skema penamaan GPIO dapat bervariasi tergantung pada vendor SoC. Secara umum, pin GPIO diberi nama menggunakan konvensi seperti GPIOx_y, di mana x adalah nomor bank GPIO dan y adalah nomor pin dalam bank itu. Penting untuk berkonsultasi dengan dokumentasi OK3568-C untuk memahami skema penamaan yang tepat untuk papan Anda.

Dokumentasi skematik dan papan adalah teman terbaik Anda dalam memahami penamaan GPIO.

Menemukan Chip GPIO yang Tepat

OK3568-C mungkin memiliki beberapa chip GPIO. Anda dapat menggunakan alat gpiodetect untuk mencantumkan semua chip GPIO yang tersedia di sistem.

gpiodetect

Perintah ini akan menampilkan daftar chip GPIO dan nama-nama mereka, seperti gpiochip0, gpiochip1, dll.

Mengidentifikasi Nomor Garis GPIO

Setelah Anda mengidentifikasi chip GPIO yang benar, Anda perlu mengidentifikasi nomor garis GPIO yang sesuai dengan pin fisik yang ingin Anda kontrol. Anda dapat menggunakan alat gpioinfo untuk mendapatkan informasi tentang chip GPIO dan garis-garisnya.

gpioinfo gpiochip0

Ganti gpiochip0 dengan nama chip GPIO yang ingin Anda periksa. Perintah ini akan menampilkan informasi tentang semua garis GPIO pada chip tersebut, termasuk nama, offset, dan statusnya. Cari garis yang sesuai dengan pin fisik yang ingin Anda kontrol.

5. Menggunakan libgpiod dari Baris Perintah

libgpiod menyediakan serangkaian alat baris perintah yang berguna untuk mengontrol GPIO.

gpiodetect: Mendeteksi Chip GPIO

Alat gpiodetect mencantumkan semua chip GPIO yang tersedia di sistem.

gpiodetect

Output akan menunjukkan nama chip (misalnya, gpiochip0) dan labelnya (misalnya, “rk808-gpio”).

gpioinfo: Mendapatkan Informasi tentang Chip GPIO dan Garis

Alat gpioinfo menampilkan informasi tentang chip GPIO tertentu dan garis-garisnya.

gpioinfo gpiochip0

Output akan menunjukkan nama chip, jumlah garis, dan informasi tentang setiap garis, termasuk offset, nama, dan statusnya.

gpioset: Mengatur Output GPIO

Alat gpioset mengatur output GPIO ke nilai tertentu.

gpioset gpiochip0 17=1

Perintah ini akan mengatur garis GPIO dengan offset 17 pada chip gpiochip0 ke nilai tinggi (1). Untuk mengatur garis ke nilai rendah (0), gunakan:

gpioset gpiochip0 17=0

Anda dapat mengatur beberapa garis sekaligus:

gpioset gpiochip0 17=1 18=0 19=1

gpioget: Membaca Input GPIO

Alat gpioget membaca nilai input GPIO.

gpioget gpiochip0 17

Perintah ini akan menampilkan nilai garis GPIO dengan offset 17 pada chip gpiochip0 (0 atau 1).

gpiomon: Memantau Perubahan GPIO

Alat gpiomon memantau perubahan pada nilai GPIO dan menampilkan informasi ketika nilai berubah.

gpiomon gpiochip0 -l 17

Perintah ini akan memantau garis GPIO dengan offset 17 pada chip gpiochip0. Opsi -l menentukan garis yang akan dipantau.

6. Menggunakan libgpiod dalam Program C/C++

Anda juga dapat menggunakan libgpiod dalam program C/C++ untuk mengontrol GPIO. Ini memungkinkan Anda untuk membuat aplikasi yang lebih kompleks yang berinteraksi dengan perangkat keras.

Membuat Proyek C/C++

Buat direktori baru untuk proyek Anda dan buat file C/C++ sumber (misalnya, gpio_control.c).

Menyertakan Header libgpiod

Sertakan header libgpiod di file sumber Anda:

#include <gpiod.h>

Menginisialisasi Chip dan Garis GPIO

Gunakan fungsi gpiod_chip_open() untuk membuka chip GPIO dan fungsi gpiod_chip_get_line() untuk mendapatkan garis GPIO.

const char *chipname = "gpiochip0";
  unsigned int line_num = 17;
  struct gpiod_chip *chip;
  struct gpiod_line *line;

  chip = gpiod_chip_open(chipname);
  if (!chip) {
    perror("Open chip failed");
    return 1;
  }

  line = gpiod_chip_get_line(chip, line_num);
  if (!line) {
    perror("Get line failed");
    gpiod_chip_close(chip);
    return 1;
  }

Mengatur Output GPIO

Gunakan fungsi gpiod_line_request_output() untuk meminta garis GPIO sebagai output dan fungsi gpiod_line_set_value() untuk mengatur nilainya.

int ret = gpiod_line_request_output(line, "gpio_control", 0);
  if (ret < 0) {
    perror("Request line as output failed");
    gpiod_chip_close(chip);
    return 1;
  }

  ret = gpiod_line_set_value(line, 1);
  if (ret < 0) {
    perror("Set line value failed");
    gpiod_chip_close(chip);
    return 1;
  }

Membaca Input GPIO

Gunakan fungsi gpiod_line_request_input() untuk meminta garis GPIO sebagai input dan fungsi gpiod_line_get_value() untuk membaca nilainya.

int ret = gpiod_line_request_input(line, "gpio_control");
  if (ret < 0) {
    perror("Request line as input failed");
    gpiod_chip_close(chip);
    return 1;
  }

  int value = gpiod_line_get_value(line);
  if (value < 0) {
    perror("Get line value failed");
    gpiod_chip_close(chip);
    return 1;
  }

  printf("GPIO value: %d\n", value);

Menangani Kesalahan

Selalu periksa nilai kembalian fungsi libgpiod untuk kesalahan. Tangani kesalahan dengan tepat untuk memastikan program Anda stabil dan andal.

Contoh Kode Lengkap

Berikut adalah contoh kode lengkap yang menunjukkan cara mengontrol GPIO menggunakan libgpiod di C/C++:

#include <stdio.h>
  #include <gpiod.h>
  #include <unistd.h>

  int main() {
    const char *chipname = "gpiochip0";
    unsigned int line_num = 17;
    struct gpiod_chip *chip;
    struct gpiod_line *line;
    int ret;

    chip = gpiod_chip_open(chipname);
    if (!chip) {
      perror("Open chip failed");
      return 1;
    }

    line = gpiod_chip_get_line(chip, line_num);
    if (!line) {
      perror("Get line failed");
      gpiod_chip_close(chip);
      return 1;
    }

    ret = gpiod_line_request_output(line, "gpio_control", 0);
    if (ret < 0) {
      perror("Request line as output failed");
      gpiod_chip_close(chip);
      return 1;
    }

    printf("Turning GPIO %d on for 5 seconds\n", line_num);
    ret = gpiod_line_set_value(line, 1);
    if (ret < 0) {
      perror("Set line value failed");
      gpiod_chip_close(chip);
      return 1;
    }

    sleep(5);

    printf("Turning GPIO %d off\n", line_num);
    ret = gpiod_line_set_value(line, 0);
    if (ret < 0) {
      perror("Set line value failed");
      gpiod_chip_close(chip);
      return 1;
    }

    gpiod_chip_close(chip);
    return 0;
  }
  

Untuk mengompilasi kode ini, Anda perlu menautkan ke pustaka libgpiod:

gcc gpio_control.c -lgpiod -o gpio_control

7. Troubleshooting

Permasalahan Izin

Jika Anda mendapatkan kesalahan izin saat mencoba mengakses GPIO, pastikan pengguna Anda memiliki izin yang diperlukan. Anda dapat menambahkan pengguna Anda ke grup gpio:

sudo usermod -a -G gpio $USER

Anda mungkin perlu keluar dan masuk kembali agar perubahan berlaku.

GPIO Tidak Berfungsi Seperti yang Diharapkan

Jika GPIO tidak berfungsi seperti yang diharapkan, periksa hal berikut:

  • Sambungan Perangkat Keras: Pastikan perangkat keras Anda terhubung dengan benar ke pin GPIO yang benar.
  • Konfigurasi GPIO: Pastikan Anda telah mengonfigurasi GPIO sebagai input atau output yang benar.
  • Level Tegangan: Pastikan level tegangan pada pin GPIO sesuai dengan perangkat keras Anda.

Kesalahan libgpiod Umum

Berikut adalah beberapa kesalahan libgpiod umum dan cara memperbaikinya:

  • “Open chip failed”: Pastikan nama chip GPIO yang Anda tentukan benar.
  • “Get line failed”: Pastikan nomor garis GPIO yang Anda tentukan benar dan garis tersebut tersedia.
  • “Request line as output/input failed”: Pastikan garis GPIO tidak digunakan oleh driver lain.

8. Praktik Terbaik

Menggunakan Resistansi Pull-Up/Pull-Down

Saat menggunakan GPIO sebagai input, sering kali berguna untuk menggunakan resistansi pull-up atau pull-down untuk memastikan status yang terdefinisi dengan baik saat tidak ada input eksternal. Resistansi pull-up menarik pin ke logika tinggi, sementara resistansi pull-down menarik pin ke logika rendah. OK3568-C mungkin memiliki resistansi pull-up/pull-down internal yang dapat Anda aktifkan melalui perangkat lunak. Namun, untuk keandalan, sering kali lebih baik menggunakan resistor eksternal.

Melindungi Pin GPIO

Pin GPIO rentan terhadap kerusakan akibat tegangan berlebih atau arus berlebih. Untuk melindungi pin GPIO Anda, gunakan resistor seri untuk membatasi arus dan dioda pelindung TVS (Transient Voltage Suppression) untuk melindungi terhadap lonjakan tegangan.

Dokumentasi Kode

Selalu dokumentasikan kode Anda dengan jelas dan ringkas. Sertakan komentar untuk menjelaskan tujuan setiap pin GPIO, konfigurasi, dan fungsi. Ini akan memudahkan Anda dan orang lain untuk memahami dan memelihara kode Anda.

9. Kesimpulan

Dalam tutorial ini, kita telah mempelajari cara mengontrol GPIO pada OK3568-C menggunakan pustaka libgpiod di lingkungan Buildroot Linux 4.19.206. Kita telah membahas cara menyiapkan lingkungan build, memasang libgpiod, mengidentifikasi pin GPIO, menggunakan alat baris perintah libgpiod, dan menggunakan libgpiod dalam program C/C++. Dengan pengetahuan ini, Anda sekarang dapat mulai mengembangkan aplikasi tertanam yang berinteraksi dengan perangkat keras menggunakan GPIO.

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *