戴 捷,胡曉吉
(中國電子科技集團(tuán)公司 第十五研究所,北京100083)
光纖通信系統(tǒng)具有可靠性高和帶寬寬的特點(diǎn),因此在遠(yuǎn)程通信中得到了廣泛應(yīng)用。但是,由于通常計(jì)算機(jī)都不具有支持光纖的接口,因此,開發(fā)基于光纖傳輸?shù)耐ㄓ媒涌谠O(shè)備是很有必要的。此外,光纖能夠有效抵抗電磁干擾,這就使得光傳輸在軍用領(lǐng)域尤為得到青睞。USB接口已經(jīng)是目前應(yīng)用得最為廣泛的外設(shè)接口。基于USB接口的設(shè)備隨處可見,作為計(jì)算機(jī)必備的輸入設(shè)備,USB鍵盤和鼠標(biāo)通常是作為相互獨(dú)立的設(shè)備連接到計(jì)算機(jī)上的。本文提出了一種單芯片的解決方案,即通過一塊芯片同時(shí)實(shí)現(xiàn)USB鍵盤和鼠標(biāo)的功能,可以稱之為帶鼠標(biāo)功能的鍵盤。為了便于擴(kuò)展,設(shè)計(jì)中沒有專門設(shè)計(jì)鍵盤和鼠標(biāo)的按鍵電路,而是采用通用的USB鍵盤和鼠標(biāo),通過設(shè)計(jì)一控制電路,來達(dá)到能夠同時(shí)操作鼠標(biāo)和鍵盤的目的。這樣,從主機(jī)的角度來看,只檢測到一個(gè)人體學(xué)輸入設(shè)備;但是,從用戶端看,鼠標(biāo)和鍵盤能夠同時(shí)使用。
系統(tǒng)的總體設(shè)計(jì)框圖如圖1所示。
通用USB鍵盤和鼠標(biāo)同時(shí)插入設(shè)備端的USB接口,鍵盤和鼠標(biāo)通過各自的USB總線通道經(jīng)差分轉(zhuǎn)單端電路轉(zhuǎn)換后,由光發(fā)送器發(fā)送至主機(jī)端;主機(jī)端接收到鍵盤或是鼠標(biāo)的數(shù)據(jù)后,經(jīng)由FPGA解碼,將數(shù)據(jù)按照USB HID用途表中定義的格式發(fā)送至USB控制芯片CY7C68013,USB控制芯片對數(shù)據(jù)進(jìn)行必要的整合,使之滿足USB協(xié)議的格式,發(fā)往PC機(jī)。
通過對USB控制芯片進(jìn)行編程,使得PC機(jī)能夠識(shí)別該系統(tǒng)為人體學(xué)輸入設(shè)備,并掛至Windows通用HID驅(qū)動(dòng)下。

