驱动第二发:字符设备驱动程序
来自个人维基
基本分为两大步骤:
动态获取设备号
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这个结构体中函数的实现上。