APP下载

基于光传输的USB键盘鼠标一体化设计

2012-07-25胡晓吉

计算机工程与设计 2012年7期
关键词:描述符字节按键

戴 捷,胡晓吉

(中国电子科技集团公司 第十五研究所,北京100083)

0 引 言

光纤通信系统具有可靠性高和带宽宽的特点,因此在远程通信中得到了广泛应用。但是,由于通常计算机都不具有支持光纤的接口,因此,开发基于光纤传输的通用接口设备是很有必要的。此外,光纤能够有效抵抗电磁干扰,这就使得光传输在军用领域尤为得到青睐。USB接口已经是目前应用得最为广泛的外设接口。基于USB接口的设备随处可见,作为计算机必备的输入设备,USB键盘和鼠标通常是作为相互独立的设备连接到计算机上的。本文提出了一种单芯片的解决方案,即通过一块芯片同时实现USB键盘和鼠标的功能,可以称之为带鼠标功能的键盘。为了便于扩展,设计中没有专门设计键盘和鼠标的按键电路,而是采用通用的USB键盘和鼠标,通过设计一控制电路,来达到能够同时操作鼠标和键盘的目的。这样,从主机的角度来看,只检测到一个人体学输入设备;但是,从用户端看,鼠标和键盘能够同时使用。

1 USB光纤传输系统总体架构

系统的总体设计框图如图1所示。

通用USB键盘和鼠标同时插入设备端的USB接口,键盘和鼠标通过各自的USB总线通道经差分转单端电路转换后,由光发送器发送至主机端;主机端接收到键盘或是鼠标的数据后,经由FPGA解码,将数据按照USB HID用途表中定义的格式发送至USB控制芯片CY7C68013,USB控制芯片对数据进行必要的整合,使之满足USB协议的格式,发往PC机。

通过对USB控制芯片进行编程,使得PC机能够识别该系统为人体学输入设备,并挂至Windows通用HID驱动下。

图1 USB光纤键盘/鼠标总体设计框架

2 硬件电路设计

2.1 USB接口设计

USB接口部分的电路是联系USB主机与USB设备之间的桥梁。当有USB设备插入主机时,主机能够识别到设备的插入并且知道插入的是何种类型的设备 (低速/全速/高速),同时主机还要完成对设备的枚举。

在USB主机或者USB集线器的下游端口的D+和D-上,分别接一个15KΩ的下拉电阻到地。这样,没有设备插入时,输入端就被这两个下拉电阻拉到了低电平。而在USB设备端,在D+或D-上接了一个1.5KΩ的上拉电阻。上拉电阻接在D+或D-上,由设备的速度决定。对于全速和高速设备,上拉电阻接在D+上;对于低速设备,上拉电阻接在D-上。

当设备插入到主机或集线器时,接了上拉电阻的那条数据线的电压或被拉高,集线器检测到这个高电平就报告给USB主控制器,这样就检测到设备的插入了,并根据检测到被拉高的数据线是D+还是D-来判断插入的是什么速度类型的设备。

上述过程完成后,USB主机紧接着就要完成的是对设备的枚举。枚举就是从设备读取各种描述符信息,主机根据这些信息来加载合适的驱动程序,从而知道设备是什么样的设备 (是存储类还是打印机类又或者是人机接口类),如何进行通信等。本设计中需要完成的是一个光传输的键盘/鼠标,考虑到 Windows操作系统自带的人机接口类HID驱动程序,因此,枚举的主要工作就是将此USB键盘/鼠标配置成HID类设备,并且将其挂接到Windows通用HID驱动下。

USB设备的枚举可以通过专用芯片实现或是通过MCU(单片机或FPGA)编程来模拟。当使用MCU来模拟枚举过程时,还需要一通用的接口芯片如PDIUSBD12来连接USB差分数据线接口和MCU接口,在MCU中实现USB协议。这种方式工作量比较大,需要对USB的协议有比较深入的理解。

Cypress公司推出的EZ-USB FX2芯片CY7C68013实现了物理协议芯片和单片机的集成。其内部包含了USB2.0微处理器、USB2.0收发器、SIE(串行接口引擎)、增强的8051内核和可编程的外围接口。按照硬件电路连接要求完成相应的连接后,对内部51单片机进行编程也即所谓的固件编程,就可以实现所需的功能。Cypress提供了固件编程框架,简化了编程的工作量,只需在框架的基础上修改或添加代码就能够完成固件的编程。本设计中,正是采用了专用芯片的解决方案。

2.2 光接口设计