圖1 USB光纖鍵盤/鼠標(biāo)總體設(shè)計(jì)框架
USB接口部分的電路是聯(lián)系USB主機(jī)與USB設(shè)備之間的橋梁。當(dāng)有USB設(shè)備插入主機(jī)時(shí),主機(jī)能夠識(shí)別到設(shè)備的插入并且知道插入的是何種類型的設(shè)備 (低速/全速/高速),同時(shí)主機(jī)還要完成對設(shè)備的枚舉。
在USB主機(jī)或者USB集線器的下游端口的D+和D-上,分別接一個(gè)15KΩ的下拉電阻到地。這樣,沒有設(shè)備插入時(shí),輸入端就被這兩個(gè)下拉電阻拉到了低電平。而在USB設(shè)備端,在D+或D-上接了一個(gè)1.5KΩ的上拉電阻。上拉電阻接在D+或D-上,由設(shè)備的速度決定。對于全速和高速設(shè)備,上拉電阻接在D+上;對于低速設(shè)備,上拉電阻接在D-上。
當(dāng)設(shè)備插入到主機(jī)或集線器時(shí),接了上拉電阻的那條數(shù)據(jù)線的電壓或被拉高,集線器檢測到這個(gè)高電平就報(bào)告給USB主控制器,這樣就檢測到設(shè)備的插入了,并根據(jù)檢測到被拉高的數(shù)據(jù)線是D+還是D-來判斷插入的是什么速度類型的設(shè)備。
上述過程完成后,USB主機(jī)緊接著就要完成的是對設(shè)備的枚舉。枚舉就是從設(shè)備讀取各種描述符信息,主機(jī)根據(jù)這些信息來加載合適的驅(qū)動(dòng)程序,從而知道設(shè)備是什么樣的設(shè)備 (是存儲(chǔ)類還是打印機(jī)類又或者是人機(jī)接口類),如何進(jìn)行通信等。本設(shè)計(jì)中需要完成的是一個(gè)光傳輸?shù)逆I盤/鼠標(biāo),考慮到 Windows操作系統(tǒng)自帶的人機(jī)接口類HID驅(qū)動(dòng)程序,因此,枚舉的主要工作就是將此USB鍵盤/鼠標(biāo)配置成HID類設(shè)備,并且將其掛接到Windows通用HID驅(qū)動(dòng)下。
USB設(shè)備的枚舉可以通過專用芯片實(shí)現(xiàn)或是通過MCU(單片機(jī)或FPGA)編程來模擬。當(dāng)使用MCU來模擬枚舉過程時(shí),還需要一通用的接口芯片如PDIUSBD12來連接USB差分?jǐn)?shù)據(jù)線接口和MCU接口,在MCU中實(shí)現(xiàn)USB協(xié)議。這種方式工作量比較大,需要對USB的協(xié)議有比較深入的理解。
Cypress公司推出的EZ-USB FX2芯片CY7C68013實(shí)現(xiàn)了物理協(xié)議芯片和單片機(jī)的集成。其內(nèi)部包含了USB2.0微處理器、USB2.0收發(fā)器、SIE(串行接口引擎)、增強(qiáng)的8051內(nèi)核和可編程的外圍接口。按照硬件電路連接要求完成相應(yīng)的連接后,對內(nèi)部51單片機(jī)進(jìn)行編程也即所謂的固件編程,就可以實(shí)現(xiàn)所需的功能。Cypress提供了固件編程框架,簡化了編程的工作量,只需在框架的基礎(chǔ)上修改或添加代碼就能夠完成固件的編程。本設(shè)計(jì)中,正是采用了專用芯片的解決方案。
光纖接口設(shè)計(jì)主要包括接收模塊和發(fā)送模塊兩部分,它們總是成對的出現(xiàn)。本系統(tǒng)中需要三組收發(fā)模塊。一組用來接收鼠標(biāo)發(fā)送的信息。兩外兩組分別用來接收來自鍵盤的按鍵信息,同時(shí)向鍵盤傳輸來自PC機(jī)的控制信息:數(shù)字鍵盤鎖定燈和大寫字母鎖定燈的控制信息。
此外,設(shè)計(jì)中還用到兩組單端/差分轉(zhuǎn)換電路,用來將USB差分信號轉(zhuǎn)成單端信號,或是將單端信號轉(zhuǎn)成USB差分信號對。
FPGA部分的設(shè)計(jì)注意對輸入輸出信號進(jìn)行濾波,對于PLL和內(nèi)核供電電壓進(jìn)行掉電和過壓保護(hù)設(shè)計(jì)。
Cypress固件程序的設(shè)計(jì)是此次設(shè)計(jì)的核心。Cypress提供了固件編程框架,該框架已將USB標(biāo)準(zhǔn)請求和USB電源管理封裝,并且提供了鉤子函數(shù),只需根據(jù)需要在鉤子函數(shù)中編寫代碼即可完成編程。
建立框架所需的文件包括:Reg80320.h、Ezusb.h、FX2regs.h、Fw.c、Periph.c、Dscr.a51、Ezusb.lib和 USBJmpTb.OBJ等。其中,Ezusb.h是庫函數(shù)申明,以及變量、宏定義、數(shù)據(jù)類型定義;Reg80320.h是8051頭文件,由KEIL提供;FX2regs.h是FX2寄存器頭文件;Fw.c是固件框架源文件;Ezusb.lib是 EZUSB庫文件;USBJmpTb.OBJ是中斷跳轉(zhuǎn)函數(shù)目標(biāo)文件。這些文件Cypress均已提供,直接應(yīng)用即可。Periph.c是用戶鉤子函數(shù),用戶可以修改,在不同的應(yīng)用中文件名可以不一樣。Dscr.a51是USB描述符列表,用戶也可以修改。在實(shí)際的編程中,需要根據(jù)目標(biāo)需求對Periph.c和Dscr.a51兩個(gè)文件進(jìn)行修改。
USB枚舉的過程也是主機(jī)要求設(shè)備返回各種描述符的過程。端點(diǎn)0默認(rèn)配置為控制管道,用來完成所規(guī)定的設(shè)備請求。設(shè)計(jì)中需要對Dscr.a51進(jìn)行必要的修改。
(1)設(shè)備描述符 (DeviceDscr)用來唯一地標(biāo)識(shí)設(shè)備,設(shè)備驅(qū)動(dòng)程序加載是通過該描述符中的VID和PID來確定;
(2)接口描述符 (Interface Descriptor)主要用來定義接口包含的端口數(shù)及接口所使用的類;
(3)HID描述符 (HIDDscr)是HID設(shè)備配置所必需的描述符,應(yīng)該跟在接口描述符的后面;
(4)端點(diǎn)描述符 (Endpoint Descriptor)是比較重要的描述符,主要用來定義接口所包含的端點(diǎn)數(shù)目以及端點(diǎn)的屬性、所支持的最大包的長度和端點(diǎn)的查詢時(shí)間;
(5)字符串描述符 (StringDscr)是可選的,方便開發(fā)中的產(chǎn)品標(biāo)識(shí);
(6)HID報(bào)告描述符 (HIDReportDscr)是很重要的一種描述符,也是在實(shí)際開發(fā)中可以根據(jù)需要靈活修改的一種描述符。USB HID設(shè)備正是通過報(bào)告 (report)來傳送數(shù)據(jù)的,包括輸入報(bào)告和輸出報(bào)告。輸入報(bào)告是USB設(shè)備發(fā)送給主機(jī)的,本設(shè)計(jì)中主要指鍵盤和鼠標(biāo)的按鍵信息;輸出報(bào)告是主機(jī)發(fā)送給USB設(shè)備的,在設(shè)計(jì)中,由于使用了FPGA模擬USB設(shè)備,所以可以不需要輸出報(bào)告。
報(bào)告里面實(shí)際包含的是要傳送的數(shù)據(jù),數(shù)量為整數(shù)個(gè)字節(jié),被劃分為一個(gè)個(gè)域。通常,輸入報(bào)告是通過中斷輸入端點(diǎn)返回的,輸出報(bào)告則不然。輸出報(bào)告的發(fā)送有兩種:當(dāng)沒有中斷輸出端點(diǎn)時(shí),可以通過控制輸出端點(diǎn)0發(fā)送;當(dāng)有中斷輸出端點(diǎn)時(shí),通過中斷輸出端點(diǎn)發(fā)出。不管設(shè)備是否具有中斷輸出端點(diǎn) (中斷輸入端點(diǎn)是必須的),主機(jī)都可以通過獲取報(bào)告和設(shè)置報(bào)告的請求從端點(diǎn)0來獲取或發(fā)送報(bào)告。
本設(shè)計(jì)中提出了一種單芯片的USB鍵盤/鼠標(biāo)解決方案。系統(tǒng)中只用到了一個(gè)輸入端點(diǎn)和一個(gè)輸出端點(diǎn)即可同時(shí)實(shí)現(xiàn)鍵盤和鼠標(biāo)功能。
要實(shí)現(xiàn)上述功能,HID報(bào)告描述符的設(shè)計(jì)是關(guān)鍵。在報(bào)告描述符中要同時(shí)能夠?qū)崿F(xiàn)鍵盤報(bào)告和鼠標(biāo)報(bào)告。
一個(gè)報(bào)告描述符中可以有多個(gè)外層應(yīng)用集合,而系統(tǒng)軟件就是通過分析外層應(yīng)用集合的功能來增加不同的設(shè)備驅(qū)動(dòng)的。在本設(shè)計(jì)中只需要實(shí)現(xiàn)用途分別為鍵盤和鼠標(biāo)的兩個(gè)應(yīng)用集合即可。同時(shí),每個(gè)應(yīng)用集合里還要增加一個(gè)報(bào)告ID。以區(qū)分返回?cái)?shù)據(jù)的作用。報(bào)告ID是報(bào)告輸入或者輸出時(shí)的第一個(gè)字節(jié),當(dāng)沒有定義報(bào)告ID時(shí),報(bào)告前面就沒有報(bào)告ID。對于返回的沒有報(bào)告ID的報(bào)告,人體學(xué)輸入設(shè)備驅(qū)動(dòng)會(huì)自動(dòng)增加一個(gè)報(bào)告ID0;而應(yīng)用程序在發(fā)送數(shù)據(jù)出去時(shí),也要帶一個(gè)值為0的報(bào)告ID。人體學(xué)輸入設(shè)備驅(qū)動(dòng)會(huì)自動(dòng)去掉這個(gè)值為0的報(bào)告ID,只發(fā)送數(shù)據(jù)出去。因此,本設(shè)計(jì)中,分別在兩個(gè)開集合的條目后增加一個(gè)報(bào)告ID的條目,報(bào)告ID分別為1和2(報(bào)告ID0是保留的,不能使用)。
如下所示是設(shè)計(jì)中采用的報(bào)告描述符:
HIDReportDscr:
//鍵盤報(bào)告描述符
db 05h,01h ; Usage Page(Generic Desktop)
db 09h,06h ; Usage(Keyboard)
db 0A1h,01h; Collection(Application)
db 85h,01h; 鍵盤報(bào)告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
//鼠標(biāo)報(bào)告描述符
db 05h,01h ; Usage Page(Generic Desktop),
db 09h,02h ; Usage(Mouse),
db 0A1h,01h ; Collection(Application),
db 85h,02h ; 鼠標(biāo)報(bào)告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:
上述設(shè)計(jì)中,鍵盤輸入報(bào)告有6個(gè)字節(jié),分別存入CY7C68013的EP1INBUF [0]-EP1INBUF [5]中,第一個(gè)字節(jié)為報(bào)告ID,值為1;第二個(gè)字節(jié)表示特殊按鍵,如ctrl、shift、alt等;第三個(gè)字節(jié)保留;后面的3個(gè)字節(jié)為普通按鍵。如果同時(shí)有多個(gè)鍵按下,則在相應(yīng)的字節(jié)顯示鍵值,無鍵按下時(shí),則為0。具體的鍵位值可以查看HID用圖表 (USB HID usage table)。
鍵盤的輸出報(bào)告2個(gè)字節(jié),存入EP1OUTBUF[0]和EP1OUTBUF[1]中,第一個(gè)字節(jié)是報(bào)告ID,第二個(gè)字節(jié)用來標(biāo)識(shí)鍵盤的工作狀態(tài)如Num Lock等狀態(tài)信息,實(shí)際系統(tǒng)設(shè)計(jì)中可以不用。設(shè)計(jì)中,在FPGA內(nèi)部直接模擬這些特殊的按鍵狀態(tài),即,當(dāng)Caps Lock或Num Lock鍵按下時(shí),不需要等待主機(jī)發(fā)送輸出報(bào)告,F(xiàn)PGA程序內(nèi)部直接按照USB數(shù)據(jù)格式發(fā)送輸出數(shù)據(jù)至差分?jǐn)?shù)據(jù)線D+、D-上。
對于鼠標(biāo),只有輸入報(bào)告,沒有輸出報(bào)告。其輸入報(bào)告有5個(gè)字節(jié),分別存入CY7C68013的EP1INBUF[0]-EP1INBUF[4]中,第一個(gè)字節(jié)為報(bào)告ID,值為2;第二個(gè)字節(jié)表示按鍵;第三個(gè)字節(jié)表示x軸偏移 (正值表示右移,負(fù)值表示左移,0表示不動(dòng));第四個(gè)字節(jié)表示y軸偏移 (正值表示下移,負(fù)值表示上移,0表示不動(dòng));第五個(gè)字節(jié)表示鼠標(biāo)滾輪 (正值為往上滾動(dòng),負(fù)值為往下滾動(dòng))。
完成描述符部分的設(shè)計(jì)后,即可在鉤子函數(shù)TD_Init()和TD_Poll()中編寫需要實(shí)現(xiàn)的功能函數(shù)。
TD_Init()在FX2重枚舉后首先調(diào)用,用戶可以在該函數(shù)中完成全局變量和FX2寄存器的初始化操作。
TD_Poll()函數(shù)在main函數(shù)while程序模塊中被調(diào)用,除非被更高級別的中斷所打斷,該函數(shù)將被重復(fù)調(diào)用,根據(jù)需要在此添加所需的功能。
設(shè)計(jì)中的部分功能代碼如下:
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; //獲取鼠標(biāo)按鍵信息,PE.3-PE.0
if((key_oldbuttons-key_buttons)?。?)
{
if(fun?。?x80) //無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)?。?)
{
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個(gè)單位,值可修改
}
if(mouse_oldbuttons&0x08)
{
EP1INBUF [2]=10; //x軸右移10個(gè)單位,值可修改
}
if(mouse_oldbuttons&0x10)
{
EP1INBUF [3]=-10; //y軸上移10個(gè)單位,可修改
}
if(mouse_oldbuttons&0x20)
{
EP1INBUF [3]=10; //y軸下移10個(gè)單位,可修改
}
//未定義滾輪
mouse_oldbuttons= mouse_buttons;
}
}
可以看出功能函數(shù)部分的代碼比較簡單,這是因?yàn)镻D.0-PD.7管腳的信息是已經(jīng)經(jīng)過FPGA解碼后的按鍵值,在TD_Poll()函數(shù)中,只需讀取管腳值即可。實(shí)際上,F(xiàn)PGA的編解碼工作也可以由FX2處理器來完成。但是,考慮的8051的處理速度以及系統(tǒng)的可擴(kuò)展性 (管腳數(shù)目和邏輯單元),我們將這一部分的工作都由FPGA來完成。這樣,F(xiàn)PGA的工作就是用來模擬USB鍵盤,所以,除了需要在有按鍵按下的時(shí)候進(jìn)行解碼并向FX2處理器進(jìn)行輸出外,對于某些特殊按鍵時(shí)的主機(jī)應(yīng)答也由FPGA來模擬實(shí)現(xiàn),這就進(jìn)一步簡化了Cypress固件程序的設(shè)計(jì)。Cypress固件部分只需讀取按下的鍵值,無需輸出任何信息。當(dāng)有特殊按鍵按下時(shí),F(xiàn)PGA內(nèi)部的程序模擬主機(jī)的應(yīng)答信號,并對它進(jìn)行編碼,使之符合在USB差分?jǐn)?shù)據(jù)線上傳輸?shù)臄?shù)據(jù)格式。
FPGA內(nèi)部的模塊結(jié)構(gòu)如圖2所示。
USB鍵盤/鼠標(biāo)輸出的差分?jǐn)?shù)據(jù)經(jīng)差分轉(zhuǎn)單端電路轉(zhuǎn)換,作為FPGA的輸入信號Keyboard-Rx和Mouse-Rx。鼠標(biāo)和鍵盤的串并轉(zhuǎn)換模塊由兩個(gè)彼此獨(dú)立的狀態(tài)機(jī)構(gòu)成。
對于鍵盤,F(xiàn)PGA檢測到輸入信號后,進(jìn)行解碼操作,判斷是普通鍵還是特殊鍵 (Caps Lock、Num Lock等),是單個(gè)鍵還是組合鍵 (Shift、Alt和 Windows與其他按鍵的組合)。如果是普通鍵或者是組合按鍵,則經(jīng)發(fā)送模塊處理后,輸出至FX2處理器;如果是特殊按鍵,則直接轉(zhuǎn)到編碼模塊,模擬USB主機(jī)的應(yīng)答數(shù)據(jù),編碼成USB總線上的數(shù)據(jù)格式,經(jīng)并串轉(zhuǎn)換后輸出給鍵盤。
對于鼠標(biāo),相對簡單一些。解碼模塊只需判斷是否有按鍵按下 (左鍵/右鍵)、X軸方向和Y軸方向的偏移以及滾輪的改變量,同時(shí)無需輸出任何信息給鼠標(biāo)。

