嵌入式课程设计2.docx

上传人:b****2 文档编号:2004497 上传时间:2023-05-02 格式:DOCX 页数:20 大小:89.75KB
下载 相关 举报
嵌入式课程设计2.docx_第1页
第1页 / 共20页
嵌入式课程设计2.docx_第2页
第2页 / 共20页
嵌入式课程设计2.docx_第3页
第3页 / 共20页
嵌入式课程设计2.docx_第4页
第4页 / 共20页
嵌入式课程设计2.docx_第5页
第5页 / 共20页
嵌入式课程设计2.docx_第6页
第6页 / 共20页
嵌入式课程设计2.docx_第7页
第7页 / 共20页
嵌入式课程设计2.docx_第8页
第8页 / 共20页
嵌入式课程设计2.docx_第9页
第9页 / 共20页
嵌入式课程设计2.docx_第10页
第10页 / 共20页
嵌入式课程设计2.docx_第11页
第11页 / 共20页
嵌入式课程设计2.docx_第12页
第12页 / 共20页
嵌入式课程设计2.docx_第13页
第13页 / 共20页
嵌入式课程设计2.docx_第14页
第14页 / 共20页
嵌入式课程设计2.docx_第15页
第15页 / 共20页
嵌入式课程设计2.docx_第16页
第16页 / 共20页
嵌入式课程设计2.docx_第17页
第17页 / 共20页
嵌入式课程设计2.docx_第18页
第18页 / 共20页
嵌入式课程设计2.docx_第19页
第19页 / 共20页
嵌入式课程设计2.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌入式课程设计2.docx

《嵌入式课程设计2.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计2.docx(20页珍藏版)》请在冰点文库上搜索。

嵌入式课程设计2.docx

嵌入式课程设计2

大连交通大学信息工程学院

嵌入式综合课程设计说明书

题目键盘鼠标驱动设计

起讫日期2009年12月14日 至2009年12月31日

所在院系  信息工程学院 

专业计算机班级06-3

学生姓名尹宇学号2006102303

指导教师郑广海

2009年12月14日

 

大连交通大学信息工程学院

嵌入式综合课程设计任务书

题目键盘鼠标驱动设计

起讫日期2009年12月14日 至2009年12月31日

学生姓名尹宇专业班级计算机

所在院系信息工程学院

指导教师郑广海职称副教授

所在单位软件学院

2009年12月14日

内容及要求:

一、目的

进一步消化理解嵌入式综合原理,是综合练习,涉及的内容更深更广些,更加实用。

通过课程设计,一方面可以结合课程的教学内容循序渐进地进行键盘鼠标驱动设计专用串行通信芯片设计设计能力的实践训练,另一方面,在参与一系列硬件项目的实践过程中,能够提高综合运用所学知识解决实际问题的能力,以及获得相关项目管理和团队合作等方面的具体经验。

能够综合运用所学计算机组成原理知识,分析和解决问题的能力。

提高学生查阅资料,运用计算机辅助工具绘制原理图,阅读原理图以及对原理图进行功能模拟的能力。

提高学生对计算机的各组成部分的理解,进一步深入认识计算机系统,强化学生的系统意识。

提高学生的动手能力,学会使用常用的集成电路芯片。

二、课程设计内容及要求

课程设计的时间为2周时间。

根据题目的基本需求,设计电路图,设计功能,并写出详细的设计说明书。

需要上交的文档资料:

设计说明书每人一份(包括的项目:

读书笔记、课程设计报告,设计出电路,电路按设计要求调试,设计体会)。

三、设计的主要内容

根据题目的要求完成以下内容:

1.根据键盘鼠标驱动设计的功能确定键盘鼠标驱动设计在计算机系统中的位置,明确CPU访问键盘鼠标驱动设计专用串行通信芯片设计电路的机理,领会接口电路、CPU、接口电路控制的外设之间的关系;

2.画出键盘鼠标驱动设计专用串行通信芯片设计电路方框图,确定键盘鼠标驱动设计专用串行通信芯片设计电路的模块划分,指明每个模块的功能和模块之间的连接关系;

