linux字符设备驱动课程设计报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一、课程设计目的Linux系统的开源性使其在嵌入式系统的开发中得到了越来越广泛的应用,但其本身并没有对种类繁多的硬件设备都提供现成的驱动程序,特别是由于工程应用中的灵活性,其驱动程序更是难以统一,这时就需开发一套适合于自己产品的设备驱动。对用户而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以像对其它文件一样对此设备文件进行操作。通过这次课程设计可以了解linux的模块机制,懂得如何加载模块和卸载模块,进一步熟悉模块的相关操作。加深对驱动程序定义和设计的了解,了解linux驱动的编写过程,提高自己的动手能力。二、课程设计内容与要求字符设备驱动程序1、设计目的:掌握设备驱动程序的编写、编译和装载、卸载方法,了解设备文件的创建,并知道如何编写测试程序测试自己的驱动程序是否能够正常工作2、设计要求:1)编写一个简单的字符设备驱动程序,该字符设备包括打开、读、写、I\O控制与释放五个基本操作。2)编写一个测试程序,测试字符设备驱动程序的正确性。3)要求在实验报告中列出Linux内核的版本与内核模块加载过程。三、系统分析与设计1、系统分析系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:1、对设备初始化和释放;2、把数据从内核传送到硬件和从硬件读取数据;3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据;4、检测和处理设备出现的错误。字符设备提供给应用程序的是一个流控制接口,主要包括open、close(或release)、read、write、ioctl、poll和mmap等。在系统中添加一个字符设备驱动程序,实际上就是给上述操作添加对应的代码。对于字符设备和块设备,Linux内核对这些操作进行了统一的抽象,把它们定义在结构体file_operations中。2、系统设计:2.1、模块设计:2.2数据结构说明字符设备驱动主要应用了三种数据结构:①file_operations结构,这是设备驱动程序所提供的一组用一个结构向系统进行说明的入口点;②file结构,主要用于与文件系统对应的设备驱动程序。代表一个打开的文件,它由内核在open时创建,并传递给在该文件上进行操作的所有函数,直到碰到最后的close函数。在文件的所有实例都被关闭之后,内核会释放这个数据结构;③inode结构,提供了关于特殊设备文件/dev/mydev的信息。各个结构的定义如下:(1)file_operations结构:staticconststructfile_operationsmy_fops={.owner=THIS_MODULE,.llseek=my_llseek,.read=my_read,.write=my_write,.open=my_open,.release=my_release,.unlocked_ioctl=ioctl,};(2)file结构:1)读staticssize_tmy_read(structfile*filp,char__user*buf,size_tsize,loff_t*ppos)2)写staticssize_tmy_write(structfile*filp,constchar__user*buf,size_tsize,loff_t*ppos)3)seek文件定位staticloff_tmy_llseek(structfile*filp,loff_toffset,intwhence)4)I\O控制staticintioctl(structfile*file,unsignedintcmd,unsignedlongarg)(3)inode结构:1)打开打开设备读操作写操作I/O控制释放设备字符设备驱动intmy_open(structinode*inode,structfile*filp)2)释放intmy_release(structinode*inode,structfile*filp)2.3、算法流程图:结束文件释放函数ly_release()设备驱动模块卸载函数mydev_exit()开始设备驱动模块加载函数ly_init()文件打开函数ly_open()读函数ly_read()写函数ly_write()Seek文件定位函数ly_llseek()I\O控制函数Ioctl()四、系统测试与调试分析4.1系统测试4.1.1启动超级管理员模式并输入密码命令:sudosu4.1.2对源程序进行编译命令:make4.1.3加载驱动程序并查看命令:insmodlydev.ko和lsmod4.1.4显示主设备号命令:cat/proc/devices4.1.5创建节点并查看命令:mknod/dev/lydev550和cd/dev4.1.6编译测试程序命令:gcc–ottest.c4.1.7运行测试函数命令:./t4.1.8进行打开设备操作命令:14.1.9进行写操作并输入hello命令:24.1.10进行读操作命令:34.1.11进行I/O控制命令:44.1.12进行释放设备操作命令:54.1.13进行退出操作命令:64.1.14卸载驱动程序命令:rmmodlydev4.1.15查看日志命令:dmesg4.1.16删除节点并查看命令:rmlydev和ls4.2调试分析最开始的时候没有启用sudo模式,导致很多命令不能执行,启用模式的时候需要输入密码,但是输入密码的时候是不显示东西的以为出错,查阅资料之后才知道是应有的现象。程序测试一遍之后再次测试很多命令不能执行,原因是第一次测试之后产生的各种文件没有删除,再次测试会显示已存在。有一次测试程序,不能卸载驱动,用lsmod查看有两个进程使用,后来强制关机才能正常使用,原因不明,以后要加强学习。五、程序清单1.主程序#includelinux/module.h#includelinux/types.h#includelinux/fs.h#includelinux/errno.h#includelinux/mm.h#includelinux/sched.h#includelinux/init.h#includelinux/cdev.h#includelinux/slab.h#includeasm/io.h#includeasm/system.h#includeasm/uaccess.h#includelydev.h#defineSCULL_IOC_MAGIC'k'#defineSCULL_IOCRESET_IO(SCULL_IOC_MAGIC,0)#defineSCULL_IOCSQUANTUM_IOW(SCULL_IOC_MAGIC,1,int)#defineSCULL_IOCSQSET_IOW(SCULL_IOC_MAGIC,2,int)#defineSCULL_IOCTQUANTUM_IO(SCULL_IOC_MAGIC,3)#defineSCULL_IOCTQSET_IO(SCULL_IOC_MAGIC,4)#defineSCULL_IOCGQUANTUM_IOR(SCULL_IOC_MAGIC,5,int)#defineSCULL_IOCGQSET_IOR(SCULL_IOC_MAGIC,6,int)#defineSCULL_IOCQQUANTUM_IO(SCULL_IOC_MAGIC,7)#defineSCULL_IOCQQSET_IO(SCULL_IOC_MAGIC,8)#defineSCULL_IOCXQUANTUM_IOWR(SCULL_IOC_MAGIC,9,int)#defineSCULL_IOCXQSET_IOWR(SCULL_IOC_MAGIC,10,int)#defineSCULL_IOCHQUANTUM_IO(SCULL_IOC_MAGIC,11)#defineSCULL_IOCHQSET_IO(SCULL_IOC_MAGIC,12)#defineSCULL_IOC_MAXNR14staticintly_major=55;module_param(ly_major,int,S_IRUGO);structly_dev*ly_devp;/*设备结构体指针*/structcdevcdev;staticintioctl(structfile*file,unsignedintcmd,unsignedlongarg);/*文件打开函数*/intly_open(structinode*inode,structfile*filp){structly_dev*dev;/*获取次设备号*/intnum=MINOR(inode-i_rdev);if(num=MYDEV_NR_DEVS)return-ENODEV;dev=&ly_devp[num];/*将设备描述结构指针赋值给文件私有数据指针*/filp-private_data=dev;return0;}/*文件释放函数*/intly_release(structinode*inode,structfile*filp){return0;}/*读函数*/staticssize_tly_read(structfile*filp,char__user*buf,size_tsize,loff_t*ppos){unsignedlongp=*ppos;unsignedintcount=size;intret=0;structly_dev*dev=filp-private_data;/*获得设备结构体指针*//*判断读位置是否有效*/if(p=MYDEV_SIZE)return0;if(countMYDEV_SIZE-p)count=MYDEV_SIZE-p;/*读数据到用户空间*/if(copy_to_user(buf,(void*)(dev-data+p),count)){ret=-EFAULT;}else{*ppos+=count;ret=count;printk(KERN_INFOread%dbytes(s)from%lx\n,count,p);}returnret;}/*写函数*/staticssize_tly_write(structfile*filp,constchar__user*buf,size_tsize,loff_t*ppos){unsignedlongp=*ppos;unsignedintcount=size;intret=0;structly_dev*dev=filp-private_data;/*获得设备结构体指针*//*分析和获取有效的写长度*/if(p=MYDEV_SIZE)return0;if(countMYDEV_SIZE-p)count=MYDEV_SIZE-p;/*从用户空间写入数据*/if(copy_from_user(dev-data+p,buf,count))ret=-EFAULT;else{*ppos+=count;ret=count;printk(KERN_INFOwritten%dbytes(s)from%lx\n,count,p);}returnret;}/*I\O控制函数*/staticintioctl(structfile*file,unsignedintcmd,unsignedlongarg){if(_IOC_TYPE(cmd)!=SCULL_IOC_MAGIC){return-EFAULT;}if(_IOC_NR(cmd)SCULL_IOC_MAXNR){return-EFAULT;}switch(cmd){caseSCULL_IOCRESET:printk(SCULL_IOCRESET+%lx,a

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功