圖2 FPGA內(nèi)部模塊結(jié)構(gòu)
USB協(xié)議中定義了3種數(shù)據(jù)模式:1.5Mb/s的低速模式、12Mb/s的全速模式和480Mb/s的高速模式。HID設(shè)備類屬于低速設(shè)備。設(shè)計(jì)中需要注意速度的匹配問題。在本設(shè)計(jì)中,有兩處數(shù)據(jù)的傳輸遵循的是USB總線協(xié)議,一是CY7C68013與上位機(jī)的接口部分,二是通用USB鍵盤/鼠標(biāo)與FPGA接口部分。如果要實(shí)現(xiàn)USB協(xié)議,設(shè)計(jì)的難度比較大。所幸的是CY7C68013在其內(nèi)部已經(jīng)實(shí)現(xiàn)了USB總線協(xié)議;我們的主要工作就集中在對鍵盤/鼠標(biāo)傳輸?shù)臄?shù)據(jù)進(jìn)行編解碼。
時(shí)鐘分頻電路的設(shè)計(jì)是為了滿足對USB總線上的數(shù)據(jù)進(jìn)行采樣的需要。USB總線上傳輸數(shù)據(jù)是以包為基本單位的。USB總線上數(shù)據(jù)的傳輸速率可以通過對總線上傳輸?shù)陌母袷竭M(jìn)行分析來確定,但是需要對協(xié)議進(jìn)行深入地分析。我們還可以通過示波器來測得。經(jīng)試驗(yàn)測量,總線上的數(shù)據(jù)傳輸速率為15Kb/s,因此,設(shè)計(jì)中采用30k的時(shí)鐘來對輸入數(shù)據(jù)進(jìn)行采樣。
串并轉(zhuǎn)換模塊的核心是一有限狀態(tài)機(jī)FSM。當(dāng)USB總線上沒有數(shù)據(jù)傳輸時(shí),總線一直呈高電平,檢測到一個(gè)高電平到低電平的數(shù)據(jù)變化時(shí),表示有數(shù)據(jù)傳輸?shù)陌l(fā)生。對于傳輸?shù)臄?shù)據(jù)是干擾還是有效數(shù)據(jù),需要對接下來各個(gè)狀態(tài)下所采樣到的數(shù)據(jù)進(jìn)行分析,當(dāng)其滿足USB數(shù)據(jù)包的格式,則認(rèn)為是有效的USB數(shù)據(jù)。
編碼解碼模塊的設(shè)計(jì)遵循的都是USB總線協(xié)議。編碼是解碼的逆過程。故而,本文僅對解碼模塊進(jìn)行詳細(xì)分析。
USB總線上傳輸數(shù)據(jù)的基本單位是包。一個(gè)包被分成不同的域。USB協(xié)議中主要規(guī)定了4種包:令牌包、數(shù)據(jù)包、握手包和特殊包。這4種包,所包含的域是不一樣的。其中,令牌包、握手包主要用在重枚舉過程中;特殊包在一些特殊的場合中使用,如:PING (測試)、ERR (錯(cuò)誤)等。在本系統(tǒng)中,采用了Cypress芯片來模擬USB設(shè)備,芯片本身集成了對各種包的處理功能,所以在與PC接口端的連接無需考慮各種包的處理過程;在設(shè)備端,F(xiàn)PGA負(fù)責(zé)對通用USB鍵盤/鼠標(biāo)發(fā)送過來的數(shù)據(jù)進(jìn)行處理,而忽略重枚舉和差錯(cuò)檢測等過程,所以,只需要關(guān)注對數(shù)據(jù)包的處理。
數(shù)據(jù)包和所有包一樣,都是以同步域SYNC開始,緊跟著一個(gè)包標(biāo)識(shí)符PID,最終以包結(jié)束符EOP結(jié)束。數(shù)據(jù)包格式見表1。

