嵌入式课程设计2Word文档格式.docx
- 文档编号:3720818
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:20
- 大小:89.75KB
嵌入式课程设计2Word文档格式.docx
《嵌入式课程设计2Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计2Word文档格式.docx(20页珍藏版)》请在冰点文库上搜索。
设计说明书每人一份(包括的项目:
读书笔记、课程设计报告,设计出电路,电路按设计要求调试,设计体会)。
三、设计的主要内容
根据题目的要求完成以下内容:
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<
LINUXconfig.h>
LINUXkernel.h>
LINUXerrno.h>
LINUXinit.h>
LINUXslab.h>
LINUXmodule.h>
LINUXkref.h>
ASMuaccess.h>
LINUXusb.h>
#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;
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);
dev){
kref_get(&
dev->
kref);
file->
private_data=dev;
exit:
returnretval;
}staticintskel_release(structinode*inode,structfile*file)
{
dev=(structusb_skel*)file->
private_data;
if(dev==NULL)
return-ENODEV;
kref_put(&
kref,skel_delete);
return0;
staticssize_tskel_read(structfile*file,char*buffer,size_tcount,loff_t*ppos)
intbytes_read;
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);
retval){
if(copy_to_user(buffer,dev->
bulk_in_buffer,bytes_read))
retval=-EFAULT;
else
retval=bytes_read;
staticvoidskel_write_bulk_callback(structurb*urb,structpt_regs*regs)
dev=(structusb_skel*)urb->
context;
if(urb->
status&
&
!
(urb->
status==-ENOENT||
urb->
status==-ECONNRESET||
status==-ESHUTDOWN)){
dbg("
%s-nonzerowritebulkstatusreceived:
%d"
__FUNCTION__,urb->
status);
usb_buffer_free(urb->
dev,urb->
transfer_buffer_length,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 课程设计