3.进行键盘鼠标驱动设计专用串行通信芯片设计原理设计,绘制键盘鼠标驱动设计专用串行通信芯片设计原理图;

4.用软件工具MAXPLUSⅡ对原理图进行逻辑综合,排除基本的逻辑错误;

5.调试:

根据键盘鼠标驱动设计专用串行通信芯片设计电路的功能绘制波形图,利用软件工具MAXPLUSⅡ进行功能模拟,把输入波形图和电路功能进行统一分析,得到一个输出波形图,设计者通过对这个波形图的逻辑分析就可以判断设计的逻辑功能是否正确;

四、课程设计说明书的编写规范

写出不少于3000字的课程设计说明书。

说明书中除了在封面应有题目、班级、姓名、学号和课程设计日期、地点以外,工整认真地写出课程设计报告,其正文一般有如下几个方面的内容:

①提供完善的逻辑图(即总框图即数据通路图)

②提供全部的微程序

③提供系统的调试方法

④提供系统的功能测试方法

⑤心得体会小结

指导教师签字:

                    2009年12月14日

摘要

以Intel为首的七家大公司于1994年推出了USB(UniversalSerialBus),通用串行总线)协议,由于USB具有速度高,成本低,功耗低,支持即插即用(Plug&Play)和使用维护方便等优点,协议成熟以后迅速占领了计算机低、中速处部设备市场。

Linux内核也从2.2.18开始增加了对USB的支持,到2.4.x的内核对USB的支持已比较完善。

USB协议规范定义了一套任何类型的设备都可以遵循的标准。

如果一个设备遵循该标准,就不需要一个特殊的驱动,对于不符合这些类的其它类型的设备,需要针对特定的设备编写驱动。

随着Linux的普及、嵌入式的快速发展和USB设备的广泛应用,Linux下的USB设备驱动开发越来越频繁。

USB是目前在打印机、数字存储设备、输入输出设备、数码相机、MP3播放器等其他外围设备中得到广泛应用的连接方式。

USB设备具有使用方便,速度快,连接灵活,即插即用,总线供电等优点。

由于USB设备的方便与快捷,因此它们很快得到了用户的认可。

 

关键词:

USB驱动输入输出设备嵌入式

目录

1.读书笔记1

2.设计原理2

2.1USB规范2

2.2模块2

2.3Linux下USB子系统体系结构2

2.4设备文件3

3.详细设计4

3.1USB驱动的注册与注销4

3.2USB设备的探测与断开4

3.3操作及数据传输5

3.4驱动模块的编译配置和使用5

4.程序流程图6

5.编码及测试7

5.1usb-skeleton源码7

5.2makefile源码11

参考文献13

1.读书笔记

USB设备越来越多,而Linux在硬件配置上仍然没有做到完全即插即用,对于Linux怎样配置和使用他们,也越来越成为困扰我们的一大问题。

本文分两部分着力从Linux系统下设备驱动的架构,去阐述怎样去使用和配置以及怎样编制USB设备驱动。

对于一般用户,可以使我们明晰Linux设备驱动方式,为更好地配置和使用USB设备提供了方便;而对于希望开发Linux系统下USB设备驱动的程序员,本次课设,给我们提供了初步学习USB驱动架构的机会。

通过这次课设,我们了解了合作的重要性,同时,也对开源的LINUX产生了浓厚的兴趣,LINUX的内核分的十分明确,一个又一个模块互相间的调用,很清晰地构成了依赖的关系,骨架让我们自己编写程序成为了可能,我们学到了很多很多,了解了USB的基本构成,历史,发展趋势等等,获得了很大的收获。

2.设计原理

2.1USB规范

USB支持分层的菊花链结构如下图所示,USB总结拓朴结构由三种元素组成:

主机-Host、集线器-Hub、设备Node。

Hub是每个星形结构的中心,用于连接设备和主机,而实际的PC就是主机-Host和根集线器-RootHub,可以连接外设或Hub,Hub还可以连接其它的外设以及更下层Hub。