表1 USB數(shù)據(jù)包格式
要進(jìn)行編解碼操作,就需要對數(shù)據(jù)包進(jìn)行深入地分析。下述分析都是針對差分轉(zhuǎn)單端后的信號而言。
對于全速和低速設(shè)備,同步域使用的是00000001,后面緊跟著PID標(biāo)識(shí),DATA表示要傳輸?shù)臄?shù)據(jù),全速USB的最大長度為1023Bytes,CRC16表示DATA的校驗(yàn)和,全速/低速設(shè)備的EOP是一個(gè)大約2個(gè)數(shù)據(jù)位寬的單端0信號。
如上所述,這就是單端串行數(shù)據(jù)線上要發(fā)送的原始數(shù)據(jù)。并非數(shù)據(jù)線上所傳輸?shù)恼嬲龜?shù)據(jù),原始數(shù)據(jù)還需要經(jīng)過位填充和不歸零NRZI編碼后方能進(jìn)行傳輸。因此,F(xiàn)PGA接收到的、USB鍵盤所能接收的都是經(jīng)過位填充和NRZI編碼后的數(shù)據(jù)。
CY7C68013與PC機(jī)通信時(shí)也是遵循這樣的數(shù)據(jù)格式。但是,CY7C68013與FPGA之間傳輸?shù)臄?shù)據(jù)格式遵循的卻是USB HID類設(shè)備用途表中的定義,具體值可以參考USB HID usage table,此不贅述。因此,設(shè)計(jì)中需要將接收的來自鍵盤的編碼后的數(shù)據(jù)解碼成USB HID類設(shè)備用途表中定義的鍵值。
通過上述分析,通常的解碼方案是按照USB數(shù)據(jù)包協(xié)議,逐步解碼,即先反NRZI編碼,在去除位填充,然后再提取出數(shù)據(jù)值,這種方案需要按照USB協(xié)議順序解包,算法工作量比較大,但是具有通用性,對于按照USB協(xié)議傳輸?shù)臄?shù)據(jù)都可以按照這種方法來解碼。
考慮到鍵盤傳輸?shù)陌存I數(shù)有限 (通用鍵盤104鍵,精簡鍵盤更少),設(shè)計(jì)中提出了一種整體處理的思想。即將FPGA接收到的編碼后的數(shù)據(jù)直接作為單個(gè)按鍵的碼值,再將每個(gè)碼值所對應(yīng)的USB HID類設(shè)備用途表中的鍵值進(jìn)行轉(zhuǎn)換,這樣發(fā)送給CY7C68013芯片的就是芯片所能處理的有效數(shù)據(jù)。這個(gè)方案大大降低了編寫代碼的工作量,有效地提高了設(shè)計(jì)效率,能夠滿足鍵盤/鼠標(biāo)的數(shù)據(jù)傳輸,不足之處在于不具備通用性,對于向U盤、打印機(jī)設(shè)備等傳輸?shù)臄?shù)據(jù)無法適用。
發(fā)送模塊的核心也是一有限狀態(tài)機(jī)。主要任務(wù)將接收到的數(shù)據(jù)按照鍵盤和鼠標(biāo)有區(qū)別地發(fā)送至CY7C68013芯片,供其處理。為此,在FPGA串并轉(zhuǎn)換接口模塊部分設(shè)定一標(biāo)志寄存器以區(qū)分接收到是鍵盤數(shù)據(jù)還是鼠標(biāo)數(shù)據(jù)。發(fā)送模塊在檢測到有待發(fā)送的數(shù)據(jù)后,通過判斷標(biāo)志寄存器的值來決定要發(fā)送的數(shù)據(jù)是鍵盤數(shù)據(jù)還鼠標(biāo)數(shù)據(jù)。狀態(tài)轉(zhuǎn)移圖如圖3所示。

