驱动第二发:字符设备驱动程序

来自个人维基
2015年5月6日 (三) 16:12Hovercool讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

基本分为两大步骤:

动态获取设备号

result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull");
scull_major = MAJOR(dev);

注册设备

内核内部使用struct cdev结构来表示字符设备,因此在内核调用设备之前,必须分配并注册一个或多个cdev结构:

struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;

将其初始化:

cdev_init(my_cdev, &scull_fops);

add至内核:

err = cdev_add(my_cdev, devno, 1);

移除已注册的字符设备:

cdev_del(my_cdev);

最后,最好再编写一个脚本,用于加载驱动程序模块:

可以利用awk这类工具从 /proc/devices中获取信息,并在 /dev目录中创建设置文件。


ps.如此看来一个驱动程序的增加在步骤上似乎并不复杂,但驱动的核心在于scull_fops的编写上,因为在linux中,所有的设备都虚拟为一个文件,如此便能方便地运用通道等现成的工具对设备进行控制,所以驱动的核心内容都在于 file_operation这个结构体中函数的实现上。