图1USB总线拓扑结构

每个设备具有一个或多个配置,配置提供功率和带宽等。

而每个配置可以有多个接口,一个接口代表了一个基本功能,可同时有效,并可被不同的驱动程序连接。

一个接口有多个端点,端点是与设备进行通信的单向(OUT/IN)访问点,是最基本的通信形式。

它们提供缓冲区来存储从设备而来的名发送到设备的数据。

每个USB设备至少有两个端点,它们分别是进出方向的,编号为0的端点,用于控制总线上的设备,由服务层管理,设备驱动程序不能直接使用。

2.2模块

模块是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。

模块最主要的用处就是用来实现设备驱动程序。

Linux下对于一个硬件的驱动,可以有两种方式:

直接加载到内核代码中,启动内核时就会驱动此硬件设备。

另一种就是以模块方式,编译生成一个.ko文件(在2.4以下内核中是用.o作模块文件,我们以2.6的内核为准)。

当应用程序需要时再加载到内核空间运行。

所以我们所说的一个硬件的驱动程序,通常指的就是一个驱动模块。

2.3Linux下USB子系统体系结构

Linux下的USB系统分成三部分:

USBcore、USB设备驱动、USB主控制器,如下图所示:

图2LinuxUSB体系结构

其中USBcore是Linux中USB体系结构的核心,它将USB体系分成包括它自身在内的三个层次,USBcore为USB驱动程序提供的一系列用于访问和控制USB硬件的接口,通过这些接口来实现USB设备驱动的数据处理的功能。

还提供总线管理,设备维护、配置和应用程序访问USB系统的文件接口等。

USB主控制器驱动(HCD)是USB主机和硬件通信的软件模块。

分为通用主控制器接口(UHCI)和开放控制器接口(OHCI)。

HCD层为USBcore层提供屏蔽了硬件具体细节的接口函数,并初始化主控制器硬件,实现配置、控制根集线器及完成4类传输。

USB设备驱动才是特定USB设备与应用程序交互的软件模块。

由于系统提供了USBcore和HCD两层协议,为设备驱动屏蔽了硬件操作。

这样设备驱动不直接与硬件打交道,大大简化了设备驱动程序开发的复杂度。

2.4设备文件

对于一个设备,它可以在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在,但它不是普通意义上的文件,它是设备文件,更确切的说,它是设备节点。

这个节点是通过mknod命令建立的,其中指定了主设备号和次设备号。

主设备号表明了某一类设备,一般对应着确定的驱动程序;次设备号一般是区分不同属性,例如不同的使用方法,不同的位置,不同的操作。

这个设备号是从/proc/devices文件中获得的,所以一般是先有驱动程序在内核中,才有设备节点在目录中。

这个设备号(特指主设备号)的主要作用,就是声明设备所使用的驱动程序。

驱动程序和设备号是一一对应的,当你打开一个设备文件时,操作系统就已经知道这个设备所对应的驱动程序。

对于一个硬件,Linux是这样来进行驱动的:

首先,我们必须提供一个.ko的驱动模块文件。

我们要使用这个驱动程序,首先要加载它,我们可以用insmodxxx.ko,这样驱动就会根据自己的类型(字符设备类型或块设备类型,例如鼠标就是字符设备而硬盘就是块设备)向系统注册,注册成功系统会反馈一个主设备号,这个主设备号就是系统对它的唯一标识。

驱动就是根据此主设备号来创建一个一般放置在/dev目录下的设备文件。

在我们要访问此硬件时,就可以对设备文件通过open、read、write、close等命令进行。

而驱动就会接收到相应的read、write操作而根据自己的模块中的相应函数进行操作了。

3.详细设计

Linuxkernel源码driverds/usb/usb-skeleton.c为我们提供了一个最基础的USB驱动程序,称为USB骨架程序(usb-skeleton)。

它是USB驱动程序的基础,通过对它源码的分析,可以迅速地了解USB驱动框架,并实现自己的USB硬件的驱动。

