当前位置:
文档之家› Linux设备驱动程序设计完全教程
Linux设备驱动程序设计完全教程
(unregister_chrdev(dev_Major, “module_name”, * fs ))
• 用户程序调用
– Open(“/dev/module_name”, mode) ;O_RDWR – Ioctl() – Write() – Read() – Close()
– 动态获取主设备号 – Linux下对设备号的分配请参考Documentation/devices.txt
• 设备文件
– Linux使用设备文件来统一对设备的访问接口,将设备文件放在 /dev/目录下
– 设备的命名一般为设备文件名+数字或者字母表示的子类,例如 /dev/hda1, /dev/hda2等
– 通常是指诸如磁盘、内存、Flash等可以容纳文件系统的存储设备。 – 块设备也是通过文件系统来访问,与字符设备的区别是:内核管理数
据的方式不同 – 它允许象字符设备一样以字节流的方式来访问,也可一次传递任意多
的字节。
• 网络接口设备
– 通常它指的是硬件设备,但有时也可能是一个软件设备(如回环接口 loopback),它们由内核中网络子系统驱动,负责发送和接收数据包。
© 2006 Embedded
基本概念
• 设备驱动程序接口( struct file_operations )
– 通常所说的设备驱动程序接口是指struct file_operations{ },它 的定义位于include/linux/fs.h中。
– 在嵌入式系统的开发中,通常只要实现如下几个接口函数就能完 成系统所需要的功能
Linux设备驱动程序设计
Linux 设备驱动程序设计
郗闽军 牛建伟
© 2006 Embedded
实验目的 • 学习Linux下进行驱动程序设计的原理 • 掌握Linux设备驱动程序开发的基本过程和设计方
法
© 2006 Embedded
实验内容
• 内核驱动设计入门-模块方式驱动程序(5.1) • 内核驱动设计实验-触摸屏驱动(5.2)
• struct dentry* f_dentry
文件对应的目录项结构
© 2006 Embedded
基本概念
• 设备驱动程序接口( struct file_operations), 标记化方法: static struct file_operations demo_fops = { owner: THIS_MODULE, write: demo_write, read: demo_read, ioctl: demo_ioctl, open: demo_open, release: demo_release, };
Linux的设备驱动程序
• 硬件设备与应用程序之间的一个中间软件层 • 它使得某个特定硬件能够响应一个定义良好的内
部编程接口,同时完全隐蔽了设备的工作细节 • 用户通过一组与具体设备无关的标准化的调用来
完成相应的操作 • 驱动程序的任务就是把这些标准化的系统调用映
射到具体设备对于实际硬件的特定操作上 • 驱动程序是内核的一部分,可以使用中断、DMA
等操作 • 驱动程序在用户态和内核态之间传递数据
© 2006 Embedded
设备驱动程序的分类
• 字符设备
– 所有能够象字节流一样访问的设备都通过字符设备来实现 – 它们被映射为文件系统中的节点,通常在/dev/目录下面 – 一般要包含open read write close等系统调用的实现
• 块设备
基本概念
• 驱动程序使用的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_flag 文件标志,主要进行阻塞/非阻塞型操作时检 查
• struct file_operation * f_op 文件操作的结构指针
• void * private_data 驱动程序一般将它指向已经分配的数据
– 它们的数据传送往往不是面向流的,因此很难将它们映射到一个文件 系统的节点上。
© 2006 Embedded
基本概念
• 主设备号和次设备号
– 主设备号和次设备号能够唯一地标识一个设备
• 128(V2.0以前), 256(V2.0以后)
– 主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体 设备的实例
• 驱动程序注册过程(动态分配主设备号)
– insmod module_name ;加载驱动程序,运行init函数 (register_chrdev(dev_Major, “module_name”, * fs ))
– 查看/proc/devices – mknod /dev/module_name c/b 主设备号 次设备号 – rmmod module_name ;卸载驱动,运行 exit函数
– 写一个简单的应用程序,显示触摸位置的坐标(x,y)
• 开发一个LED(数码管)驱动程序,并编写一个 应用程序对所开发的驱动程序进行测试(大作业)
– 实验实现的功能是上电复位后,数码管显示数字0-7, 然后每一个数字依次闪烁一次,小数点也要点亮,即: 0.1.2.3.4.5.6.7.
© 2006 Embedded
• init
加载驱动程序时,内核自动调用
• read
从设备中读取数据
• write
向字符设备中写数据
• ioctl
控制设备,实现除读写操作以外的其他控制命令
• open
打开设备并进行初始化
• release
关闭设备并释放资源
• exit
卸载驱动程序时,内核自动调用
© 2006 Embedded
基本概念
– Linux 2.4以后引入了设备文件系统(devfs)的概念,所有的设备 文件作为一个可以挂装的文件系统,这样就可以被文件系统统一管 理,从而设备文件就可以挂装到任何需要的地方。一般将主设 /dev/mtdblock0
© 2006 Embedded