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

Bài tập 32.1 · gpio_reg_led

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

Viết gpio_led.c thành module gpio_led.ko, điều khiển LED bằng cách ghi thẳng vào thanh ghi GPIO qua ioremap():

insmod: LED sáng, ghi log LED on, phys=0x... virt=... level=<mức>.
rmmod: LED tắt, ghi log LED off, level=<mức>.

Các bước:

Xác định module phần cứng cần làm việc (bộ điều khiển GPIO của BCM2711) và địa chỉ vật lý của nó.
Xác định các chức năng cần làm (chọn chân output, bật, tắt, đọc mức chân) và thanh ghi tương ứng.
Xác định địa chỉ để thao tác với các thanh ghi: ánh xạ địa chỉ vật lý bằng ioremap(), địa chỉ thanh ghi là địa chỉ ảo cộng offset.
Viết code: đọc và ghi thanh ghi bằng readl() và writel(); gỡ ánh xạ bằng iounmap() khi rmmod.

Module cần MODULE_LICENSE("GPL") và pr_fmt để log có tiền tố gpio_led:. Board ảo tự build, không cần Makefile.

Ví dụ 1:

Input (lệnh shell chạy trong máy ảo):
insmod gpio_led.ko
pin 17
Output:
GPIO17=1

Ví dụ 2:

Input (lệnh shell chạy trong máy ảo):
rmmod gpio_led
pin 17
Output:
GPIO17=0

Đị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, dmesg.

  • Có sẵn lệnh pin 17 (in GPIO17=<mức>) và devmem <địa chỉ> 32.

Định dạng Output:

  • Stdout của đoạn lệnh.

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().