完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一个典型的驱动程序,大体上可以分为这么几个部分:
1、注册设备 在系统初启,或者模块加载时候,必须将设备登记到相应的设备数组,并返回设备的主驱动号,例如:对快设备来说调用refister_blkdec()将设备添加到数组blkdev中.并且获得该设备号.并利用这些设备号对此数组进行索引.对于字符驱动设备来说,要使用module_register_chrdev()来获得祝设备的驱动号.然后对这个设备的所有调用都用这个设备号来实现 2、定义功能函数 对于每一个驱动函数来说.都有一些和此设备密切相关的功能函数.那最常用的块设备或者字符设备来说.都存在着诸如 open() read() write() ioctrol()这一类的操作.当系统社用这些调用时.将自动的使用驱动函数中特定的模块.来实现具体的操作.而对于特定的设备.上面的系统调用对应的函数是一定的. 如:在块驱动设备中.当系统试图读取这个设备(即调用read()时),就会运行驱动程序中的block_read() 这个函数. 打开新设备时会调用这个设备驱动程序的device_open() 这个函数. 3、卸载模块 在不用这个设备时,可以将他卸载.主要是从/proc 中取消这个设备的特殊文件.可用特定的函数实现. 下面我们列举一个字符设备驱动程序的框架.来说明这个过程. /* a module of a character device */ /* some include files*/ #include "param.h" #include "user.h" #include "tty.h" #include "dir.h" #include "fs.h" /* the include files modules need*/ #include "linux/kernel.h" #include "linux/module.h" #if CONFIG_MODBERSIONS==1 define MODBERSIONS #include" linux.modversions.h" #endif #difine devicename mydevice /* the init funcion*/ int init_module() { int tag=module_register_chrdev(0,mydevice,&Fops); if (tag<0) { printk("the device init is erro!"); return 1; } return 0; } /*the funcion which the device will be used */ int device_open () { ……. } int device_read () { ……. } int device_write () { ……. } int device_ioctl () { ……. } …… /* the deltter function of this module*/ int cleanup_module() { int re=module_unregister_chrdev(tag,mydevice); if( re<0) { printk("erro unregister the module !!"); return 1; } return 0; } |
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:21 , Processed in 0.753316 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号