3.1USB驱动的注册与注销

LinuxUSB驱动程序需要做的第一件事情就是在LinuxUSB子系统里注册,并提供一些相关信息,例如这个驱动程序支持那种设备,当被支持的设备从系统插入或拔出时,会有哪些动作。

所有这些信息都传送到USB子系统中。

模块方式首先用module_init()和module_exit()向内核注册初始化与销毁函数。

module_init(usb_skel_init);

module_exit(usb_skel_exit);

而在初始化函数usb_skel_init与销毁函数usb_skel_exit分别调用usb_register(struct*usb_driver)与usb_deregister(struct*usb_driver)来注册与销毁系统定义的描述驱动程序的结构体structusb_driver。

usb_driver需要初始化四个东西:

模块的名字skeleton,探测函数skel_probe,断开函数skel_disconnect以及id_table用于描述该驱动支持的设备。

当有一个设备接到集线器时,USB子系统就会检查这个设备的vendorID与productID,如果它们的值与在驱动程序中宏定义的USB_SKEL_VENDOR_ID,USB_SKEL_PRODUCT_ID相匹配,那么USB子系统就会调用该驱动程序作为该设备的驱动。

3.2USB设备的探测与断开

当一个设备被安装而USB核心认为该驱动程序应该处理时,探测函数skel_probe被调用,探测函数检查传递给它的设备信息,确定驱动程序是否真的适合该设备。

当驱动程序因为某种原因不应该控制设备时,断开函数skel_disconnect被调用,它可以做一些清理工作。

系统会传递给探测函数一个usb_interface*跟一个structusb_device_id*作为参数。

他们分别是该USB设备的接口描述跟它的设备ID描述。

probe函数用来探测设备的端点地址和缓冲区等,并初始化用于控制USB设备的局部结构usb_skel,通过它才能和设备进行通信。

在probe中首先使用interface_to_usbdev通过interface得到usb_device。

接下来是遍历遍历所有的端点,检查他们的类型及方向,并把这些信息全部存在局部usb_skel类型结构体dev中。

然后把这个包含各种信息的局部usb_skel结构体保存到这个接口设备中,以便后面使用。

接着把usb_class_driver类结构体skel_class注册到interface来为该USB设备分配一个次设备号。

当USB设备断开时,调用usb_disconect函数清理和设备相关的资源。

通过usb_set_intfdata释放usb_skel结构体;通过usb_deregister_dev()释放次设备号,交还给USB系统;将使用计数(kref)减一,如使用计数(kref)为0时,则调用skel_delete释放kref。

3.3操作及数据传输

以上通过probe探测函数,skeleton驱动已经和设备绑定,任何应用程序对设备的操作都是通过skel_class中的file_operation结构体中所定义的打开-open(),读写-read()、write(),释放-release函数进行的。

其中skel_open主要功能是:

通过本驱动的usb_driver及次设备号找到本驱动的接口;初始化usb_skel结构本类型的dev;增加模块使用计数(kref);填充file的private_data数据结构。

而skel_release主要实现的功能是:

释放file的private_data中的数据,将使用计数(kref)减一,如使用计数(kref)为0时,调用skel_delete释放kref。

读写函数中最基本的就是数据的传输功能,LinuxUSB子系统的最重要的数据传输结构名为USBRequestBlock(URB)。

这个结构包含了用于启动任何USB传输类型的所有参数。

所有的传输请求都被异步的发送给USBcore而且通过回调函数告知回调完成。

skel_write()主要实现的功能是:

分配urb数据结构给设备;初始化urb结构为批量方式的URB,并指出回调函数skel_write_bulk_callback;提交给USBcore来传输到设备;

skel_read():

只是发送单独的数据块或控制消息,也可以不创建urb实现传输,程序使用了usb_bulk_msg来传送数据。

调用usb_bulk_msg函数并传递一个存储空间,用来缓冲和放置驱动收到的数据,若没有收到数据,就失败并返回一个错误信息。