光纤接口设计主要包括接收模块和发送模块两部分,它们总是成对的出现。本系统中需要三组收发模块。一组用来接收鼠标发送的信息。两外两组分别用来接收来自键盘的按键信息,同时向键盘传输来自PC机的控制信息:数字键盘锁定灯和大写字母锁定灯的控制信息。

2.3 其他部分设计

此外,设计中还用到两组单端/差分转换电路,用来将USB差分信号转成单端信号,或是将单端信号转成USB差分信号对。

FPGA部分的设计注意对输入输出信号进行滤波,对于PLL和内核供电电压进行掉电和过压保护设计。

3 Cypress固件程序设计

Cypress固件程序的设计是此次设计的核心。Cypress提供了固件编程框架,该框架已将USB标准请求和USB电源管理封装,并且提供了钩子函数,只需根据需要在钩子函数中编写代码即可完成编程。

建立框架所需的文件包括:Reg80320.h、Ezusb.h、FX2regs.h、Fw.c、Periph.c、Dscr.a51、Ezusb.lib和 USBJmpTb.OBJ等。其中,Ezusb.h是库函数申明,以及变量、宏定义、数据类型定义;Reg80320.h是8051头文件,由KEIL提供;FX2regs.h是FX2寄存器头文件;Fw.c是固件框架源文件;Ezusb.lib是 EZUSB库文件;USBJmpTb.OBJ是中断跳转函数目标文件。这些文件Cypress均已提供,直接应用即可。Periph.c是用户钩子函数,用户可以修改,在不同的应用中文件名可以不一样。Dscr.a51是USB描述符列表,用户也可以修改。在实际的编程中,需要根据目标需求对Periph.c和Dscr.a51两个文件进行修改。

USB枚举的过程也是主机要求设备返回各种描述符的过程。端点0默认配置为控制管道,用来完成所规定的设备请求。设计中需要对Dscr.a51进行必要的修改。

(1)设备描述符 (DeviceDscr)用来唯一地标识设备,设备驱动程序加载是通过该描述符中的VID和PID来确定;

(2)接口描述符 (Interface Descriptor)主要用来定义接口包含的端口数及接口所使用的类;

(3)HID描述符 (HIDDscr)是HID设备配置所必需的描述符,应该跟在接口描述符的后面;

(4)端点描述符 (Endpoint Descriptor)是比较重要的描述符,主要用来定义接口所包含的端点数目以及端点的属性、所支持的最大包的长度和端点的查询时间;

(5)字符串描述符 (StringDscr)是可选的,方便开发中的产品标识;

(6)HID报告描述符 (HIDReportDscr)是很重要的一种描述符,也是在实际开发中可以根据需要灵活修改的一种描述符。USB HID设备正是通过报告 (report)来传送数据的,包括输入报告和输出报告。输入报告是USB设备发送给主机的,本设计中主要指键盘和鼠标的按键信息;输出报告是主机发送给USB设备的,在设计中,由于使用了FPGA模拟USB设备,所以可以不需要输出报告。

报告里面实际包含的是要传送的数据,数量为整数个字节,被划分为一个个域。通常,输入报告是通过中断输入端点返回的,输出报告则不然。输出报告的发送有两种:当没有中断输出端点时,可以通过控制输出端点0发送;当有中断输出端点时,通过中断输出端点发出。不管设备是否具有中断输出端点 (中断输入端点是必须的),主机都可以通过获取报告和设置报告的请求从端点0来获取或发送报告。

本设计中提出了一种单芯片的USB键盘/鼠标解决方案。系统中只用到了一个输入端点和一个输出端点即可同时实现键盘和鼠标功能。

要实现上述功能,HID报告描述符的设计是关键。在报告描述符中要同时能够实现键盘报告和鼠标报告。

一个报告描述符中可以有多个外层应用集合,而系统软件就是通过分析外层应用集合的功能来增加不同的设备驱动的。在本设计中只需要实现用途分别为键盘和鼠标的两个应用集合即可。同时,每个应用集合里还要增加一个报告ID。以区分返回数据的作用。报告ID是报告输入或者输出时的第一个字节,当没有定义报告ID时,报告前面就没有报告ID。对于返回的没有报告ID的报告,人体学输入设备驱动会自动增加一个报告ID0;而应用程序在发送数据出去时,也要带一个值为0的报告ID。人体学输入设备驱动会自动去掉这个值为0的报告ID,只发送数据出去。因此,本设计中,分别在两个开集合的条目后增加一个报告ID的条目,报告ID分别为1和2(报告ID0是保留的,不能使用)。

