第8章 嵌入式Linux设备驱动编程.ppt_第1页
第8章 嵌入式Linux设备驱动编程.ppt_第2页
第8章 嵌入式Linux设备驱动编程.ppt_第3页
第8章 嵌入式Linux设备驱动编程.ppt_第4页
第8章 嵌入式Linux设备驱动编程.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

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.3 GPIO驱动程序实例 8.4 按键驱动编程实例 8.5 小结 8.6 思考与练习,本章课程:,4,8.1.1 Linux设备驱动概述 设备驱动概念 操作系统是通过各种驱

2、动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。设备驱动程序是操作系统最基本的组成部分之一,在Linux内核源程序中也占有60%以上。因此,熟悉驱动的编写是很重要的。 Linux的一个重要特点就是将所有的设备都当做文件进行处理,这一类特殊文件就是设备文件(通常在/dev目录下),这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,这样就大大方便了对设备的处理。,8.1 设备驱动编程基础,5,8.1.1 Linux设备驱动概述 Linux系统的设备分为三类:字符设备、块设备和网络设备。 字符

3、设备通常指像普通文件或字节流一样,以字节为单位顺序读写的设备, 如并口设备、虚拟控制台等。 块设备通常指一些需要以块为单位随机读写的设备,如IDE硬盘、SCSI硬盘、光驱等。 网络设备通常是指通过网络能够与其他主机进行数据通信的设备,如网卡等。,8.1 设备驱动编程基础,6,8.1.1 Linux设备驱动概述 设备驱动程序的特点 内核代码 内核接口 内核机制和服务 可装载 可设置 动态性,8.1 设备驱动编程基础,7,8.1.1 Linux设备驱动概述 设备驱动程序与整个软硬件系统的关系,8.1 设备驱动编程基础,8,8.1.2 Linux内核模块编程 设备驱动和内核模块 Linux设备驱动属

