Skip to content

Linux GPIO Driver (gpiod)

1. GPIO Architecture

User space ↓ /dev/mygpio (char driver) ↓ Kernel driver ↓ gpiod API ↓ GPIO controller ↓ Hardware


2. Legacy vs gpiod

Legacy API (deprecated)

gpio_request()
gpio_direction_output()
gpio_set_value()

Problems: - Not DT-friendly - Platform dependent - Hard to maintain


gpiod API (modern)

devm_gpiod_get()
gpiod_set_value()
gpiod_get_value()

3. Device Tree Binding

led-gpios = <&gpio 17 0>;

Driver:

devm_gpiod_get(dev, "led", ...)

4. Platform Driver Binding

DT: compatible = "myvendor,mygpio-led"

Driver: .of_match_table


5. Descriptor-based Design

  • No global GPIO number
  • Use logical names ("led")

6. devm_ Resource Management

devm_gpiod_get()
  • Auto cleanup on driver remove
  • No manual free needed

7. Common Pitfalls

  • GPIO number ≠ BCM number (Raspberry Pi)
  • dtoverlay reload may leave stale state
  • dmesg | tail can mislead debugging
  • need EOF handling in read()