3.4驱动模块的编译配置和使用

现在我们的驱动程序已经大体写好了,然后在linux下把它编译成模块就可以把驱动模块插入到内核中运行了。

写好编译的Makefile文件,在linux下直接执行make就可以生成驱动模块了。

在用insmod命令将编译好的模块调入内核时,module_init()函数被调用。

用lsmod可以看到你插入到内核中的模块。

加载驱动模块成功后就会在/dev/下生成设备文件,可以对这个设备文件进行打开、读写、关闭等的操作。

在用rmmod卸载模块时,module_exit()函数被调用。

4.程序流程图

5.编码及测试

5.1usb-skeleton源码

usb-skeleton.c

#include  

#include  

#include  

#include  

#include  

#include  

#include  

#include  

#include  

#defineUSB_SKEL_VENDOR_ID0xfff0  

#defineUSB_SKEL_PRODUCT_ID0xfff0  

staticstructusb_device_idskel_table[]={

   {USB_DEVICE(USB_SKEL_VENDOR_ID,USB_SKEL_PRODUCT_ID)},

   {}                /*Terminatingentry*/

};

MODULE_DEVICE_TABLE(usb,skel_table);

#defineUSB_SKEL_MINOR_BASE192  

   structusb_device*udev;          

   structusb_interface*interface;     

   unsignedchar*    bulk_in_buffer;    

   size_t         bulk_in_size;      

   __u8           bulk_in_endpointAddr;  

   __u8           bulk_out_endpointAddr;

   structkref    kref;

};

#defineto_skel_dev(d)container_of(d,structusb_skel,kref)  

staticstructusb_driverskel_driver;

staticvoidskel_delete(structkref*kref)

{       structusb_skel*dev=to_skel_dev(kref);

   usb_put_dev(dev->udev);

   kfree(dev->bulk_in_buffer);

   kfree(dev);

}

staticintskel_open(structinode*inode,structfile*file)

{   structusb_skel*dev;

   structusb_interface*interface;

   intsubminor;

   intretval=0;

   subminor=iminor(inode);

   interface=usb_find_interface(&skel_driver,subminor);

   if(!

interface){

       err("%s-error,can'tfinddeviceforminor%d",

            __FUNCTION__,subminor);

       retval=-ENODEV;

       gotoexit;

   }

   dev=usb_get_intfdata(interface);

   if(!

dev){

       retval=-ENODEV;

       gotoexit;

   }

      kref_get(&dev->kref);

   file->private_data=dev;

exit:

   returnretval;

}staticintskel_release(structinode*inode,structfile*file)

{

   structusb_skel*dev;

   dev=(structusb_skel*)file->private_data;

   if(dev==NULL)

       return-ENODEV;

      kref_put(&dev->kref,skel_delete);

   return0;

}

staticssize_tskel_read(structfile*file,char*buffer,size_tcount,loff_t*ppos)

{

   structusb_skel*dev;

   intretval=0;

   intbytes_read;

   dev=(structusb_skel*)file->private_data;

           retval=usb_bulk_msg(dev->udev,

                 usb_rcvbulkpipe(dev->udev,dev->bulk_in_endpointAddr),

                 dev->bulk_in_buffer,

                 min(dev->bulk_in_size,count),

                 &bytes_read,10000);

    if(!

retval){

       if(copy_to_user(buffer,dev->bulk_in_buffer,bytes_read))

           retval=-EFAULT;

       else

           retval=bytes_read;

   }

   returnretval;

}

staticvoidskel_write_bulk_callback(structurb*urb,structpt_regs*regs)

{

   structusb_skel*dev;

   dev=(structusb_skel*)urb->context;

   if(urb->status&&  

       !

(urb->status==-ENOENT||  

         urb->status==-ECONNRESET||

         urb->status==-ESHUTDOWN)){

       dbg("%s-nonzerowritebulkstatusreceived:

%d",

           __FUNCTION__,urb->status);

   }

      usb_buffer_free(urb->dev,urb->transfer_buffer_length,  

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2