Linux设备驱动程序设计完全教程

上传人:ali****an 文档编号:119212589 上传时间:2020-01-09 格式:PPT 页数:28 大小:313.50KB
返回 下载 相关 举报
Linux设备驱动程序设计完全教程_第1页
第1页 / 共28页
Linux设备驱动程序设计完全教程_第2页
第2页 / 共28页
Linux设备驱动程序设计完全教程_第3页
第3页 / 共28页
Linux设备驱动程序设计完全教程_第4页
第4页 / 共28页
Linux设备驱动程序设计完全教程_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《Linux设备驱动程序设计完全教程》由会员分享,可在线阅读,更多相关《Linux设备驱动程序设计完全教程(28页珍藏版)》请在金锄头文库上搜索。

1、 2006 Embedded Linux 设备驱动程序设计 Linux设备驱动程序设计 郗闽军 牛建伟 2006 Embedded 实验目的 学习Linux下进行驱动程序设计的原理 掌握Linux设备驱动程序开发的基本过程和设计方 法 2006 Embedded 实验内容 内核驱动设计入门模块方式驱动程序(5.1) 内核驱动设计实验触摸屏驱动(5.2) 写一个简单的应用程序,显示触摸位置的坐标( x,y) 开发一个LED(数码管)驱动程序,并编写一个 应用程序对所开发的驱动程序进行测试(大作业) 实验实现的功能是上电复位后,数码管显示数字0 -7,然后每一个数字依次闪烁一次,小数点也要点亮 ,

2、即: 0.1.2.3.4.5.6.7. 2006 Embedded Linux的设备驱动程序 硬件设备与应用程序之间的一个中间软件层 它使得某个特定硬件能够响应一个定义良好的内 部编程接口,同时完全隐蔽了设备的工作细节 用户通过一组与具体设备无关的标准化的调用来 完成相应的操作 驱动程序的任务就是把这些标准化的系统调用映 射到具体设备对于实际硬件的特定操作上 驱动程序是内核的一部分,可以使用中断、DMA 等操作 驱动程序在用户态和内核态之间传递数据 2006 Embedded 设备驱动程序的分类 字符设备 所有能够象字节流一样访问的设备都通过字符设备来实现 它们被映射为文件系统中的节点,通常在

3、/dev/目录下面 一般要包含open read write close等系统调用的实现 块设备 通常是指诸如磁盘、内存、Flash等可以容纳文件系统的存储设 备。 块设备也是通过文件系统来访问,与字符设备的区别是:内核管 理数据的方式不同 它允许象字符设备一样以字节流的方式来访问,也可一次传递任 意多的字节。 网络接口设备 通常它指的是硬件设备,但有时也可能是一个软件设备(如回环 接口loopback),它们由内核中网络子系统驱动,负责发送和接收数 据包。 它们的数据传送往往不是面向流的,因此很难将它们映射到一个 文件系统的节点上。 2006 Embedded 基本概念 主设备号和次设备号

4、主设备号和次设备号能够唯一地标识一个设备 128(V2.0以前), 256(V2.0以后) 主设备号相同的设备使用相同的驱动程序,次设备号用于区 分具体设备的实例 动态获取主设备号 Linux下对设备号的分配请参考Documentation/devices.txt 设备文件 Linux使用设备文件来统一对设备的访问接口,将设备文件放 在/dev/目录下 设备的命名一般为设备文件名+数字或者字母表示的子类, 例如/dev/hda1, /dev/hda2等 Linux 2.4以后引入了设备文件系统(devfs)的概念,所有的 设备文件作为一个可以挂装的文件系统,这样就可以被文件系统 统一管理,从而

5、设备文件就可以挂装到任何需要的地方。一般将 主设备建立一个目录,再将具体的子设备文件建立在此目录下。 例如,/dev/mtdblock0 2006 Embedded 基本概念 驱动程序使用的2个重要结构 struct file struct file_operations 2006 Embedded 基本概念 struct file 2006 Embedded 基本概念 struct file数据结构 定义位于include/fs.h struct file结构与驱动相关的成员 mode_t f_mode标识文件的读写权限 loff_t f_pos当前读写位置 unsigned int_f_f