圖3 發(fā)送模塊狀態(tài)轉(zhuǎn)移
按照上述設(shè)計(jì)方案設(shè)計(jì)的光傳輸一體化鍵盤/鼠標(biāo)在完成硬件電路的調(diào)試、固件程序和FPGA程序的下載后,插入主機(jī),查看設(shè)備管理器,會(huì)看到多了一個(gè)USB人體學(xué)輸入設(shè)備,一個(gè)HID鍵盤設(shè)備,一個(gè)USB兼容鼠標(biāo)。移動(dòng)鼠標(biāo),打開記事本等應(yīng)用程序,鼠標(biāo)和鍵盤均能正常工作。組合和特殊功能按鍵正常,鍵盤和鼠標(biāo)也能配合使用。采用QA+Win32測試軟件測試結(jié)果如圖4所示,鼠標(biāo)測試結(jié)果如圖5所示。

對比普通鍵盤和鼠標(biāo),在同時(shí)插入鍵盤和鼠標(biāo)后,查看設(shè)備管理器,會(huì)看到多了兩個(gè)人體學(xué)輸入設(shè)備,一個(gè)HID鍵盤設(shè)備,一個(gè)USB兼容鼠標(biāo)。顯然,本設(shè)計(jì)能夠更節(jié)省系統(tǒng)資源。
同時(shí),可以看到,采用光傳輸之后的鍵盤/鼠標(biāo),傳輸距離較之普通USB設(shè)備傳輸距離得到大幅度的提升。光傳輸良好的抗電磁干擾特性也是其一大亮點(diǎn)。有這兩點(diǎn)優(yōu)勢,USB的光纖傳輸技術(shù)能夠在軍用領(lǐng)域,特別是抗惡劣環(huán)境領(lǐng)域得到很好的應(yīng)用。
本論文基于對USB傳輸在當(dāng)前軍用領(lǐng)域的應(yīng)用瓶頸進(jìn)行研究,提出了采用光纖傳輸替代電纜傳輸?shù)脑O(shè)計(jì)方案。同時(shí),針對鍵盤和鼠標(biāo)的共性進(jìn)行研究,提出了一種鍵盤/鼠標(biāo)一體化的設(shè)計(jì)思路,能夠在保證系統(tǒng)性能的前提下,節(jié)省系統(tǒng)資源。目前,該系統(tǒng)已經(jīng)在多個(gè)嵌入式系統(tǒng)中得到了應(yīng)用,運(yùn)行良好,具有非常好的安全性、可靠性、可移植性。
[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). [孟翔鷺.遠(yuǎn)程USB光纖傳輸系統(tǒng)的研究與設(shè)計(jì) [D].上海:上海交通大學(xué)碩士學(xué)位論文,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].北京:北京航空航天大學(xué)出版社,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).[李忠.遠(yuǎn)程USB波分復(fù)用光纖通信系統(tǒng)研究與設(shè)計(jì) [D].上海:上海交通大學(xué)碩士學(xué)位論文,2005.]
[7] MENG Xiang-lu.Analysis of the remote USB optical fiber transmission system [M].Guangxi:Optical Fiber Transmission Technology,2005(in Chinese).[孟翔鷺.遠(yuǎn)程USB光纖傳輸系統(tǒng)遠(yuǎn)端設(shè)備工作性能分析 [M].廣西:光通信技術(shù),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). [徐春青.基于嵌入式系統(tǒng)的USB開發(fā)與研究 [D].無錫:江南大學(xué)碩士學(xué)位論文,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的專用模塊控制程序設(shè)計(jì) [D].西安:西安電子科技大學(xué)碩士論文,2009.]