Linux'ta user space'den GPIO kontrol etmek için sysfs mi libgpiod mu kullanılmalı? Neden?
Cevap
Güncel sistemlerde libgpiod (GPIO character device, /dev/gpiochipN) kullanılmalıdır. /sys/class/gpio sysfs arayüzü kernel 4.8'den beri deprecated durumdadır ve yeni kernel yapılandırmalarında çoğu zaman kapalıdır (CONFIG_GPIO_SYSFS).
sysfs arayüzünün sorunları
- Global pin numaraları kullanır; bu numaralar kernel sürümüne ve probe sırasına göre değişebilir.
- Süreç çökerse pin "export" edilmiş ve sahipsiz kalır.
- Birden fazla pini aynı anda (atomik) değiştiremezsiniz.
- Her işlem için dosya açma/yazma gerekir, yavaştır.
- Kenar (edge) olaylarında zaman damgası yoktur.
Character device / libgpiod avantajları
- Pinler chip + offset ile ya da isimle (
line-name) adreslenir. - Pin sahipliği dosya tanımlayıcısına bağlıdır; süreç kapanınca otomatik serbest kalır.
- Toplu (bulk) okuma/yazma, pull-up/down, open-drain, debounce ayarı.
- Kesme olayları zaman damgasıyla
poll()üzerinden okunur.
gpiodetect # chip listesi
gpioinfo gpiochip0 # hatlar ve kullanıcıları
gpioset -c gpiochip0 17=1 # libgpiod v2 sözdizimi
gpiomon -c gpiochip0 27 # kenar olaylarını izle/* libgpiod v2 API ile bir pini set etmek (özet) */
struct gpiod_chip *chip = gpiod_chip_open("/dev/gpiochip0");
struct gpiod_line_settings *s = gpiod_line_settings_new();
gpiod_line_settings_set_direction(s, GPIOD_LINE_DIRECTION_OUTPUT);
struct gpiod_line_config *lc = gpiod_line_config_new();
unsigned int off = 17;
gpiod_line_config_add_line_settings(lc, &off, 1, s);
struct gpiod_line_request *req = gpiod_chip_request_lines(chip, NULL, lc);
gpiod_line_request_set_value(req, 17, GPIOD_LINE_VALUE_ACTIVE);Not: libgpiod v1 ile v2 API'leri uyumsuzdur; eski örnek kodlar gpiod_line_get_value() gibi v1 fonksiyonlarını kullanır.
İlgili Gömülü Linux soruları
- User space'den /dev/mem ve mmap ile donanım register'larına erişmek nasıl yapılır? Riskleri ve daha iyi alternatifleri nelerdir?
- Linux kernel'de kesme işleme neden top half ve bottom half olarak ikiye ayrılır? Softirq, tasklet, workqueue ve threaded IRQ arasındaki farklar nelerdir?
- Cross-compilation nedir? Bir cross toolchain hangi bileşenlerden oluşur ve sysroot ne işe yarar?
- Yocto Project ile Buildroot arasındaki farklar nelerdir? Bir ürün için hangisini seçersiniz?
- Bir donanım için kernel modülü (kernel space driver) mi yoksa user space driver mı yazarsınız? Artıları ve eksileri nelerdir?
- Device tree nedir, neden kullanılır? .dts, .dtsi, .dtb ve overlay kavramlarını açıklayın.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.