文档介绍:Linux设备驱动开发
每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备。
每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。
一 Linux设备驱动程序分类
字符设备
块设备
网络设备
字符设备
字符设备是顺序读取和写入的。
块设备
面向大量数据传输或慢速设备,可节省CPU的等待时间。对块设备进行读写操作时,需要先开辟一段内存缓冲区。
两者的主要区别是在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。
二 Linux驱动程序的加载方式
驱动程序直接编译进内核
采用这种方式编译的驱动程序在内核启动时就已经在内存中,运行时不需要再自己加载驱动。
。
驱动程序的模块加载
驱动程序以模块的形式存储在文件系统中,需要时动态载入内核。不用时节省内存,且独立于内核,升级方便。
在嵌入式系统中,主要在开发阶段采用这种方式。
三 Linux
,系统一直利用设备类型和设备的主次设备号管理设备;
,引入了设备文件系统(devfs)
,引入udev设备文件系统;
devfs设备文件系统
可以通过程序在设备初始化时在/dev目录下创建设备文件,卸载时删除。
设备驱动程序可以指定设备名,所有者和权限位
可以不需要为设备驱动程序分配主设备号以及处理次设备号,可以直接给register_chrdv()传递0主设备号以动态获取主设备号,并在devfs_register()中指定次设备号.
devfs设备文件系统
驱动程序调用如下函数进行设备文件的创建和删除工作。
1 创建设备目录
devfs_handle_t devfs_mk_dir(devfs_handle_t dir , const char *name , void *info);
2创建设备文件
devfs_handle_t devfs_register(devfs_handle_t dir , const char *name , unsigned int flags , unsigned int major , unsigned int minor , umode_t mode , void *ops , void *info);
3注销设备文件
void devfs_unregister(devfs_handle_t dir);
devfs设备文件系统
static int _init example(void)
{
int ret = -enodev ;
int delay ;
//注册字符型设备
ret = devfs_register_chrdev(MAJOR, “chardevice”,&chadevice_ops);
if(ret<0){}
else{}
//注册devfs设备
dev_handle = devfs_register(null , “chardevice”,DEVFS_FL_DEFAULT, ,0,,&chardevice_ops , null );
return ret;
}
//chardevice设备向系统注册的OPS结构:
struct file_operations chardevice_ops={
open:open,
read:read,
write:write,
loctl:ioctl,
colse:release,
}
#include <linux/> //内核编译的配置文件
#include <linux/> //模块驱动程序的头文件
#include <linux/>
#include <linux/>
#include <linux/>
#include <linux/>
#include <linux/>
#include <linux/>
#include <linux/