Linux 字符设备驱动开发:从零写一个点灯驱动

字符设备驱动入门

一、驱动是"中间层"

应用程序通过 open / read / write 操作文件,驱动则把这些系统调用翻译成硬件操作

二、核心结构体

static struct file_operations led_fops = {
  .owner = THIS_MODULE,
  .open  = led_open,
  .write = led_write,   // 用户在写设备节点时触发
};

三、注册与注销

static int __init led_init(void) {
  alloc_chrdev_region(&dev_no, 0, 1, "led");  // 申请设备号
  cdev_add(&led_cdev, dev_no, 1);             // 注册字符设备
  return 0;
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");

四、写入点灯

ssize_t led_write(struct file *f, const char __user *buf,
                  size_t len, loff_t *off) {
  copy_from_user(&val, buf, 1);  // 拷贝用户态数据
  gpio_set_value(LED_PIN, val);  // 控制 GPIO
  return len;
}

五、加载测试

insmod led.ko          # 加载驱动
echo 1 > /dev/led      # 点亮 LED

小结

设备号 → file_operations → 硬件操作,三者串起来就是字符设备驱动的主线。

评论(10)