如下所示是设计中采用的报告描述符:

HIDReportDscr:

//键盘报告描述符

db 05h,01h ; Usage Page(Generic Desktop)

db 09h,06h ; Usage(Keyboard)

db 0A1h,01h; Collection(Application)

db 85h,01h; 键盘报告ID为1

db 05h,07h ; Usage Page(Key codes)

db 19h,0E0h; Usage minimum(234)

db 29h,0E7h; Usage maximum(231)

db 15h,00h ; Logical minimum(0)

db 25h,01h ; Logical maximum(1)

db 75h,01h ; Report size(1)

db 95h,08h ; Report count(8)

db 81h,02h ; Input(data,variable,absolute)

db 95h,01h ; Report count(1)

db 75h,08h ; Report size(8)

db 81h,01h ; Input(constant)

db 95h,05h ; Report count(5)

db 75h,01h ; Report size(1)

db 05h,08h ; Usage Page(LED)

db 19h,01h ; Usage minimum(1)

db 29h,05h ; Usage maximum(5)

db 91h,02h ; Output(data,variable,absolute)

db 95h,01h ; Report count(1)

db 75h,03h ; Report size(3)

db 91h,01h ; Output(constant)

db 95h,03h ; Report count(3)

db 75h,08h ; Report size(8)

db 15h,00h ; Logical minimum(0)

db 25h,65h ; Logical maximum(101)

db 05h,07h ; Usage page(key codes)

db 19h,00h ; Usage minimum(0)

db 29h,65h ; Usage maximum(101)

db 81h,00h ; Input(data,array)

db 0C0h ;End Collection

//鼠标报告描述符

db 05h,01h ; Usage Page(Generic Desktop),

db 09h,02h ; Usage(Mouse),

db 0A1h,01h ; Collection(Application),

db 85h,02h ; 鼠标报告ID为2

db 09h,01h ; Usage(Pointer),

db 0A1h,00h ; Collection(Physical),

db 95h,03h ; Report Count(3),

db 75h,01h ; Report Size(1),

db 05h,09h ; Usage Page(Buttons),

db 19h,01h ; Usage minimum(1)

db 29h,03h ; Usage maximum(3)

db 15h,00h ; Logical minimum(0),

db 25h,01h ; Logical maximum(1),

db 81h,02h ; Input(Data,Variable,Absolute),(3button bits)

db 95h,01h ; Report Count(1),

db 75h,05h ; Report Size(5),

db 81h,01h ; Input(Constant)

db 75h,08h ; Report Size(8)

db 95h,02h ; Report Count(2)

db 05h,01h ; Usage Page(Generic Desktop),

db 09h,30h ; Usage(X),

db 09h,31h ; Usage(Y),

db 16h,01h,80h ; Logical Minimum (-127),

db 26h,0ffh,7Fh ; Logical Maximum(+127),

db 81h,06h ; Input(Data,Variable,Relative)

db 0C0h ;End Collection

HIDReportDscrEnd:

上述设计中,键盘输入报告有6个字节,分别存入CY7C68013的EP1INBUF [0]-EP1INBUF [5]中,第一个字节为报告ID,值为1;第二个字节表示特殊按键,如ctrl、shift、alt等;第三个字节保留;后面的3个字节为普通按键。如果同时有多个键按下,则在相应的字节显示键值,无键按下时,则为0。具体的键位值可以查看HID用图表 (USB HID usage table)。

键盘的输出报告2个字节,存入EP1OUTBUF[0]和EP1OUTBUF[1]中,第一个字节是报告ID,第二个字节用来标识键盘的工作状态如Num Lock等状态信息,实际系统设计中可以不用。设计中,在FPGA内部直接模拟这些特殊的按键状态,即,当Caps Lock或Num Lock键按下时,不需要等待主机发送输出报告,FPGA程序内部直接按照USB数据格式发送输出数据至差分数据线D+、D-上。

对于鼠标,只有输入报告,没有输出报告。其输入报告有5个字节,分别存入CY7C68013的EP1INBUF[0]-EP1INBUF[4]中,第一个字节为报告ID,值为2;第二个字节表示按键;第三个字节表示x轴偏移 (正值表示右移,负值表示左移,0表示不动);第四个字节表示y轴偏移 (正值表示下移,负值表示上移,0表示不动);第五个字节表示鼠标滚轮 (正值为往上滚动,负值为往下滚动)。

