版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设备驱动程序.2设备驱动程序的作用设备驱动程序是一个软件层,该软件层使硬件设备呼应预定义好的编程接口,我们曾经熟习这些接口,它由一组控制设备的函数(open,read,ioctl等等)组成,这些函数的实践实现由设备驱动程序全权担任。设备驱动程序(应该只是)为系统的其它部分提供各种运用设备的才干,运用设备的方法应该由运用程序决议。.3struct file_operations struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, s
2、ize_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file
3、 *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_
4、lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *
5、, unsigned long, unsigned long, unsigned long, unsigned long);struct file_operationsinclude/linux/fs.h.设备驱动程序那么编写设备驱动程序的主要任务就是编写如上子函数,并填充file_operations的各个域.一个最简单字符驱动程序,由下面7个函数和1个构造体就可组成。Open,Release,static int my_open(struct inode * inode, struct file * filp) 设备翻开时的操作 static int my_release(struct i
6、node * inode, struct file * filp) 设备封锁时的操作 static int my_write(struct file *file, const char * buffer, size_t count,loff_t * ppos) 设备写入时的操作 static int my_read(struct file *file, const char * buffer, size_t count,loff_t * ppos) 设备读取时的操作 Write,ReadIoctlInit,ExitStruct file_operation.static int _init m
7、y_init(void)初始化硬件,注册设备,创建设备节点 static void _exit my_exit(void)删除设备节点,注销设备 设备的控制操作 Static int my_ioctl(struct inode *inode, struct file *filp, unsignedint cmd, unsigned long arg)static struct file_operations my_fops = 对文件操作构造体成员定义初始值.7在操作系统中的位置设备驱动程序是内核代码的一部分。驱动程序的地址空间是内核的地址空间(copy_to_user函数等)。驱动程序的代码
8、直接对设备硬件(实践是设备的各种存放器)进展控制(实践就是读写操作)。运用程序经过操作系统的系统调用执行相应的驱动程序函数。中断那么直接执行相应的中断程序代码。设备驱动程序的file_operations构造体的地址被注册到内核中的设备链表中。块设备和字符设备以设备文件的方式建立在文件系统中的/dev目录下,而且每个设备都有一个主设备号和一个次设备号。.设备号主设备号 驱动程序在初始化时,会注册它的驱动及对应主设备号到系统中,这样当运用程序访问设备节点时,系统就知道它所访问的驱动程序了。他可以经过/proc/devices文件来查看驱动系统设备的主设备号。次设备号 驱动程序遍历设备时,每发现一
9、个它能驱动的设备,就创建一个设备对象,并为其分配一个次设备号以区分不同的设备。这样当运用程序访问设备节点时驱动程序就可以根据次设备号知道它说访问的设备了。.9ls -l /devcrw-r 1 root root 1, 1 Jan 1 00:00 memcrw-r 1 root root 1, 2 Jan 1 00:00 kmemcrw-rw-rw- 1 root root 1, 3 Jan 1 00:00 nullcrw-r 1 root root 1, 4 Jan 1 00:00 portcrw-rw-rw- 1 root root 1, 5 Jan 1 00:00 zerocrw-rw-
10、rw- 1 root root 1, 7 Jan 1 00:00 fullcrw-r-r- 1 root root 1, 8 Jan 1 00:00 randomcrw-r-r- 1 root root 1, 9 Jan 1 00:00 urandomcrw-rw-rw- 1 root root 5, 0 Jan 1 00:00 ttycrw 1 root root 5, 1 Jan 1 00:00 consolecrw-rw-rw- 1 root root 5, 2 Jan 1 00:00 ptmxdrwxr-xr-x 1 root root 0 Jan 1 00:00 ptydrwxr-x
11、r-x 2 root root 0 Jan 1 00:00 ptsdrwxr-xr-x 1 root root 0 Jan 1 00:00 rddrwxr-xr-x 1 root root 0 Jan 1 00:00 mtddrwxr-xr-x 1 root root 0 Jan 1 00:00 mtdblockcrw 1 root root 4, 64 Jan 1 00:15 ttyS0crw 1 root root 4, 65 Jan 1 00:00 ttyS1crw 1 root root 4, 66 Jan 1 00:00 ttyS2crw 1 root root 4, 67 Jan
12、1 00:00 ttyS3crw 1 root root 4, 68 Jan 1 00:00 ttyS4drwxr-xr-x 1 root root 0 Jan 1 00:00 miscc:字符设备b:块设备主设备号次设备号.10设备驱动程序源代码的根本构造/* * 驱动程序简单阐明: * 驱动程序的作用:这是一个字符设备驱动程序的根本框架构造 * 被驱动设备的简单描画:将运用AT91RM9200的PB端口为例进展阐明 * 一些特殊的思索等:如PB21作为可以产生中断的输入引脚本例未实现 * 版本,创建日期,作者等:1.0版,2006年1月6日*/#ifndef _KERNEL_#define
13、 _KERNEL_#endif#ifndef MODULE#define MODULE#endif#include #include .#include 阐明这个模块将用于内核,也可以在编译时经过 D选项指定,如gcc D_KERNEL_。参见Makefile。内核头文件,需求根据详细驱动程序和用到的内核模块确定。阐明这个驱动程序将以模块的方式编译和运用,也可以在编译时经过 D选项指定,如gcc DMODULE。参见Makefile。.11/* * 驱动程序中运用的各种函数的原型声明。规范的作法是将函数原型声明 * 放在一个头文件中,然后在该文件开场处运用#include援用,并在该 * 文件
14、中定义。 * * 这里我们将函数的声明和定义放在一同。所以下面的代码既是函数的声明, * 也是函数的定义。 */static ssize_t spioc_read(struct file *filp, char *buffsize_t cnt, loof_t *off)/* 这里是read函数的代码 */return ret;static ssize_t spioc_write(struct file *filp, char *buffsize_t cnt, loff_t *off)/* 这里是write函数的代码 */return ret;.12static int spioc_ioctl(
15、struct inode *inode, struct file *filpunsigned int cmd, unsigned long arg)/* 这里是ioctl函数的代码,它的普通格式为一个switch分支语句 *switch(cmd) *case CMD1: *. *break; *. *case CMDn: *. *break *default: *. *break; * */return ret;ioctl()函数用于控制驱动程序本身的一些特性和参数,如设定驱动程序运用的缓冲区的大小,设定串行通讯的速率等。.13static int spioc_open(struct inod
16、e *inode, struct file *filp)/* 这里是open函数的代码 */return ret;static int spioc_close(struct inode *inode, struct file *filp)/* 这里是close函数的代码 */return ret;上述5个函数,既read(), write(), ioctl(), open(), close(),是一个字符设备驱动程序最根本的需求由驱动程序的作者完成的函数。这5个函数将对应于相应的5个系统调用:read() - spioc_read()write() - spioc_write()ioctl()
17、 - spioc_ioctl()open() - spioc_open()close() - spioc_close()系统调用驱动程序函数.14static struct file_operations spioc_fops = read:spioc_read,write:spioc_write,ioctl:spioc_ioctl,open:spioc_open,release:spioc_close,;file_operations是一个构造体类型,定义在include/linux/fs.h中。上述代码定义了一个file_operations类型的构造体spioc_fops,并将其中的一些
18、成员赋了初值。由于spioc_fops是一个静态变量,所以其他成员的初值是“零。构造体spioc_fops将作为一个参数在注册一个设备驱动程序时传送给内核。内核运用设备链表维护各种注册的设备。不同类型的设备运用不同的链表。.15static int _init spioc_init(void)/* 设备初始化代码等 */if(register_chrdev(SPIOC_MAJOR, “spioc, &spioc_fops) printk(KERN_ERR “spioc.c: unable to register “the device with major %d.n, SPIOC_MAJOR)
19、;return EIO;/* 其他初始化代码 */return ret;static void _exit spioc_exit(void)/* 设备吊销代码 */if(unregister_chrdev(SPIOC_MAJOR, “spioc) printk(KERN_ERR “spioc.c: unable to remove the “device with major %d.n, SPIOC_MAJOR);return;/* 其它设备吊销代码 */return;.注册设备函数int register_chrdev(unsigned int major, const char *name
20、, struct file_operations *fops); major是为设备驱动程序向系统恳求的主设备号,假设为0那么系统为此驱动程序动态分配一个主设备号;name是设备名;fops是对各个系统调用的入口点的阐明 ;.撤销设备代码int unregister_chrdev(unsigned int major, const char *name);major :注册时的主设备号,必需和注册时一样name: 设备名前往: 胜利 0 设备名从proc/devices下消逝 失败 -1.18module_init(spioc_init);module_exit(spioc_exit);这两个
21、函数,module_init()和module_exit(),用于通知内核,当一个驱动程序加载和退出或吊销时,需求执行的操作。不同驱动程序在加载和退出时,除了根本的向内核注册设备驱动程序外,还有各自的针对详细设备的操作。.19要点总结:宏:_KERNEL_, MODULE, _VERSION_KERNEL_:阐明这将是用于内核的代码,否那么很多内核过程将无法运用。MODULE:假设是以模块方式编译,需求定义这个宏;假设是静态衔接那么不用。_VERSION_:定义这个宏那么需求驱动程序的内核版本要和内核版本一致。module_init()/module_exit(): spioc_init()/
22、spioc_exit()每个驱动程序都要有这两个函数,它们分别用于设备驱动程序的加载和吊销。static struct file_operations spioc_fops:每个驱动程序都要有这样的构造体,能够不止一个。用register_chrdev注册驱动程序时这个构造体的起始地址被传送到内核的设备表中。SPIOC_MAJOR:每个设备驱动程序有一个主设备号(major number)。不同设备驱动程序不能运用一样的主设备号。一个设备驱动程序可以管理不同的(但普通是同一类的)设备,经过次设备号(minor number)区分。spioc_ open()/close(),read()/wri
23、te(), ioctl():根据详细驱动程序定义和运用。普通open()/close()总是需求的,而且open()和close()一定要成对出现。.20设备驱动程序的运用驱动程序模块的动态链接和静态链接创建设备文件运用设备.21设备驱动程序被静态编译到内核中的情况:module_init()指示内核在启动过程中运转设备的初始化函数,如spioc_init()函数。驱动程序的加载随内核的启动一同完成。静态编译的内核模块不能被动态卸载,只需到系统封锁时由内核执行相应的卸载函数,如spioc_exit()。嵌入式操作系统普通运用静态内核模块以减少系统的尺寸和复杂性。驱动程序模块的加载设备驱动程序被
24、动态加载到内核中的情况:首先,驱动程序需求被编译成目的文件,如spioc.o。在操作系统运转之后,运用insmod命令将驱动程序模块动态加载到内核中$ insmod spioc.o运用insmod命令动态加载的内核模块可以运用rmmod命令动态地从内核中卸载$ rmmod spioc.o运用内核的动态模块加载/卸载功能需求内核支持kmod功能。.22创建设备文件Linux操作系统将字符设备和块设备作为一种特殊的文件对待,这就是设备文件。运用mknod命令建立设备文件。$ mknod c 21 0 /dev/spiocc:字符设备b:块设备主设备号次设备号设备文件crw 1 root root 21, 0 Jan 1 00:15 spioc/dev.23运用设备驱动程序运用程序系统调用设备驱动程序设备存放器运
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年轨道施工技术押题宝典考试题库(原创题)附答案详解
- 2026年咨询工程师《工程项目组织与管理》必刷题库含完整答案详解(网校专用)
- 2025-2030年利咽膏药行业市场营销创新战略制定与实施分析研究报告
- 2026年能源营销API 对接合同
- 2026年工程改造品牌合作协议
- 2026年软件租赁审计评估合同
- 2026年大数据顾问AI 解决方案合同
- 2026年安防评估品牌合作合同
- 2026年法律审计外包服务合同
- 骨科护理的团队协作模式
- 森林病理学-林木枝干病害
- 江南大学数电题库(部分)
- 长沙理工热力发电厂课程设计
- 性传播疾病的口腔表征
- 物业服务报价表
- Kistler-5867B监控仪快速入门
- 甘肃省兰州市树人中学七年级下期中考试数学试题
- (完整word版)三级安全教育记录及表格(全)
- 名师整理最新人教部编版语文中考议论文阅读-论证思路及结构专题复习教案含答案
- 预制梁首件施工方案
- 多媒体技术ppt课件(完整版)
评论
0/150
提交评论