因为用register_chrdev()函数注册字符设备时,要自己确定主设备号以及注册的主设备号下面的所有次设备号都会被占用,它不适用于只占用几个端口的情况。这里引用新的api函数注册设备号。
一.注册字符设备api函数:
没有指定设备号
参数1:设备号,参数2:次设备号, 参数3:设备数量,参数4:设备名字
指定了设备号
参数1:设备号,参数2:设备数量,参数3:设备名字
注销字符设备后释放设备号
参数1:设备号,参数2:设备数量
二.描述设备结构体:cdev
其中重要的是:ops与dev变量,ops是操作函数集合指针,dev是设备号。
THIS_MODULE是个宏,在内核定义如下
很明显,未定义MODULDE时,this_module值为空,定义了MODULE的话,它的值就为当前模块的值
三.设备注册函数:
参数1:cdev变量指针,参数2:操作设备文件函数集合
四.添加设备函数:cdev_add
参数1:cdev变量指针,参数2:设备号,参数3:设备数量
五.删除设备函数:cdev_del
参数:cdev变量指针
六.以上函数常用的使用方法
先获取设备号
构建file_operations操作集函数和cdev结构体
运用cdev_init注册设备
运用cdev_add添加设备
最后用完后在module_exit中删除设备
七.自动创建设备节点
linux通过udev程序创建和删除程序。我们再用busybox构建根文件系统时,它创建了一个udev的简化版本mdev。由它管理热插拔事件(热插拔事件是指在工作时外接设备的插入与拔出)和设备文件节点的创建与删除
1.创建类class_create()
有些难看懂,看一下其他文件里的用法
参数1:struct moduel*类型指针,参数2:类的名字
返回值:结构体class指针
2.摧毁类class_destroy()
调用时直接传入class的指针即可。
3.设备创建device_create()
创建类的的目的是为了给它传入参数。
参数1:结构体类的指针。参数2:父设备的指针(一般NULL)。参数3:设备号。参数4:可能会用到的数据指针(一般NULL)。参数5:设备名字
返回值:创建好的设备
4.摧毁设备device_destroy()
参数1:设备所处的类.参数2:设备号
自动创建设备文件结点通常放在成功创建设备之后,也就是cdev_add成功之后。之后在卸载设备时,将我们创建的设备文件节点与结构体类删除。在通常使用设备时,我们习惯用一个结构体来描述一个设备。然后在使用这个设备时,将这个结构体赋给file->private_data,设为私有数据。避免其它进程也使用该设备时造成数据混乱。