完成描述符部分的设计后,即可在钩子函数TD_Init()和TD_Poll()中编写需要实现的功能函数。

TD_Init()在FX2重枚举后首先调用,用户可以在该函数中完成全局变量和FX2寄存器的初始化操作。

TD_Poll()函数在main函数while程序模块中被调用,除非被更高级别的中断所打断,该函数将被重复调用,根据需要在此添加所需的功能。

设计中的部分功能代码如下:

void TD_Init(void) //Called once at startup

key_oldbuttons=0xf0;

mouse_oldbuttons=0xf0;

OED &=0x00; //PD.0-PD.7按键输入

OEE &=0x00; //PE.0-PE.7按键输入

EP1OUTCFG=0xB0; //valid,interrupt

EP1INCFG=0XB0; //valid,interrupt

EP2CFG=EP4CFG=EP6CFG=EP8CFG=0;//disable unused endpoints

void TD_Poll(void) //Called repeatedly while the device is idle

if(! (EP1INCS &bmEPBUSY)) //Is the IN1BUF available,

key_buttons=IOD&0/x/ff;读取键盘按键值

fun=IOD&0xc0; //获取功能按键值,PD.7和PD.6

key=IOD&0x3f; //获取普通按键值,PD.5-PD.0

mouse_buttons=IOE&0xff; //获取鼠标按键信息,PE.3-PE.0

if((key_oldbuttons-key_buttons)!=0)

if(fun!=0x80) //无shift键按下

EP1INBUF [0]=0x01;

EP1INBUF [1]=0;

EP1INBUF [3]=key;

else

EP1INBUF [0]=0x01; //Shift键按下EP1INBUF [1]=0x02;

EP1INBUF [3]=key;

EP1INBUF [4]=0;

EP1INBUF [5]=0;

EP1INBUF [2]=0;

EP1INBC=6;

key_oldbuttons=key_buttons;

if((mouse_oldbuttons-mouse_buttons)!=0)

EP1INBUF [0]=0x02;

if(mouse_oldbuttons&0x01)

EP1INBUF [1]=0x01; //左键

if(mouse_oldbuttons&0x02)

EP1INBUF [1]=0x02; //右键

if(mouse_oldbuttons&0x04)

EP1INBUF [2]=-10; //x轴左移10个单位,值可修改

if(mouse_oldbuttons&0x08)

EP1INBUF [2]=10; //x轴右移10个单位,值可修改

if(mouse_oldbuttons&0x10)

EP1INBUF [3]=-10; //y轴上移10个单位,可修改

if(mouse_oldbuttons&0x20)

EP1INBUF [3]=10; //y轴下移10个单位,可修改

//未定义滚轮

mouse_oldbuttons= mouse_buttons;

可以看出功能函数部分的代码比较简单,这是因为PD.0-PD.7管脚的信息是已经经过FPGA解码后的按键值,在TD_Poll()函数中,只需读取管脚值即可。实际上,FPGA的编解码工作也可以由FX2处理器来完成。但是,考虑的8051的处理速度以及系统的可扩展性 (管脚数目和逻辑单元),我们将这一部分的工作都由FPGA来完成。这样,FPGA的工作就是用来模拟USB键盘,所以,除了需要在有按键按下的时候进行解码并向FX2处理器进行输出外,对于某些特殊按键时的主机应答也由FPGA来模拟实现,这就进一步简化了Cypress固件程序的设计。Cypress固件部分只需读取按下的键值,无需输出任何信息。当有特殊按键按下时,FPGA内部的程序模拟主机的应答信号,并对它进行编码,使之符合在USB差分数据线上传输的数据格式。

4 FPGA程序设计

FPGA内部的模块结构如图2所示。

USB键盘/鼠标输出的差分数据经差分转单端电路转换,作为FPGA的输入信号Keyboard-Rx和Mouse-Rx。鼠标和键盘的串并转换模块由两个彼此独立的状态机构成。

对于键盘,FPGA检测到输入信号后,进行解码操作,判断是普通键还是特殊键 (Caps Lock、Num Lock等),是单个键还是组合键 (Shift、Alt和 Windows与其他按键的组合)。如果是普通键或者是组合按键,则经发送模块处理后,输出至FX2处理器;如果是特殊按键,则直接转到编码模块,模拟USB主机的应答数据,编码成USB总线上的数据格式,经并串转换后输出给键盘。

对于鼠标,相对简单一些。解码模块只需判断是否有按键按下 (左键/右键)、X轴方向和Y轴方向的偏移以及滚轮的改变量,同时无需输出任何信息给鼠标。

