字符设备驱动入门
一、驱动是"中间层"
应用程序通过 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 → 硬件操作,三者串起来就是字符设备驱动的主线。