




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式应用程序设计第8章嵌入式Linux设备驱动编程,2,第1章搭建嵌入式Linux开发环境第2章嵌入式文件I/O编程第3章嵌入式Linux多任务编程第4章嵌入式Linux进程间通行第5章嵌入式Linux多线程编程第6章嵌入式Linux网络编程第7章Qt图形编程第8章嵌入式Linux设备驱动编程第9章Qt聊天项目设计,课程安排:,3,8.1设备驱动编程基础8.2字符设备驱动编程8.3GPIO驱动程序实例8.4按键驱动编程实例8.5小结8.6思考与练习,本章课程:,4,8.1.1Linux设备驱动概述设备驱动概念操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是
2、操作系统最基本的功能,并且提供统一的操作方式。设备驱动程序是操作系统最基本的组成部分之一,在Linux内核源程序中也占有60%以上。因此,熟悉驱动的编写是很重要的。Linux的一个重要特点就是将所有的设备都当做文件进行处理,这一类特殊文件就是设备文件(通常在/dev目录下),这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,这样就大大方便了对设备的处理。,8.1设备驱动编程基础,5,8.1.1Linux设备驱动概述Linux系统的设备分为三类:字符设备、块设备和网络设备。字符设备通常指像普通文件或字节流一样,以字节为单位顺序读写的设备,如并口设备、
3、虚拟控制台等。块设备通常指一些需要以块为单位随机读写的设备,如IDE硬盘、SCSI硬盘、光驱等。网络设备通常是指通过网络能够与其他主机进行数据通信的设备,如网卡等。,8.1设备驱动编程基础,6,8.1.1Linux设备驱动概述设备驱动程序的特点内核代码内核接口内核机制和服务可装载可设置动态性,8.1设备驱动编程基础,7,8.1.1Linux设备驱动概述设备驱动程序与整个软硬件系统的关系,8.1设备驱动编程基础,8,8.1.2Linux内核模块编程设备驱动和内核模块Linux设备驱动属于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载。直接编译进Linux内核,随同Linux启动
4、时加载;编译成一个可加载和删除的模块。,8.1设备驱动编程基础,9,8.1.2Linux内核模块编程模块相关命令lsmod列出当前系统中加载的模块rmmod是用于将当前模块卸载。insmod和modprobe是用于加载当前模块,8.1设备驱动编程基础,10,8.1.2Linux内核模块编程Linux内核模块编程一个Linux内核模块主要由以下几个部分组成。模块加载函数(必须)模块卸载函数(必须)模块许可证声明(必须模块参数(可选)模块导出符号(可选)模块作者等信息声明(可选),8.1设备驱动编程基础,11,8.1.2Linux内核模块编程Linux内核模块编程模块加载函数staticint_i
5、nitinitialization_function(void)/*初始化代码*/module_init(initialization_function);模块卸载函数staticvoid_exitcleanup_function(void)/*释放代码*/module_exit(cleanup_function);,8.1设备驱动编程基础,12,8.1.2Linux内核模块编程Linux内核模块编程通常来说,模块卸载函数要完成与模块加载函数相反的功能若模块加载函数注册XXX,则模块卸载函数应该注销XXX。若模块加载函数动态申请了内存,则模块卸载函数应释放该内存。若模块加载函数申请了硬件资源(
6、中断、DMA通道、I/O端口和I/O内存等)的占用,则模块卸载函数应释放这些硬件资源。若模块加载函数开启了硬件,则卸载函数中一般要关闭硬件。,8.1设备驱动编程基础,13,8.1.2Linux内核模块编程Linux内核模块编程模块参数“module_param(参数名,参数类型,参数读/写权限)”为模块定义一个参数staticchar*str_param=LinuxModuleProgram;staticintnum_param=4000;module_param(num_param,int,S_IRUGO);module_param(str_param,charp,S_IRUGO);,8.1
7、设备驱动编程基础,14,8.1.2Linux内核模块编程Linux内核模块编程导出符号EXPORT_SYMBOL(符号名);EXPORT_SYMBOL_GPL(符号名);模块声明与描述MODULE_AUTHOR(author);MODULE_DESCRIPTION(description);MODULE_VERSION(version_string);MODULE_DEVICE_TABLE(table_info);MODULE_ALIAS(alternate_name);,8.1设备驱动编程基础,15,8.1.2Linux内核模块编程Linux内核模块编程模块的使用计数Linux2.4内核中,
8、模块自身通过MOD_INC_USE_COUNT、MOD_DEC_USE_COUNT宏来管理自己被使用的计数。Linux2.6内核提供了模块计数管理接口try_module_get(ssize_t(*read)(structfile*filp,char*buff,size_tcount,loff_t*offp);ssize_t(*write)(structfile*filp,constchar*buff,size_tcount,loff_t*offp);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*poll)(structfile
9、*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*);int(*fasync)(int,struc
10、tfile*,int);int(*check_media_change)(kdev_tdev);int(*revalidate)(kdev_tdev);int(*lock)(structfile*,int,structfile_lock*);,8.2字符设备驱动编程,21,8.2.2重要数据结构structinode结构提供了关于设备文件/dev/driver(假设此设备名为driver)的信息,file结构提供关于被打开的文件信息,主要用于与文件系统对应的设备驱动程序使用。structfilemode_tf_mode;/*标识文件是否可读或可写,FMODE_READ或FMODE_WRITE*
11、/dev_tf_rdev;/*用于/dev/tty*/off_tf_pos;/*当前文件位移*/unsignedshortf_flags;/*文件标志,如O_RDONLY、O_NONBLOCK和O_SYNC*/unsignedshortf_count;/*打开的文件数目*/unsignedshortf_reada;structinode*f_inode;/*指向inode的结构指针*/structfile_operations*f_op;/*文件索引指针*/;,8.2字符设备驱动编程,22,8.2.3设备驱动程序主要组成早期版本的字符设备注册register_chrdev()unregiste
12、r_chrdev(),8.2字符设备驱动编程,23,8.2.3设备驱动程序主要组成早期版本的字符设备注册unregister_chrdev(),8.2字符设备驱动编程,24,8.2.3设备驱动程序主要组成设备号相关函数获取设备号MAJOR(dev_tdev);/*获得主设备号*/MINOR(dev_tdev);/*获得次设备号*/MKDEV(intmajor,intminor);设备注册于注销,8.2字符设备驱动编程,25,8.2.3设备驱动程序主要组成设备号相关函数获取设备号MAJOR(dev_tdev);/*获得主设备号*/MINOR(dev_tdev);/*获得次设备号*/MKDEV(i
13、ntmajor,intminor);设备注册于注销,8.2字符设备驱动编程,26,8.2.3设备驱动程序主要组成新版本设备注册,8.2字符设备驱动编程,27,8.2.3设备驱动程序主要组成打开设备int(*open)(structinode*,structfile*);通常情况下在open函数接口中要完成如下工作:如果未初始化,则进行初始化。识别次设备号,如果必要,更新f_op指针。分配并填写被置于filp-private_data的数据结构。检查设备特定的错误(诸如设备未就绪或类似的硬件问题)。,8.2字符设备驱动编程,28,8.2.3设备驱动程序主要组成释放设备释放设备的函数接口是rele
14、ase()。释放设备时要完成的工作如下:释放打开设备时系统所分配的内存空间(包括filp-private_data指向的内存空间)。在最后一次关闭设备(使用close()系统调用)时,才会真正释放设备(执行release()函数)。即在打开计数等于0时的close()系统调用才会真正进行设备的释放操作。,8.2字符设备驱动编程,29,8.2.3设备驱动程序主要组成读写设备read()和write()函数,8.2字符设备驱动编程,30,8.2.3设备驱动程序主要组成读写设备copy_to_user()和copy_from_user(),8.2字符设备驱动编程,31,8.2.3设备驱动程序主要组成
15、ioctl大部分设备除了读写操作,还需要硬件配置和控制(例如,设置串口设备的波特率)等很多其他操作。在字符设备驱动中ioctl函数接口给用户提供对设备的非读写操作机制。,8.2字符设备驱动编程,32,8.2.3设备驱动程序主要组成获取内存kmalloc()/kfree()kmalloc语法格式:,8.2字符设备驱动编程,33,8.2.3设备驱动程序主要组成获取内存kmalloc()/kfree()kfree语法格式:,8.2字符设备驱动编程,34,8.2.3设备驱动程序主要组成打印信息printk(),8.2字符设备驱动编程,35,8.3.1GPIO工作原理FS2410开发板的S3C2410处
16、理器具有117个多功能通用I/O(GPIO)端口管脚,包括GPIO8个端口组,分别为GPA(23个输出端口)、GPB(11个输入/输出端口)、GPC(16个输入/输出端口)、GPD(16个输入/输出端口)、GPE(16个输入/输出端口)、GPF(8个输入/输出端口)、GPH(11个输入/输出端口)。根据各种系统设计的需求,通过软件方法可以将这些端口配置成具有相应功能(例如:外部中断或数据总线)的端口。,8.3GPIO驱动程序实例,36,8.3.1GPIO工作原理LED和蜂鸣器原理图,8.3GPIO驱动程序实例,37,8.3.1GPIO工作原理相关寄存器,8.3GPIO驱动程序实例,38,8.3.1GPIO工作原理GPIO驱动程序,8.3GPIO驱动程序实例,39,8.4.1中断编程实例注册中断intrequest_irq(unsignedintirq,void(*handler)(intirq,void*dev_id,structpt_regs*regs),unsignedlongirqflags,constchar*devname,oid*dev_id);释放中断voidfree_irq(unsignedintirq,void*d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采煤机橡套电缆介绍
- 2025至2030年红藻类植物保色浸制标本项目投资价值分析报告
- 危险化学品辨识与分类
- LNG安全专项施工方案
- 盘扣式钢管支架安全管理培训
- 2025至2030年电磁流量变送器项目投资价值分析报告
- 2025至2030年生活旅游品项目投资价值分析报告
- 2025至2030年班禅紧茶项目投资价值分析报告
- 水的物理课程讲解
- 临时用电安全管理
- 华为C语言通用编程规范
- GB/T 915-2010铋
- GB/T 20399-2006自然保护区总体规划技术规程
- 初中数学人教九年级上册第二十一章 一元二次方程 解一元二次方程之配方法PPT
- XX医院医疗信息系统安全三级等保建设可行性方案
- 苏教版数学二年级下册《数学绘本:公主殿下来的那一天》区级展示课(定稿)
- 执行力、心态管理培训课件
- (最新)信贷资产风险分类管理办法
- 五年级下册书法教学课件第9课-上下结构(二)-西泠印社版(共18张)课件
- 英雄无敌5使用秘籍与英雄代码
- 少儿绘画之《挂在树上的树懒》
评论
0/150
提交评论