6、lag 文件标志,主要进行阻塞/非阻塞型操 作时检查 struct file_operation * f_op 文件操作的结构指针 void * private_data驱动程序一般将它指向已经分配的数 据 struct dentry* f_dentry 文件对应的目录项结构 2006 Embedded 基本概念 设备驱动程序接口( struct file_operations), 标记化方法: static struct file_operations demo_fops = owner: THIS_MODULE, write: demo_write, read: demo_read, io

7、ctl: demo_ioctl, open: demo_open, release: demo_release, ; 2006 Embedded 基本概念 设备驱动程序接口( struct file_operations ) 通常所说的设备驱动程序接口是指struct file_operations , 它的定义位于include/linux/fs.h中。 在嵌入式系统的开发中,通常只要实现如下几个接口函数就 能完成系统所需要的功能 init加载驱动程序时,内核自动调用 read从设备中读取数据 write向字符设备中写数据 ioctl控制设备,实现除读写操作以外的其他控制 命令 open打开

8、设备并进行初始化 release关闭设备并释放资源 exit 卸载驱动程序时,内核自动调用 2006 Embedded 基本概念 驱动程序注册过程(动态分配主设备号) insmod module_name ;加载驱动程序,运行init函数 (register_chrdev(dev_Major, “module_name”, * fs ) 查看/proc/devices mknod /dev/module_name c/b 主设备号 次设备号 rmmod module_name ;卸载驱动,运行 exit函数( unregister_chrdev(dev_Major, “module_name”

9、, * fs )) 用户程序调用 Open(“/dev/module_name”, mode) ;O_RDWR Ioctl() Write() Read() Close() 2006 Embedded 开发驱动程序时须注意的事项 中断处理 中断是现代微处理器的一个重要功能 Linux驱动程序中的中断处理函数 extern int request_irq(unsigned int irq, void(*handler)(int, void*, struct pt_regs *), unsigned long flag, const char *dev_name, void *dev_id);/请

10、求为中断号irq分配中断处理 函数 extern void free_irq(unsigned int, void*);/释放中断 注意事项 不能向用户空间发送或者接收数据 不能执行有睡眠操作的函数 不能调用调度函数 谨慎使用全局变量(可重入) 自旋锁的使用 2006 Embedded 基本概念 字符设备的管理 驱动程序模块通过函数 int register_chrdev(unsigned int major, const char *name, struct file_operations *fops) 完成向内核 的注册,其中major是主设备号,name是设备名, fops是针对该设备的

11、驱动程序的接口。 在系统中为驱动程序模块建立一个设备节点 minjunRedHatAS $ mknod /dev/demo c 254 0 其中/dev/demo标识设备名为demo,“c”说 明是字符设备,254是指定的主设备号, 0是次设 备号 2006 Embedded 基本概念 驱动程序的编译 以demo.c为例 Makefile的形式参考实验指导书 命令行的形式 minjunRedHatAS $ armv4l-unknown-linux-gcc -Wall -c -O -D_KERNEL_ -I/home/minjun/embedded/kernel- 2410s/include d

12、emo.c -o demo.o 加载驱动 minjunRedHatAS $ insmod demo.o 卸载驱动 minjunRedHatAS $ rmmod demo.o 2006 Embedded 基本概念 测试程序实例 /test.c #include #include #include int main() int fd; fd=open(/dev/demo, O_RDWR); if(fd 0) exit(fd); /your code here read(fd, buffer, size); write(fd, buffer, size); . close(fd); return 0

13、; 2006 Embedded 驱动程序的实现驱动程序框架 #include #include #include #include /* printk() */ #include /* everything. */ #include /* error codes */ #include /* size_t */ #include #include /* O_ACCMODE */ #include /* COPY_TO_USER */ #include /* cli(), *_flags */ #define DEVICE_NAMEdemo #define demo_MAJOR 250 #def

14、ine demo_MINOR 0 static ssize_t demo_write(struct file *filp,const char *buffer, size_t count) copy_from_user(drv_buf , buffer, count); WRI_LENGTH = count; printk(user write data to drivern); /your code here return count; 2006 Embedded 驱动程序的实现驱动程序框架 static ssize_t demo_read(struct file *filp, char *buffer

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号