1 / 29
文档名称:

Linux系统培训:驱动.ppt

格式:ppt   页数:29
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Linux系统培训:驱动.ppt

上传人:管理资源吧 2011/8/3 文件大小:0 KB

下载得到文件列表

Linux系统培训:驱动.ppt

文档介绍

文档介绍:Linux系统培训:驱动
驱动分类
字符设备驱动
块设备驱动
其它一些注意方面
驱动分类
字符驱动
块设备驱动
网络设备驱动
主设备号和次设备号
访问Linux中的字符设备和块设备都是通过文件系统中的设备文件进行的,它们通常存放在/dev目录中。
通过ls –l命令,输出第一列中“c”表示字符设备,“b”就表示块设备
同时可以看到该设备的主设备号和次设备号。内核利用主设备号将设备文件与其对应的驱动程序联系起来。由于一个驱动程序可以控制多个设备,使用次设备号可以区分不同设备。
ls -l
crw-rw-rw- 1 root root 1, 3 Feb 23 1999 null
crw------- 1 root root 10, 1 Feb 23 1999 psaux
crw------- 1 rubini tty 4, 1 Aug 16 22:22 tty1
crw-rw-rw- 1 root dialout 4, 64 Jun 30 11:19 ttyS0
crw-rw-rw- 1 root dialout 4, 65 Aug 16 00:00 ttyS1
crw------- 1 root sys 7, 1 Feb 23 1999 vcs1
crw------- 1 root sys 7, 129 Feb 23 1999 vcsa1
crw-rw-rw- 1 root root 1, 5 Feb 23 1999 zero
字符设备注册和注销
注册和注销函数
#include <linux/>
int register_chrdev(unsigned int major,const char *name,struct file_operations *fops);
int unregister_chrdev(unsigned int major,const char *name);
其中major是主设备号,name为设备名称,fops是设备操作函数,结构定义如下:
file_operation结构
在<linux/>中定义:
struct file_operations {
struct module *owner;
ssize_t (*read) (struct file *, char *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
};
操作函数简介
open
设备的初始化
识别次设备号
其它一些工作,如是否允许同时被不同文件访问等等。
release
设备释放前的清理工作,如释放内存等等,一般与open操作相对应。
read和write
拷贝数据到用户空间或从用户空间接收数据。
函数原型:
read和write
ssize_t read(struct file *filp, char *buff,
size_t count, loff_t *offp);
ssize_t write(struct file *filp, const char *buff,
size_t count, loff_t *offp);
其中filp是文件指针,count是请求传输的数据长度,buff是指向用户空间的缓冲区。
ioctl函数
int (*ioctl)(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg);
inode和filp对应于应用程序传递的文件描述符fd,参数cmd由用户空间不经修改地传递给驱动程序,可选地arg以unsigned long形式传递给驱动程序。
用户空间地ioctl调用原型为:
int ioctl(int fd,int cmd,…);
块设备与字符设备的区别
字符设备直接读