4、于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载。 直接编译进Linux内核,随同Linux启动时加载; 编译成一个可加载和删除的模块。,8.1 设备驱动编程基础,9,8.1.2 Linux内核模块编程 模块相关命令 lsmod列出当前系统中加载的模块 rmmod是用于将当前模块卸载。 insmod和modprobe是用于加载当前模块,8.1 设备驱动编程基础,10,8.1.2 Linux内核模块编程 Linux内核模块编程 一个Linux内核模块主要由以下几个部分组成。 模块加载函数(必须) 模块卸载函数(必须) 模块许可证声明(必须 模块参数(可选) 模块导出符号(可选)

5、 模块作者等信息声明(可选),8.1 设备驱动编程基础,11,8.1.2 Linux内核模块编程 Linux内核模块编程 模块加载函数 static int _init initialization_function(void) /* 初始化代码 */ module_init(initialization_function); 模块卸载函数 static void _exit cleanup_function(void) /* 释放代码 */ module_exit(cleanup_function);,8.1 设备驱动编程基础,12,8.1.2 Linux内核模块编程 Linux内核模块编程

6、 通常来说,模块卸载函数要完成与模块加载函数相反的功能 若模块加载函数注册XXX,则模块卸载函数应该注销XXX。 若模块加载函数动态申请了内存,则模块卸载函数应释放该内存。 若模块加载函数申请了硬件资源(中断、DMA通道、I/O端口和I/O内存等)的占用,则模块卸载函数应释放这些硬件资源。 若模块加载函数开启了硬件,则卸载函数中一般要关闭硬件。,8.1 设备驱动编程基础,13,8.1.2 Linux内核模块编程 Linux内核模块编程 模块参数 “module_param(参数名,参数类型,参数读/写权限)”为模块定义一个参数 static char *str_param = Linux Mo

7、dule Program; static int num_param = 4000; module_param(num_param, int, S_IRUGO); module_param(str_param, charp, S_IRUGO);,8.1 设备驱动编程基础,14,8.1.2 Linux内核模块编程 Linux内核模块编程 导出符号 EXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名); 模块声明与描述 MODULE_AUTHOR(author); MODULE_DESCRIPTION(description); MODULE_VERSION(ver

8、sion_string); MODULE_DEVICE_TABLE(table_info); MODULE_ALIAS(alternate_name);,8.1 设备驱动编程基础,15,8.1.2 Linux内核模块编程 Linux内核模块编程 模块的使用计数 Linux 2.4内核中,模块自身通过MOD_INC_USE_COUNT、MOD_DEC_USE_COUNT宏来管理自己被使用的计数。 Linux 2.6内核提供了模块计数管理接口try_module_get( ssize_t (*read) (struct file *filp, char *buff, size_t count, l

9、off_t *offp); ssize_t (*write) (struct file *filp, const char *buff, size_t count, loff_t *offp); 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

10、) (struct file *, 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 (*fasync) (int, struct file *, int); int (*check_media_change) (kdev_t dev); int (

11、*revalidate) (kdev_t dev); int (*lock) (struct file *, int, struct file_lock *); ;,8.2 字符设备驱动编程,21,8.2.2 重要数据结构 struct inode结构提供了关于设备文件/dev/driver(假设此设备名为driver)的信息,file结构提供关于被打开的文件信息,主要用于与文件系统对应的设备驱动程序使用。 struct file mode_t f_mode;/*标识文件是否可读或可写,FMODE_READ或FMODE_WRITE*/ dev_t f_rdev; /* 用于/dev/tty *

12、/ off_t f_pos; /* 当前文件位移 */ unsigned short f_flags; /* 文件标志,如O_RDONLY、O_NONBLOCK和O_SYNC */ unsigned short f_count; /* 打开的文件数目 */ unsigned short f_reada; struct inode *f_inode; /*指向inode的结构指针 */ struct file_operations *f_op;/* 文件索引指针 */ ;,8.2 字符设备驱动编程,22,8.2.3设备驱动程序主要组成 早期版本的字符设备注册 register_chrdev()

13、unregister_chrdev(),8.2 字符设备驱动编程,23,8.2.3设备驱动程序主要组成 早期版本的字符设备注册 unregister_chrdev(),8.2 字符设备驱动编程,24,8.2.3设备驱动程序主要组成 设备号相关函数 获取设备号 MAJOR(dev_t dev); /*获得主设备号*/ MINOR(dev_t dev); /*获得次设备号*/ MKDEV(int major, int minor); 设备注册于注销,8.2 字符设备驱动编程,25,8.2.3设备驱动程序主要组成 设备号相关函数 获取设备号 MAJOR(dev_t dev); /*获得主设备号*/

14、MINOR(dev_t dev); /*获得次设备号*/ MKDEV(int major, int minor); 设备注册于注销,8.2 字符设备驱动编程,26,8.2.3设备驱动程序主要组成 新版本设备注册,8.2 字符设备驱动编程,27,8.2.3设备驱动程序主要组成 打开设备 int (*open) (struct inode *, struct file *); 通常情况下在open函数接口中要完成如下工作: 如果未初始化,则进行初始化。 识别次设备号,如果必要,更新f_op指针。 分配并填写被置于filp-private_data的数据结构。 检查设备特定的错误(诸如设备未就绪或类

15、似的硬件问题)。,8.2 字符设备驱动编程,28,8.2.3设备驱动程序主要组成 释放设备 释放设备的函数接口是release()。 释放设备时要完成的工作如下: 释放打开设备时系统所分配的内存空间(包括filp-private_data指向的内存空间)。 在最后一次关闭设备(使用close()系统调用)时,才会真正释放设备(执行release()函数)。即在打开计数等于0时的close()系统调用才会真正进行设备的释放操作。,8.2 字符设备驱动编程,29,8.2.3设备驱动程序主要组成 读写设备 read()和write()函数,8.2 字符设备驱动编程,30,8.2.3设备驱动程序主要组

16、成 读写设备 copy_to_user()和copy_from_user(),8.2 字符设备驱动编程,31,8.2.3设备驱动程序主要组成 ioctl 大部分设备除了读写操作,还需要硬件配置和控制(例如,设置串口设备的波特率)等很多其他操作。在字符设备驱动中ioctl函数接口给用户提供对设备的非读写操作机制。,8.2 字符设备驱动编程,32,8.2.3设备驱动程序主要组成 获取内存 kmalloc()/kfree() kmalloc语法格式:,8.2 字符设备驱动编程,33,8.2.3设备驱动程序主要组成 获取内存 kmalloc()/kfree() kfree语法格式:,8.2 字符设备驱

17、动编程,34,8.2.3设备驱动程序主要组成 打印信息 printk(),8.2 字符设备驱动编程,35,8.3.1GPIO工作原理 FS2410开发板的S3C2410处理器具有117个多功能通用I/O(GPIO)端口管脚,包括GPIO 8个端口组,分别为GPA(23个输出端口)、GPB(11个输入/输出端口)、GPC(16个输入/输出端口)、GPD(16个输入/输出端口)、GPE(16个输入/输出端口)、GPF(8个输入/输出端口)、GPH(11个输入/输出端口)。根据各种系统设计的需求,通过软件方法可以将这些端口配置成具有相应功能(例如:外部中断或数据总线)的端口。,8.3 GPIO驱动程

18、序实例,36,8.3.1GPIO工作原理 LED和蜂鸣器原理图,8.3 GPIO驱动程序实例,37,8.3.1GPIO工作原理 相关寄存器,8.3 GPIO驱动程序实例,38,8.3.1GPIO工作原理 GPIO驱动程序,8.3 GPIO驱动程序实例,39,8.4.1 中断编程实例 注册中断 int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irqflags, const char * devname, oid *dev_id); 释放中断 void free_irq(unsigned int irq, v

温馨提示

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

评论

0/150

提交评论