版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式Linux企业级 应用与实践,1,Linux设备驱动程序开发,第,章,本章目标,驱动程序总体框架,应用程序使用驱动接口的流程,接口函数的使用,设备驱动程序源代码的基本结构,1.2 字符设备驱动程序接口,/* * 驱动程序中使用的各种函数的原型声明。标准的作法是将函数原型声明 * 放在一个头文件中,然后在该文件开始处使用#include引用,并在该 * 文件中定义。 * 这里我们将函数的声明和定义放在一起。所以下面的代码既是函数的声明, * 也是函数的定义。 */ static ssize_t spioc_read(struct file *filp, char *buff, size_t
2、 cnt, loof_t *off) /* 这里是read函数的代码 */ return ret; static ssize_t spioc_write(struct file *filp, char *buff, size_t cnt, loff_t *off) /* 这里是write函数的代码 */ return ret; ,1.2 字符设备驱动程序接口,static int spioc_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) /* 这里是ioctl函数的代码,它的
3、一般格式为一个switch分支语句 *switch(cmd) *case CMD1: *. *break; *. *case CMDn: *. *break *default: *. *break; * */ return ret; ,ioctl()函数用于控制驱动程序本身的一些特性和参数,如设定驱动 程序使用的缓冲区的大小,设定串行通讯的速率等。,1.2 字符设备驱动程序接口,static int spioc_open(struct inode *inode, struct file *filp) /* 这里是open函数的代码 */ return ret; static int spioc
4、_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() - spioc_ioctl() open() - spioc_open() close() - spioc_close(),系
5、统调用,驱动程序函数,1.2 字符设备驱动程序接口,static struct file_operations spioc_fops = read:spioc_read, write:spioc_write, ioctl:spioc_ioctl, open:spioc_open, release:spioc_close, ;,上述代码定义了一个file_operations类型的结构体spioc_fops,并将 其中的一些成员赋了初值。由于spioc_fops是一个静态变量,所以其他成员的初值是“零”。 结构体spioc_fops将作为一个参数在注册一个设备驱动程序时传递给内核。 内核使用设备
6、链表维护各种注册的设备。不同类型的设备使用不同的链表。,结构体初始化 在GNU C中,允许使用冒号(:)为特定的结构体成员定义初始值,其他成员为0. Linux2.6内核使用C99标准初始化结构体 static struct file_operations my_fops = .open = my_open, .release = my_release, ;,1.2 字符设备驱动程序接口,open与release方法 my_open和my_release函数会在设备打开和关闭时被调用,其工作很简单,仅仅执行两个宏:”MOD_INC_USE_COUNT”,”MOD_DEC_USE_COUNT”。
7、这两个宏负责记录(增加或者减少)设备模块被使用的情况,防止当有应用程序使用驱动程序时,此模块被意外地卸载。,static int my_open(struct inode * inode, struct file * filp) MOD_INC_USE_COUNT; printk(“my device openn”); /驱动调试常用的打印函数 return 0; ,static int my_release(struct inode * inode, struct file * filp MOD_DEC_USE_COUNT return 0; ,1.2 字符设备驱动程序接口,read与wri
8、te方法 read方法完成将数据从内核拷贝到应用程序空间,write方法相反,将数据从应用程序空间拷贝到内核.,static ssize_t demo_write(struct file *filp,const char *buffer, size_t count ,loff_t *ppos) copy_from_user(drv_buf , buffer, count); return count; ,static ssize_t demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos) copy_to_us
9、er(buffer, drv_buf,count); return count; ,文件指针,数据缓冲区,数据长度,文件偏移量,1.2 字符设备驱动程序接口,数据拷贝 由于用户空间和内核空间的内存映射方式完全不同,所以不能使用memcpy之类的函数,必须使用如下函数.,unsigned long copy_to_user (void * to , const void * from , unsigned long count ); unsigned long copy_from_user (void * to , const void * from , unsigned long count)
10、;,1.2 字符设备驱动程序接口,ioctl方法 ioctl 方法主要用于对设备进行读写之外的其他控制,比如配置设备、进入或退出某种操作模式,这些操作一般都无法通过read/write 文件操作来完成,比如在UP-NETARM2410中的SPI 设备通道的选择操作,无法通过write 操作控制,这就是ioctl 操作的功能。,static int demo_ioctl ( struct inode *inode , struct file *file , unsigned int cmd , unsigned long arg ) switch(cmd) case 1:printk(runin
11、g command 1 n);break; case 2:printk(runing command 2 n);break; default:printk(error cmd numbern);break; return 0; ,1.2 字符设备驱动程序接口,使用设备驱动程序,应用程序系统调用设备驱动程序设备(寄存器),使用一个设备一般需要执行如下一些操作: 打开设备文件。 对设备进行必要的设置,如设置串口速率。 对设备进行读、写等操作,如通过串口收发数据。 结束对设备的使用之前,如果改变了设备的某些设置,则将其恢复到缺省状态,保证设备停用后没有任何不好的副作用。 关闭设备。,一个设备如何被使用属于“策略”,应该由应用程序决定,而不是设备驱动程序。设备驱动程序应该只实现“机制”。,1.2 字符设备驱动程序接口,int main(int argc, char *argv) . pd = open(“/dev/spioc”, O_RDWT); . ,应用程序,crw- 1 root root 21, 0 Jan 1 00:15 spioc,/dev,open(const char *, int),系统调用,static struct file_operations spioc_fops = read:spioc_read, write:spioc_w
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江苏南京大学XZ2026-011地球科学与工程学院秘书招聘参考考试题库附答案解析
- 2026年临沂职业学院公开招聘教师和教辅人员(22名)备考考试试题附答案解析
- 2026江西赣州市会昌县恒耀物业管理有限公司招聘劳务派遣人员6人备考考试试题附答案解析
- 2026广西北海市银海区福成镇人民政府招录公益性岗位人员12人备考考试题库附答案解析
- 2026云南玉溪市公安局江川公安招聘警务辅助人员11人备考考试题库附答案解析
- 2026中国农业科学院生物技术研究所与安徽农业大学联合招聘博士后备考考试题库附答案解析
- 黄南藏族自治州藏医院招聘备考考试试题附答案解析
- 采购及供应链管理培训考试试题及答案
- 广东遴选真题及答案
- 生产车间技术员工作制度
- 交通事故培训
- 2026年医保药品目录调整
- 2026四川雅安市汉源县审计局招聘编外专业技术人员2人笔试备考试题及答案解析
- 食品销售业务员培训课件
- 2026年学校意识形态工作计划
- 2025年银行信息科技岗笔试真题及答案
- 山西电化学储能项目建议书
- GB/T 46392-2025县域无障碍环境建设评价规范
- DB32-T 4285-2022 预应力混凝土空心方桩基础技术规程
- 刺杀操课件教学课件
- 福建省厦门市双十中学2026届数学九年级第一学期期末复习检测模拟试题含解析
评论
0/150
提交评论