码迷,mamicode.com
首页 > 其他好文 > 详细

字符设备驱动程序框架

时间:2015-05-11 12:37:08      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

via:http://blog.chinaunix.net/uid-20672257-id-3142809.html

1、写出open、write函数

2、告诉内核

  1)、定义一个struct file_operations结构并填充好

static struct file_operations first_drv_fops = {

    .owner  =   THIS_MODULE,    /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */

    .open   =   first_drv_open,     

    .write  = first_drv_write,    

}; 

 

  2)、把struct file_operations结构体告诉内核
major = register_chrdev(0, "first_drv", &first_drv_fops); // 注册, 告诉内核 
//相关参数:
//第一个,设备号,0自动分配主设备号,否则为主设备号0-255 
//第二个:设备名
//第三个:struct file_operations结构体

 


  4)、register_chrdev由谁调用(入口函数调用) static int first_drv_init(void)

  5)、入口函数须使用内核宏来修饰 module_init(first_drv_init); module_init会定义一个结构体,这个结构体里面有一个函数指针指向first_drv_init这个函数,当我们加载或安装一个驱动时,内核会自动找到这个结构体,然后调用里面的函数指针,这个函数指针指向first_drv_init这个函数,first_drv_init这个函数就是把struct file_operations结构体告诉内核
  6)、有入口函数就有出口函数
  module_exit(first_drv_exit);
 
  最后加上协议
  MODULE_LICENSE("GPL");
3、mdev根据系统信息自动创建设备节点:
  每次写驱动都要手动创建设备文件过于麻烦,使用设备管理文件系统则方便很多。在2.6的内核以前一直使用的是devfs,但是它存在许多缺陷。它创建了大量的设备文件,其实这些设备更本不存在。而且设备与设备文件的映射具有不确定性,比如U盘即可能对应sda,又可能对应sdb。没有足够的主/辅设备号。2.6之后的内核引入了sysfs文件系统,它挂载在/sys上,配合udev使用,可以很好的完成devfs的功能,并弥补了那些缺点。(这里说一下,当今内核已经使用netlink了)。
udev是用户空间的一个应用程序,在嵌入式中用的是mdev,mdev在busybox中。mdev是udev的精简版。
首先在busybox中添加支持mdev的选项:
Linux System Utilities --->   
    [*] mdev   
    [*]   Support /etc/mdev.conf   
    [*]     Support subdirs/symlinks   
    [*]       Support regular expressions substitutions when renaming device   
    [*]     Support command execution at device addition/removal  
 
然后修改/etc/init.d/rcS:
echo /sbin/mdev > /proc/sys/kernel/hotplug  
/sbin/mdev -s  
 
执行mdev -s :以‘-s’为参数调用位于 /sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描 /sys/class 和 /sys/block 中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev 下创建设备节点文件。一般只在启动时才执行一次 “mdev -s”。
热插拔事件:由于启动时运行了命 令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那么当有热插拔事件产生时,内核就会调用位于 /sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否“dev”的属性文件,如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件
重新打包文件系统,这样/sys目录,/dev目录就有东西了

字符设备驱动程序框架

标签:

原文地址:http://www.cnblogs.com/izhangzhne/p/4493923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!