DEVLINUX ACADEMYVề bài họcHọc thử miễn phíĐăng ký học
Bài 30Bài tập 32.2 · gpio_led_cdev

Bài tập 32.2 · gpio_led_cdev

Trung bìnhC (C11) · Pi 4 ảo

File mẫu gpio_led_cdev.c là driver /dev/led của bài 29.4, LED vẫn là biến led_on. Ghép với bài 30.1 để /dev/led điều khiển LED thật:

echo on > /dev/led: LED sáng. echo off > /dev/led: LED tắt. Ghi chuỗi khác: lỗi -EINVAL.
cat /dev/led: in on hoặc off theo mức thật của GPIO17.
LED tắt lúc nạp module và khi rmmod.

Gợi ý:

led_init(): ioremap() rồi đặt GPIO17 là output (như bài 30.1).
Viết led_set() bằng GPSET0 và GPCLR0, dùng trong led_write() thay cho led_on.
Viết led_get() bằng GPLEV0, dùng trong led_read() và log.
Thêm nhãn err_map có iounmap() cho nhánh lỗi, và tắt LED rồi iounmap() trong led_exit().

Ví dụ 1:

Input (lệnh shell chạy trong máy ảo):
insmod gpio_led_cdev.ko
echo on > /dev/led
pin 17
cat /dev/led
Output:
GPIO17=1
on

Ví dụ 2:

Input (lệnh shell chạy trong máy ảo):
[ -c /dev/led ] || insmod gpio_led_cdev.ko
echo off > /dev/led
pin 17
cat /dev/led
Output:
GPIO17=0
off

Định dạng Input (lệnh shell):

  • Mỗi test là một đoạn lệnh shell chạy trong máy ảo Raspberry Pi 4: insmod, rmmod, echo, cat.

  • Có sẵn lệnh pin 17 (in GPIO17=<mức>).

Định dạng Output:

  • Stdout của đoạn lệnh. Ghi giá trị sai thì test in mã thoát bằng echo $?.

Ràng buộc:

  • Mỗi test tối đa 5 s. Kernel Oops thì test đó bị chấm lỗi.
  • Không dùng gpiolib (gpio_request, gpiod_*) và không dùng request_mem_region().