图2 FPGA内部模块结构

4.1 时钟和串并转换模块

USB协议中定义了3种数据模式:1.5Mb/s的低速模式、12Mb/s的全速模式和480Mb/s的高速模式。HID设备类属于低速设备。设计中需要注意速度的匹配问题。在本设计中,有两处数据的传输遵循的是USB总线协议,一是CY7C68013与上位机的接口部分,二是通用USB键盘/鼠标与FPGA接口部分。如果要实现USB协议,设计的难度比较大。所幸的是CY7C68013在其内部已经实现了USB总线协议;我们的主要工作就集中在对键盘/鼠标传输的数据进行编解码。

时钟分频电路的设计是为了满足对USB总线上的数据进行采样的需要。USB总线上传输数据是以包为基本单位的。USB总线上数据的传输速率可以通过对总线上传输的包的格式进行分析来确定,但是需要对协议进行深入地分析。我们还可以通过示波器来测得。经试验测量,总线上的数据传输速率为15Kb/s,因此,设计中采用30k的时钟来对输入数据进行采样。

串并转换模块的核心是一有限状态机FSM。当USB总线上没有数据传输时,总线一直呈高电平,检测到一个高电平到低电平的数据变化时,表示有数据传输的发生。对于传输的数据是干扰还是有效数据,需要对接下来各个状态下所采样到的数据进行分析,当其满足USB数据包的格式,则认为是有效的USB数据。

4.2 编解码模块

编码解码模块的设计遵循的都是USB总线协议。编码是解码的逆过程。故而,本文仅对解码模块进行详细分析。

USB总线上传输数据的基本单位是包。一个包被分成不同的域。USB协议中主要规定了4种包:令牌包、数据包、握手包和特殊包。这4种包,所包含的域是不一样的。其中,令牌包、握手包主要用在重枚举过程中;特殊包在一些特殊的场合中使用,如:PING (测试)、ERR (错误)等。在本系统中,采用了Cypress芯片来模拟USB设备,芯片本身集成了对各种包的处理功能,所以在与PC接口端的连接无需考虑各种包的处理过程;在设备端,FPGA负责对通用USB键盘/鼠标发送过来的数据进行处理,而忽略重枚举和差错检测等过程,所以,只需要关注对数据包的处理。

数据包和所有包一样,都是以同步域SYNC开始,紧跟着一个包标识符PID,最终以包结束符EOP结束。数据包格式见表1。

表1 USB数据包格式

要进行编解码操作,就需要对数据包进行深入地分析。下述分析都是针对差分转单端后的信号而言。

对于全速和低速设备,同步域使用的是00000001,后面紧跟着PID标识,DATA表示要传输的数据,全速USB的最大长度为1023Bytes,CRC16表示DATA的校验和,全速/低速设备的EOP是一个大约2个数据位宽的单端0信号。

如上所述,这就是单端串行数据线上要发送的原始数据。并非数据线上所传输的真正数据,原始数据还需要经过位填充和不归零NRZI编码后方能进行传输。因此,FPGA接收到的、USB键盘所能接收的都是经过位填充和NRZI编码后的数据。

CY7C68013与PC机通信时也是遵循这样的数据格式。但是,CY7C68013与FPGA之间传输的数据格式遵循的却是USB HID类设备用途表中的定义,具体值可以参考USB HID usage table,此不赘述。因此,设计中需要将接收的来自键盘的编码后的数据解码成USB HID类设备用途表中定义的键值。

通过上述分析,通常的解码方案是按照USB数据包协议,逐步解码,即先反NRZI编码,在去除位填充,然后再提取出数据值,这种方案需要按照USB协议顺序解包,算法工作量比较大,但是具有通用性,对于按照USB协议传输的数据都可以按照这种方法来解码。

考虑到键盘传输的按键数有限 (通用键盘104键,精简键盘更少),设计中提出了一种整体处理的思想。即将FPGA接收到的编码后的数据直接作为单个按键的码值,再将每个码值所对应的USB HID类设备用途表中的键值进行转换,这样发送给CY7C68013芯片的就是芯片所能处理的有效数据。这个方案大大降低了编写代码的工作量,有效地提高了设计效率,能够满足键盘/鼠标的数据传输,不足之处在于不具备通用性,对于向U盘、打印机设备等传输的数据无法适用。

4.3 发送模块

