第9章 字符设备驱动程序开发.pptx

第9章 字符设备驱动程序开发

字符设备驱动程序 第9章 9-1 字符设备驱动程序基本结构 字符设备开发的基本步骤 确定主设备号和次设备号 实现字符驱动程序 实现file_operations结构体 实现初始化函数,注册字符设备 实现销毁函数,释放字符设备 创建设备文件节点 9-1 字符设备驱动程序基本结构 什么是主设备号/次设备号 主设备号是内核识别一个设备的标识。 整数(占12bits),范围从0到4095,通常使用1到255 次设备号由内核使用,用于正确确定设备文件所指的设备。 整数(占20bits),范围从0到1048575,一般使用0到255 9-1 字符设备驱动程序基本结构 设备编号的内部表达 dev_t类型(32位): 用来保存设备编号(包括主设备号(12位)和次设备号(20位)) 从dev_t获得主设备号和次设备号: MAJOR(dev_t); MINOR(dev_t); 将主设备号和次设备号转换成dev_t类型: MKDEV(int major,int minor); 9-1 字符设备驱动程序基本结构 分配主设备号 手工分配主设备号:找一个内核没有使用的主设备号来使用。 #include linux/fs.h int register_chrdev_region( dev_t first, unsigned int count, char *name ); 要分配的设备编号范围的起始值,次设备号经常为0 所请求的连续设备编号的个数 和该编号范围关联的设备名称 9-1 字符设备驱动程序基本结构 动态分配主设备号: #include linux/fs.h int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor, unsigned int count,char *name); 输出的设备号 要使用的被请求的第一个次设备号 9-1 字符设备驱动程序基本结构 释放设备号 void unregister_chrdev_region(dev_t first, unsigned int count); 通常在模块的清除函数中调用。 9-1 字符设备驱动程序基本结构 实现字符驱动程序 cdev 结构体 struct cdev { struct kobject kobj; /* 内嵌的kobject 对象 */ struct module *owner; /*所属模块*/ struct file_operations *ops; /*文件操作结构体*/ struct list_head list; dev_t dev; /*设备号*/ unsigned int count; }; 9-1 字符设备驱动程序基本结构 file_operations 结构体 字符驱动和内核的接口: 在include/linux/fs.h定义 字符驱动只要实现一个file_operations结构体 并注册到内核中,内核就有了操作此设备的能力。 9-1 字符设备驱动程序基本结构 file_operations的主要成员: struct module *owner: 指向模块自身 open:打开设备 release:关闭设备 read:从设备上读数据 write:向设备上写数据 ioctl:I/O控制函数 llseek:定位读写指针 mmap:映射设备空间到进程的地址空间 9-1 字符设备驱动程序基本结构 注册设备 ,在模块或驱动初始化时调用 Linux-2.4 及之前 Linux-2.6 int register_chrdev(unsigned int major, const char *name, struct file_operations *fops) 如何操作字符设备的接口 void cdev_init( struct cdev *, struc t file_operations *); int cdev_add(st ruct cdev *, dev_t, unsigned) ; 9-1 字符设备驱动程序基本结构 注销设备:在模块卸载时调用 Linux-2.4及之前 Linux-2.6 int unregister_chrdev(unsigned int major, const char *name); void cdev_de

文档评论(0)

1亿VIP精品文档

相关文档