预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共41页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux设备驱动程序开发认识目标板各设备型号及开发中注意事项 驱动程序(BSP)在嵌入式系统中的重要性和所处位置 Linux驱动程序的概念、驱动结构、对中断和内存的处理、设备驱动的初始化 Linux下设备驱动程序开发框架和流程 Linux下模块化驱动程序设计(动态加载) 设备驱动加入Linux内核中 实验:编写驱动程序框架+测试用例(字符型设备)两种初始化方式 目标板各设备介绍设备开发中的注意事项BSP的重要性用户通过一组与具体设备无关的标准化的调用来完成相应的操作(如:open,write,read,close),同时完全隐蔽了设备的工作细节 操作系统分为两层:用户态:只能运行系统上的应用程序 内核态:权限高,处理内存的映射和分配,访问外设空间和处理器的特殊状态寄存器, 用户空间的数据不能直接通过指针传给内核 在用户态和内核态之间传递数据(copy_from_user、copy_to_user、get_user、put_user) 驱动程序是内核的一部分,可以使用中断、DMA等操作 驱动程序提供访问硬件设备寄存器的函数 开发一个性能可靠、可移植性好,可配置性好,规范化的BSP可以大在提高系统各方面性能Linux驱动程序概念Linux下设备驱动的共性设备驱动程序的分类每一个设备文件属性:主设备号(major)和次设备号(minor) 主设备号和次设备号能够唯一地标识一个设备 128(kernelV2.0以前),256(kernelv2.2v2.4v2.5)其中:0和255保留 主设备号相同的设备使用相同的驱动程序(I8250),次设备号用于区分具体设备的不同硬件(com1,com2) 动态获取主设备号,MAJOR=0 Linux下对设备号的分配请参考Documentation/devices.txt 设备文件(mknod) Linux使用设备文件来统一对设备的访问接口,将设备文件放在/dev/目录下 设备的命名一般为设备文件名+数字或者字母表示的子类,例如/dev/hda1,/dev/hda2等 Linux2.4以后引入了设备文件系统(devfs)的概念,所有的设备文件作为一个可以挂装的文件系统,这样就可以被文件系统统一管理,从而设备文件就可以挂装到任何需要的地方。一般将主设备建立一个目录,再将具体的子设备文件建立在此目录下。例如,/dev/mtdblock0在系统内部,I/0设备的存/取通过一组固定的入口点来进行, 这组入口点是由每个设备的设备驱动程序提供的 驱动程序使用的2个重要结构 structfile structfile_operations(重点了解) structfile structfile数据结构 file结构代表一个“打开的文件”。它有内核在open时创建而且在close前做为参数传递给如何操作在设备上的函数。在文件关闭后,内核释放这个数据结构。一个“打开的文件”与由structinode表示的“磁盘文件”有所不同 定义位于include/fs.h structfile结构与驱动相关的成员 mode_tf_mode 标识文件的读写权限 loff_tf_pos 当前读写位置 unsignedint_f_flag 文件标志,主要进行阻塞/非阻塞型操作时检查 structfile_operation*f_op文件操作的结构指针 void*private_data 驱动程序一般将它指向已经分配的数据,在跨系统调用时保存状态信息 structdentry*f_dentry 文件对应的目录项结构structfile_operations{ int(*lseek)(structinode*inode,structfile*file,off_toff,intpos); int(*read)(structinode*inode,structfile*file,char*buf,intcount); int(*write)(structinode*inode,structfile*file,constchar*buf,intcount); int(*readdir)(structinode*inode,structfile*file,structdirent*dirent,intcount); int(*select)(structinode*inode,structfile*file,intsel_type,select_table*wait); int(*ioctl)(structinode*inode,structfile*file,unsignedintcmd,unsignedintarg); int(*mmap)(void); int(*open)(structinode*inode,structfile*fi