发送模块的核心也是一有限状态机。主要任务将接收到的数据按照键盘和鼠标有区别地发送至CY7C68013芯片,供其处理。为此,在FPGA串并转换接口模块部分设定一标志寄存器以区分接收到是键盘数据还是鼠标数据。发送模块在检测到有待发送的数据后,通过判断标志寄存器的值来决定要发送的数据是键盘数据还鼠标数据。状态转移图如图3所示。

图3 发送模块状态转移

5 实验结论

按照上述设计方案设计的光传输一体化键盘/鼠标在完成硬件电路的调试、固件程序和FPGA程序的下载后,插入主机,查看设备管理器,会看到多了一个USB人体学输入设备,一个HID键盘设备,一个USB兼容鼠标。移动鼠标,打开记事本等应用程序,鼠标和键盘均能正常工作。组合和特殊功能按键正常,键盘和鼠标也能配合使用。采用QA+Win32测试软件测试结果如图4所示,鼠标测试结果如图5所示。

对比普通键盘和鼠标,在同时插入键盘和鼠标后,查看设备管理器,会看到多了两个人体学输入设备,一个HID键盘设备,一个USB兼容鼠标。显然,本设计能够更节省系统资源。

同时,可以看到,采用光传输之后的键盘/鼠标,传输距离较之普通USB设备传输距离得到大幅度的提升。光传输良好的抗电磁干扰特性也是其一大亮点。有这两点优势,USB的光纤传输技术能够在军用领域,特别是抗恶劣环境领域得到很好的应用。

6 结束语

本论文基于对USB传输在当前军用领域的应用瓶颈进行研究,提出了采用光纤传输替代电缆传输的设计方案。同时,针对键盘和鼠标的共性进行研究,提出了一种键盘/鼠标一体化的设计思路,能够在保证系统性能的前提下,节省系统资源。目前,该系统已经在多个嵌入式系统中得到了应用,运行良好,具有非常好的安全性、可靠性、可移植性。

[1]MENG Xiang-lu.Study and design of the remote USB optical fiber transmission system [M].Shanghai:Master thesis of Shanghai Jiaotong University,2005 (in Chinese). [孟翔鹭.远程USB光纤传输系统的研究与设计 [D].上海:上海交通大学硕士学位论文,2005.]

[2]USB Implementer’s Forum.USB HID Usage Table Rev1.12[S].http://www.usb.org,2005.

[3]HID class device interface guide [S].2006-10-03.

[4]Universal Serial bus specification [S](Revision 3.0),2008.

[5]LIU Rong.Quan-quan teaches you what is USB [M].Beijing:Beijing Aerospace University Press,2009:1-160 (in Chinese).[刘荣.圈圈教你玩USB[M].北京:北京航空航天大学出版社,2009:1-160.]

[6]LI Zhong.Study and design of the remote USB WDM system[D].Shanghai:Master thesis of Shanghai Jiaotong University,2005(in Chinese).[李忠.远程USB波分复用光纤通信系统研究与设计 [D].上海:上海交通大学硕士学位论文,2005.]

[7] MENG Xiang-lu.Analysis of the remote USB optical fiber transmission system [M].Guangxi:Optical Fiber Transmission Technology,2005(in Chinese).[孟翔鹭.远程USB光纤传输系统远端设备工作性能分析 [M].广西:光通信技术,2005.]

[8]XU Chun-qing.The development and study of USB based on embedded system [D].Wuxi:Master thesis of Jiangnan University,2008(in Chinese). [徐春青.基于嵌入式系统的USB开发与研究 [D].无锡:江南大学硕士学位论文,2008.]

[9]SHI Guangfan,YAN Guangming,LI Jigang,et al.The design and implement of virtual instrument based on computing technique and USB platform [J].IEEE,2005,17 (18):101-148

[10]SHAN Fangfang.Design of special module control program based on USB [D].Master thesis of Xi’an Electronic Science and Technology University,2009 (in Chinese). [单芳芳.基于USB的专用模块控制程序设计 [D].西安:西安电子科技大学硕士论文,2009.]

猜你喜欢

描述符字节按键
No.8 字节跳动将推出独立出口电商APP
基于有限状态机的按键检测程序设计
基于AKAZE的BOLD掩码描述符的匹配算法的研究
欧洲共同语言参考标准在中国高校学术英语写作教学适用性的研究:可理解性,可行性和有用性
No.10 “字节跳动手机”要来了?
基于深度学习的局部描述符
轻量级分组密码Midori64的积分攻击
按键消抖在单片机和FPGA实验教学中的应用
一种基于PCIE总线的改进分散集聚DMA的设计
一种多方向导光按键结构设计