关于字符设备驱动学习的总结

关于字符设备驱动学习的总结

 一般来说,我们的驱动都是以模块的形式加载进内核里面的。 
 加载驱动的时候输入命令insmod,卸载驱动的时候输入命令rmmod。
 insmod命令后面带的参数是要加载的参数的名称,命令执行就是调用MODULE_INIT( A)
 rmmod命令后面带的参数是要卸载的参数的名称,命令执行就是调用MODULE_EXIT(B)



 *****************************************************************************************************

A函数里面要做的工作就是:
申请一个设备号(register_chrdev)
创建一个类(class_create)
创建类下的设备(class_device_create)
io口映射(iomap)

int register_chrdev(unsigned int major,const char*name,struct file_operations *fops)
major就是我们的主设备号,设为0就是让系统自动分配
name是自己起的设备的名字,随便即可
fops是可以文件操作的结构体,里面包含了这个驱动能对硬件进行的所有操作的集合,比如常见的
read,write

struct class *class_create(struct module *owner, const char *name)
owner一般为THIS_MODULE
name随便即可
调用了这个函数之后,在/sys/class目录下就能看到名为name的文件夹,也就是所谓的创建了类

struct class_device *class_device_create( struct class *cls,
struct class_device *parent,
dev_t devt,
struct device *device,
const char *fmt )
cls就是class_create函数的返回值
parent 不知道干嘛的
devt 应该是次设备号
device 不知道干嘛的
fmt次设备的名字
调用了这个函数之后,在/sys/class/name/ 里面就有你创建的名为device的此设备了。同时,在/dev/下也会有device的设备节点了,就相当于我们在命令行里面输入“mknod device c 主设备号 次设备号”一样。

static struct file_operations my_driver_fops={
.owner=THIS_MODULE,
.open =C .write =D };
C D 都是我们自已编写的函数,这样我们在应用程序里面调用open的时候,实际上就是调用了
这里的C函数;调用write的时候就是调用了D函数


B函数里面做的工作有:
释放一个设备号(unregister_chrdev)
删除类下的设备(class_device_unregister)
删除一个类(class_destroy)
如果有进行io口映射的话还要iounmap

int unregister_chrdev (unsigned int major, const char *name)
major 就是主设备号,即A函数里面申请到的。
name 也是A函数里面的那个

void class_device_unregister(struct class_device *cd)
cd class_device_create的返回值,就是设备节点

void class_destroy(struct class *cls)
cls class_create的返回值,就是创建的那个类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值