tiny6410 蜂鸣器字符设备驱动<1>

这两周主要学习了字符设备驱动、杂项设备驱动以及驱动程序设计的核心理论与技巧。完成了一个蜂鸣器的字符设备驱动和一个LED杂项设备驱动。做一下总结。

 

        字符设备驱动:字符设备驱动是基本的串行输入输出驱动,将一些按字节、字进行读取、写入的设备做成驱动模块。Insmod装载驱动模块到内核,则用户空间与内核空间的交互就可以达成控制设备的目的。为了方便驱动的设计与调试,将驱动做成模块obj-m。

        字符设备设计模式:内核提供了一套字符设备的接口,利用这些接口完成字符设备的注册和注销。

        注册:

                1、获取设备号:字符设备的设备后数据类型为dev_t,用函数MKDEV(MAJOR,MINOR)获得设备号。但还要向内核申请到这一个设备号(想要的设备号与实际可以得到 的设备号的区别)。因此还要通过静态获取设备号或者动态获取设备号(区别是,主设备号是否为0)。静态申请获取设备号的前提是已知设备号的情况。动态申请获 取设备号则是未知的,但可以避免设备号冲突。在使用动态申请获取设备号时,函数调用成功会将设备号放入到参数dev_t dev中这时应该用MAJOR(dev)获得主设 备号并在成功注册字符设备后将信息打印出来,利于创建设备结点。

                          int register_chrdev_region(dev_tfrom,unsigned count,const char *name);

                          intalloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned count,const char*name);

          如果函数调用发生错误,返回小于0的值。

                2、初始化化字符设备:字符设备结构体(struct cdev)的初始化包括file_operations、owner。file_oerations包含有字符设备的控制方法。owner为驱动模块的拥有 者,为权限设置,一般设置为THIS_MODULE。

                          voidcdev_init(struct cdev *cdevp,struct file_operations *ops);

                          cdevp->owner= THIS_MODULE;

                          cdevp->fops= ops;

                3、添加字符设备:将初始化的字符设备添加到字符设备队列。完成这一步,字符设备的注册就全部做完了。参数unsigned count表明添加到设备队列的字符设备个 数。

                          voidcdev_add(struct cdev *cdevp,dev_t devn,unsigned count);

        注销:

1、 从字符设备队列删除字符设备:将字符设备结构体从设备队列删除。

voidcdev_del(struct cdev *cdevp);

2、注销字符设备号:释放掉设备号(设备号属于有限资源,主设备号为212个,次设备号为220个)。参数unsigned count为要注销的设备号个数。

voidunregister_chrdev_region(dev_t from,unsigned count);

字符设备基本的注册、注销过程就是这个模式。如果加入了私有数据filp->private_data、信号量或者其他的驱动程序设计的核心理论,则是在这个基础上进行添加。这

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值