第八章-嵌入式Linux设备驱动编程.ppt_第1页
第八章-嵌入式Linux设备驱动编程.ppt_第2页
第八章-嵌入式Linux设备驱动编程.ppt_第3页
第八章-嵌入式Linux设备驱动编程.ppt_第4页
第八章-嵌入式Linux设备驱动编程.ppt_第5页
免费预览已结束,剩余40页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式应用程序设计第八章嵌入式Linux设备驱动编程,2,8.1设备驱动概述8.2字符设备驱动编程8.3GPIO驱动程序实例8.44*4扫描按键驱动8.5小结8.6思考与练习,本章课程:,3,8.1.1Linux设备驱动概述设备驱动概念操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。设备驱动程序是操作系统最基本的组成部分之一,在Linux内核源程序中也占有60%以上。因此,熟悉驱动的编写是很重要的。Linux的一个重要特点就是将所有的设备都当做文件进行处理,这一类特殊文件就是设备文件(通常在/dev目录下),这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,这样就大大方便了对设备的处理。,8.1设备驱动编程基础,4,8.1.1Linux设备驱动概述Linux系统的设备分为三类:字符设备、块设备和网络设备。字符设备通常指像普通文件或字节流一样,以字节为单位顺序读写的设备,如并口设备、虚拟控制台等。块设备通常指一些需要以块为单位随机读写的设备,如IDE硬盘、SCSI硬盘、光驱等。网络设备通常是指通过网络能够与其他主机进行数据通信的设备,如网卡等。,8.1设备驱动编程基础,5,8.1.1Linux设备驱动概述设备驱动程序的特点内核代码内核接口内核机制和服务可装载可设置动态性,8.1设备驱动编程基础,6,8.1.1Linux设备驱动概述设备驱动程序与整个软硬件系统的关系,8.1设备驱动编程基础,7,8.1.2Linux内核模块编程设备驱动和内核模块Linux设备驱动属于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载。直接编译进Linux内核,随同Linux启动时加载;编译成一个可加载和删除的模块。,8.1设备驱动编程基础,8,8.1.2Linux内核模块编程模块相关命令Lsmod列出当前系统中加载的模块Rmmod用于将当前模块卸载。insmod和modprobe用于加载当前模块,8.1设备驱动编程基础,9,8.1.2Linux内核模块编程Linux内核模块编程(1)内核模块的程序结构一个Linux内核模块主要由以下几个部分组成。模块加载函数(必须)模块卸载函数(必须)模块许可证声明(必须模块参数(可选)模块导出符号(可选)模块作者等信息声明(可选),8.1设备驱动编程基础,10,8.1.2Linux内核模块编程Linux内核模块编程(2)模块加载函数staticint_initinitialization_function(void)/*初始化代码*/module_init(initialization_function);,8.1设备驱动编程基础,11,8.1.2Linux内核模块编程Linux内核模块编程(3)模块卸载函数staticvoid_exitcleanup_function(void)/*释放代码*/module_exit(cleanup_function);通常来说,模块卸载函数要完成与模块加载函数相反的功能若模块加载函数注册XXX,则模块卸载函数应该注销XXX。若模块加载函数动态申请了内存,则模块卸载函数应释放该内存。若模块加载函数申请了硬件资源(中断、DMA通道、I/O端口和I/O内存等)的占用,则模块卸载函数应释放这些硬件资源。若模块加载函数开启了硬件,则卸载函数中一般要关闭硬件。,8.1设备驱动编程基础,12,8.1.2Linux内核模块编程Linux内核模块编程(4)模块参数“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设备驱动编程基础,13,8.1.2Linux内核模块编程Linux内核模块编程(5)导出符号EXPORT_SYMBOL(符号名);EXPORT_SYMBOL_GPL(符号名);(6)模块声明与描述MODULE_AUTHOR(author);MODULE_DESCRIPTION(description);MODULE_VERSION(version_string);MODULE_DEVICE_TABLE(table_info);MODULE_ALIAS(alternate_name);,8.1设备驱动编程基础,14,8.1.2Linux内核模块编程Linux内核模块编程(7)模块的使用计数Linux2.4内核中,模块自身通过MOD_INC_USE_COUNT、MOD_DEC_USE_COUNT宏来管理自己被使用的计数。Linux2.6内核提供了模块计数管理接口try_module_get(该函数用于减少模块使用计数。,8.1设备驱动编程基础,15,8.1.2Linux内核模块编程Linux内核模块编程(8)模块编译我们可以为HelloWorld模块程序编写一个简单的Makefile,如下所示:obj-m:=hello.o并使用如下命令编译HelloWorld模块,如下所示:$make-C/usr/src/linux-2.6.15.5/M=/driver_study/modules如果当前处于模块所在的目录,以下命令与上述命令同等:$makeC/usr/src/linux-2.6.15.5M=$(pwd)modules,8.1设备驱动编程基础,16,8.1.2Linux内核模块编程Linux内核模块编程(9)模块与GPL对于自己编写的驱动等内核代码,如果不编译为模块则无法绕开GPL,编译为模块后企业在产品中使用模块。在内核编译时应该选上“Enableloadablemodulesupport”,嵌入式产品一般不需要动态卸载模块,所以“可以卸载模块”不用选,当然选了也没关系,如果有项目被选择“M”,则编译时除了makebzImage以外,也要makemodules。将我们编译的内核模块.ko文件放置在目标文件系统的相关目录中。产品的文件系统中应该包含了支持新内核的insmod、lsmod、rmmod等工具,由于嵌入式产品中一般不需要建立模块间依赖关系,所以modprobe可以不要,一般也不需要卸载模块,所以rmmod也可以不要。在使用中用户可使用insmod命令手动加载模块,如insmodxxx.ko。但是一般而言,产品在启动过程中应该加载模块,在嵌入式Linux的启动过程中,加载企业自己的模块的最简单的方法是修改启动过程的rc脚本,增加insmod/./xxx.ko这样的命令。,8.1设备驱动编程基础,17,8.1.2Linux内核模块编程Linux内核模块编程内核模块示例,8.1设备驱动编程基础,18,8.2.1字符设备驱动编写流程,8.2字符设备驱动编程,19,8.2.2重要数据结构file_operationsstructfile_operationsloff_t(*llseek)(structfile*,loff_t,int);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*,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,structfile*,int);int(*check_media_change)(kdev_tdev);int(*revalidate)(kdev_tdev);int(*lock)(structfile*,int,structfile_lock*);,8.2字符设备驱动编程,20,8.2.2重要数据结构structinode结构提供了关于设备文件/dev/driver(假设此设备名为driver)的信息,file结构提供关于被打开的文件信息,主要用于与文件系统对应的设备驱动程序使用。structfilemode_tf_mode;/*标识文件是否可读或可写,FMODE_READ或FMODE_WRITE*/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字符设备驱动编程,21,8.2.3设备驱动程序主要组成1.早期版本的字符设备注册register_chrdev()unregister_chrdev(),8.2字符设备驱动编程,22,8.2.3设备驱动程序主要组成1.早期版本的字符设备注册unregister_chrdev(),8.2字符设备驱动编程,23,8.2.3设备驱动程序主要组成2.设备号相关函数获取设备号MAJOR(dev_tdev);/*获得主设备号*/MINOR(dev_tdev);/*获得次设备号*/MKDEV(intmajor,intminor);设备注册于注销,8.2字符设备驱动编程,24,8.2.3设备驱动程序主要组成2.设备号相关函数获取设备号MAJOR(dev_tdev);/*获得主设备号*/MINOR(dev_tdev);/*获得次设备号*/MKDEV(intmajor,intminor);设备注册于注销,8.2字符设备驱动编程,25,8.2.3设备驱动程序主要组成3.新版本设备注册,8.2字符设备驱动编程,26,8.2.3设备驱动程序主要组成4.打开设备int(*open)(structinode*,structfile*);通常情况下在open函数接口中要完成如下工作:如果未初始化,则进行初始化。识别次设备号,如果必要,更新f_op指针。分配并填写被置于filp-private_data的数据结构。检查设备特定的错误(诸如设备未就绪或类似的硬件问题)。,8.2字符设备驱动编程,27,8.2.3设备驱动程序主要组成5.释放设备释放设备的函数接口是release()。释放设备时要完成的工作如下:释放打开设备时系统所分配的内存空间(包括filp-private_data指向的内存空间)。在最后一次关闭设备(使用close()系统调用)时,才会真正释放设备(执行release()函数)。即在打开计数等于0时的close()系统调用才会真正进行设备的释放操作。,8.2字符设备驱动编程,28,8.2.3设备驱动程序主要组成6.读写设备read()和write()函数,8.2字符设备驱动编程,29,8.2.3设备驱动程序主要组成6.读写设备copy_to_user()和copy_from_user(),8.2字符设备驱动编程,30,8.2.3设备驱动程序主要组成7.ioctl大部分设备除了读写操作,还需要硬件配置和控制(例如,设置串口设备的波特率)等很多其他操作。在字符设备驱动中ioctl函数接口给用户提供对设备的非读写操作机制。,8.2字符设备驱动编程,31,8.2.3设备驱动程序主要组成8.获取内存kmalloc()/kfree()kmalloc语法格式:,8.2字符设备驱动编程,32,8.2.3设备驱动程序主要组成8.获取内存kmalloc()/kfree()kfree语法格式:,8.2字符设备驱动编程,33,8.2.3设备驱动程序主要组成9.打印信息printk(),8.2字符设备驱动编程,34,8.3.1GPIO工作原理FS2410开发板的S3C2410处理器具有117个多功能通用I/O(GPIO)端口管脚,包括GPIO8个端口组,分别为GPA(23个输出端口)、GPB(11个输入/输出端口)、GPC(16个输入/输出端口)、GPD(16个输入/输出端口)、GPE(16个输入/输出端口)、GPF(8个输入/输出端口)、GPH(11个输入/输出端口)。根据各种系统设计的需求,通过软件方法可以将这些端口配置成具有相应功能(例如:外部中断或数据总线)的端口。,8.3GPIO驱动程序实例,35,8.3.1GPIO工作原理LED和蜂鸣器原理图,8.3GPIO驱动程序实例,36,8.3.1GPIO工作原理相关寄存器,8.3GPIO驱动程序实例,37,8.3.1GPIO工作原理GPIO驱动程序,8.3GPIO驱动程序实例,38,8.4.1中断编程硬件设备在发生某个事件时通过中断通知软件进行处理。中断实现了硬件设备按需获得处理器关注的机制,与查询方式相比可以大大节省CPU资源的开销。在驱动程序中用于申请中断的reques

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论