戴 捷,胡曉吉
(中國電子科技集團公司 第十五研究所,北京100083)
光纖通信系統(tǒng)具有可靠性高和帶寬寬的特點,因此在遠程通信中得到了廣泛應(yīng)用。但是,由于通常計算機都不具有支持光纖的接口,因此,開發(fā)基于光纖傳輸?shù)耐ㄓ媒涌谠O(shè)備是很有必要的。此外,光纖能夠有效抵抗電磁干擾,這就使得光傳輸在軍用領(lǐng)域尤為得到青睞。USB接口已經(jīng)是目前應(yīng)用得最為廣泛的外設(shè)接口。基于USB接口的設(shè)備隨處可見,作為計算機必備的輸入設(shè)備,USB鍵盤和鼠標通常是作為相互獨立的設(shè)備連接到計算機上的。本文提出了一種單芯片的解決方案,即通過一塊芯片同時實現(xiàn)USB鍵盤和鼠標的功能,可以稱之為帶鼠標功能的鍵盤。為了便于擴展,設(shè)計中沒有專門設(shè)計鍵盤和鼠標的按鍵電路,而是采用通用的USB鍵盤和鼠標,通過設(shè)計一控制電路,來達到能夠同時操作鼠標和鍵盤的目的。這樣,從主機的角度來看,只檢測到一個人體學輸入設(shè)備;但是,從用戶端看,鼠標和鍵盤能夠同時使用。
系統(tǒng)的總體設(shè)計框圖如圖1所示。
通用USB鍵盤和鼠標同時插入設(shè)備端的USB接口,鍵盤和鼠標通過各自的USB總線通道經(jīng)差分轉(zhuǎn)單端電路轉(zhuǎn)換后,由光發(fā)送器發(fā)送至主機端;主機端接收到鍵盤或是鼠標的數(shù)據(jù)后,經(jīng)由FPGA解碼,將數(shù)據(jù)按照USB HID用途表中定義的格式發(fā)送至USB控制芯片CY7C68013,USB控制芯片對數(shù)據(jù)進行必要的整合,使之滿足USB協(xié)議的格式,發(fā)往PC機。
通過對USB控制芯片進行編程,使得PC機能夠識別該系統(tǒng)為人體學輸入設(shè)備,并掛至Windows通用HID驅(qū)動下。
圖1 USB光纖鍵盤/鼠標總體設(shè)計框架
USB接口部分的電路是聯(lián)系USB主機與USB設(shè)備之間的橋梁。當有USB設(shè)備插入主機時,主機能夠識別到設(shè)備的插入并且知道插入的是何種類型的設(shè)備 (低速/全速/高速),同時主機還要完成對設(shè)備的枚舉。
在USB主機或者USB集線器的下游端口的D+和D-上,分別接一個15KΩ的下拉電阻到地。這樣,沒有設(shè)備插入時,輸入端就被這兩個下拉電阻拉到了低電平。而在USB設(shè)備端,在D+或D-上接了一個1.5KΩ的上拉電阻。上拉電阻接在D+或D-上,由設(shè)備的速度決定。對于全速和高速設(shè)備,上拉電阻接在D+上;對于低速設(shè)備,上拉電阻接在D-上。
當設(shè)備插入到主機或集線器時,接了上拉電阻的那條數(shù)據(jù)線的電壓或被拉高,集線器檢測到這個高電平就報告給USB主控制器,這樣就檢測到設(shè)備的插入了,并根據(jù)檢測到被拉高的數(shù)據(jù)線是D+還是D-來判斷插入的是什么速度類型的設(shè)備。
上述過程完成后,USB主機緊接著就要完成的是對設(shè)備的枚舉。枚舉就是從設(shè)備讀取各種描述符信息,主機根據(jù)這些信息來加載合適的驅(qū)動程序,從而知道設(shè)備是什么樣的設(shè)備 (是存儲類還是打印機類又或者是人機接口類),如何進行通信等。本設(shè)計中需要完成的是一個光傳輸?shù)逆I盤/鼠標,考慮到 Windows操作系統(tǒng)自帶的人機接口類HID驅(qū)動程序,因此,枚舉的主要工作就是將此USB鍵盤/鼠標配置成HID類設(shè)備,并且將其掛接到Windows通用HID驅(qū)動下。
USB設(shè)備的枚舉可以通過專用芯片實現(xiàn)或是通過MCU(單片機或FPGA)編程來模擬。當使用MCU來模擬枚舉過程時,還需要一通用的接口芯片如PDIUSBD12來連接USB差分數(shù)據(jù)線接口和MCU接口,在MCU中實現(xiàn)USB協(xié)議。這種方式工作量比較大,需要對USB的協(xié)議有比較深入的理解。
Cypress公司推出的EZ-USB FX2芯片CY7C68013實現(xiàn)了物理協(xié)議芯片和單片機的集成。其內(nèi)部包含了USB2.0微處理器、USB2.0收發(fā)器、SIE(串行接口引擎)、增強的8051內(nèi)核和可編程的外圍接口。按照硬件電路連接要求完成相應(yīng)的連接后,對內(nèi)部51單片機進行編程也即所謂的固件編程,就可以實現(xiàn)所需的功能。Cypress提供了固件編程框架,簡化了編程的工作量,只需在框架的基礎(chǔ)上修改或添加代碼就能夠完成固件的編程。本設(shè)計中,正是采用了專用芯片的解決方案。
光纖接口設(shè)計主要包括接收模塊和發(fā)送模塊兩部分,它們總是成對的出現(xiàn)。本系統(tǒng)中需要三組收發(fā)模塊。一組用來接收鼠標發(fā)送的信息。兩外兩組分別用來接收來自鍵盤的按鍵信息,同時向鍵盤傳輸來自PC機的控制信息:數(shù)字鍵盤鎖定燈和大寫字母鎖定燈的控制信息。
此外,設(shè)計中還用到兩組單端/差分轉(zhuǎn)換電路,用來將USB差分信號轉(zhuǎn)成單端信號,或是將單端信號轉(zhuǎn)成USB差分信號對。
FPGA部分的設(shè)計注意對輸入輸出信號進行濾波,對于PLL和內(nèi)核供電電壓進行掉電和過壓保護設(shè)計。
Cypress固件程序的設(shè)計是此次設(shè)計的核心。Cypress提供了固件編程框架,該框架已將USB標準請求和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ù)目標文件。這些文件Cypress均已提供,直接應(yīng)用即可。Periph.c是用戶鉤子函數(shù),用戶可以修改,在不同的應(yīng)用中文件名可以不一樣。Dscr.a51是USB描述符列表,用戶也可以修改。在實際的編程中,需要根據(jù)目標需求對Periph.c和Dscr.a51兩個文件進行修改。
USB枚舉的過程也是主機要求設(shè)備返回各種描述符的過程。端點0默認配置為控制管道,用來完成所規(guī)定的設(shè)備請求。設(shè)計中需要對Dscr.a51進行必要的修改。
(1)設(shè)備描述符 (DeviceDscr)用來唯一地標識設(shè)備,設(shè)備驅(qū)動程序加載是通過該描述符中的VID和PID來確定;
(2)接口描述符 (Interface Descriptor)主要用來定義接口包含的端口數(shù)及接口所使用的類;
(3)HID描述符 (HIDDscr)是HID設(shè)備配置所必需的描述符,應(yīng)該跟在接口描述符的后面;
(4)端點描述符 (Endpoint Descriptor)是比較重要的描述符,主要用來定義接口所包含的端點數(shù)目以及端點的屬性、所支持的最大包的長度和端點的查詢時間;
(5)字符串描述符 (StringDscr)是可選的,方便開發(fā)中的產(chǎn)品標識;
(6)HID報告描述符 (HIDReportDscr)是很重要的一種描述符,也是在實際開發(fā)中可以根據(jù)需要靈活修改的一種描述符。USB HID設(shè)備正是通過報告 (report)來傳送數(shù)據(jù)的,包括輸入報告和輸出報告。輸入報告是USB設(shè)備發(fā)送給主機的,本設(shè)計中主要指鍵盤和鼠標的按鍵信息;輸出報告是主機發(fā)送給USB設(shè)備的,在設(shè)計中,由于使用了FPGA模擬USB設(shè)備,所以可以不需要輸出報告。
報告里面實際包含的是要傳送的數(shù)據(jù),數(shù)量為整數(shù)個字節(jié),被劃分為一個個域。通常,輸入報告是通過中斷輸入端點返回的,輸出報告則不然。輸出報告的發(fā)送有兩種:當沒有中斷輸出端點時,可以通過控制輸出端點0發(fā)送;當有中斷輸出端點時,通過中斷輸出端點發(fā)出。不管設(shè)備是否具有中斷輸出端點 (中斷輸入端點是必須的),主機都可以通過獲取報告和設(shè)置報告的請求從端點0來獲取或發(fā)送報告。
本設(shè)計中提出了一種單芯片的USB鍵盤/鼠標解決方案。系統(tǒng)中只用到了一個輸入端點和一個輸出端點即可同時實現(xiàn)鍵盤和鼠標功能。
要實現(xiàn)上述功能,HID報告描述符的設(shè)計是關(guān)鍵。在報告描述符中要同時能夠?qū)崿F(xiàn)鍵盤報告和鼠標報告。
一個報告描述符中可以有多個外層應(yīng)用集合,而系統(tǒng)軟件就是通過分析外層應(yīng)用集合的功能來增加不同的設(shè)備驅(qū)動的。在本設(shè)計中只需要實現(xiàn)用途分別為鍵盤和鼠標的兩個應(yīng)用集合即可。同時,每個應(yīng)用集合里還要增加一個報告ID。以區(qū)分返回數(shù)據(jù)的作用。報告ID是報告輸入或者輸出時的第一個字節(jié),當沒有定義報告ID時,報告前面就沒有報告ID。對于返回的沒有報告ID的報告,人體學輸入設(shè)備驅(qū)動會自動增加一個報告ID0;而應(yīng)用程序在發(fā)送數(shù)據(jù)出去時,也要帶一個值為0的報告ID。人體學輸入設(shè)備驅(qū)動會自動去掉這個值為0的報告ID,只發(fā)送數(shù)據(jù)出去。因此,本設(shè)計中,分別在兩個開集合的條目后增加一個報告ID的條目,報告ID分別為1和2(報告ID0是保留的,不能使用)。
如下所示是設(shè)計中采用的報告描述符:
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:
上述設(shè)計中,鍵盤輸入報告有6個字節(jié),分別存入CY7C68013的EP1INBUF [0]-EP1INBUF [5]中,第一個字節(jié)為報告ID,值為1;第二個字節(jié)表示特殊按鍵,如ctrl、shift、alt等;第三個字節(jié)保留;后面的3個字節(jié)為普通按鍵。如果同時有多個鍵按下,則在相應(yīng)的字節(jié)顯示鍵值,無鍵按下時,則為0。具體的鍵位值可以查看HID用圖表 (USB HID usage table)。
鍵盤的輸出報告2個字節(jié),存入EP1OUTBUF[0]和EP1OUTBUF[1]中,第一個字節(jié)是報告ID,第二個字節(jié)用來標識鍵盤的工作狀態(tài)如Num Lock等狀態(tài)信息,實際系統(tǒng)設(shè)計中可以不用。設(shè)計中,在FPGA內(nèi)部直接模擬這些特殊的按鍵狀態(tài),即,當Caps Lock或Num Lock鍵按下時,不需要等待主機發(fā)送輸出報告,F(xiàn)PGA程序內(nèi)部直接按照USB數(shù)據(jù)格式發(fā)送輸出數(shù)據(jù)至差分數(shù)據(jù)線D+、D-上。
對于鼠標,只有輸入報告,沒有輸出報告。其輸入報告有5個字節(jié),分別存入CY7C68013的EP1INBUF[0]-EP1INBUF[4]中,第一個字節(jié)為報告ID,值為2;第二個字節(jié)表示按鍵;第三個字節(jié)表示x軸偏移 (正值表示右移,負值表示左移,0表示不動);第四個字節(jié)表示y軸偏移 (正值表示下移,負值表示上移,0表示不動);第五個字節(jié)表示鼠標滾輪 (正值為往上滾動,負值為往下滾動)。
完成描述符部分的設(shè)計后,即可在鉤子函數(shù)TD_Init()和TD_Poll()中編寫需要實現(xiàn)的功能函數(shù)。
TD_Init()在FX2重枚舉后首先調(diào)用,用戶可以在該函數(shù)中完成全局變量和FX2寄存器的初始化操作。
TD_Poll()函數(shù)在main函數(shù)while程序模塊中被調(diào)用,除非被更高級別的中斷所打斷,該函數(shù)將被重復調(diào)用,根據(jù)需要在此添加所需的功能。
設(shè)計中的部分功能代碼如下:
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)?。?)
{
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)?。?)
{
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;
}
}
可以看出功能函數(shù)部分的代碼比較簡單,這是因為PD.0-PD.7管腳的信息是已經(jīng)經(jīng)過FPGA解碼后的按鍵值,在TD_Poll()函數(shù)中,只需讀取管腳值即可。實際上,F(xiàn)PGA的編解碼工作也可以由FX2處理器來完成。但是,考慮的8051的處理速度以及系統(tǒng)的可擴展性 (管腳數(shù)目和邏輯單元),我們將這一部分的工作都由FPGA來完成。這樣,F(xiàn)PGA的工作就是用來模擬USB鍵盤,所以,除了需要在有按鍵按下的時候進行解碼并向FX2處理器進行輸出外,對于某些特殊按鍵時的主機應(yīng)答也由FPGA來模擬實現(xiàn),這就進一步簡化了Cypress固件程序的設(shè)計。Cypress固件部分只需讀取按下的鍵值,無需輸出任何信息。當有特殊按鍵按下時,F(xiàn)PGA內(nèi)部的程序模擬主機的應(yīng)答信號,并對它進行編碼,使之符合在USB差分數(shù)據(jù)線上傳輸?shù)臄?shù)據(jù)格式。
FPGA內(nèi)部的模塊結(jié)構(gòu)如圖2所示。
USB鍵盤/鼠標輸出的差分數(shù)據(jù)經(jīng)差分轉(zhuǎn)單端電路轉(zhuǎn)換,作為FPGA的輸入信號Keyboard-Rx和Mouse-Rx。鼠標和鍵盤的串并轉(zhuǎn)換模塊由兩個彼此獨立的狀態(tài)機構(gòu)成。
對于鍵盤,F(xiàn)PGA檢測到輸入信號后,進行解碼操作,判斷是普通鍵還是特殊鍵 (Caps Lock、Num Lock等),是單個鍵還是組合鍵 (Shift、Alt和 Windows與其他按鍵的組合)。如果是普通鍵或者是組合按鍵,則經(jīng)發(fā)送模塊處理后,輸出至FX2處理器;如果是特殊按鍵,則直接轉(zhuǎn)到編碼模塊,模擬USB主機的應(yīng)答數(shù)據(jù),編碼成USB總線上的數(shù)據(jù)格式,經(jīng)并串轉(zhuǎn)換后輸出給鍵盤。
對于鼠標,相對簡單一些。解碼模塊只需判斷是否有按鍵按下 (左鍵/右鍵)、X軸方向和Y軸方向的偏移以及滾輪的改變量,同時無需輸出任何信息給鼠標。
圖2 FPGA內(nèi)部模塊結(jié)構(gòu)
USB協(xié)議中定義了3種數(shù)據(jù)模式:1.5Mb/s的低速模式、12Mb/s的全速模式和480Mb/s的高速模式。HID設(shè)備類屬于低速設(shè)備。設(shè)計中需要注意速度的匹配問題。在本設(shè)計中,有兩處數(shù)據(jù)的傳輸遵循的是USB總線協(xié)議,一是CY7C68013與上位機的接口部分,二是通用USB鍵盤/鼠標與FPGA接口部分。如果要實現(xiàn)USB協(xié)議,設(shè)計的難度比較大。所幸的是CY7C68013在其內(nèi)部已經(jīng)實現(xiàn)了USB總線協(xié)議;我們的主要工作就集中在對鍵盤/鼠標傳輸?shù)臄?shù)據(jù)進行編解碼。
時鐘分頻電路的設(shè)計是為了滿足對USB總線上的數(shù)據(jù)進行采樣的需要。USB總線上傳輸數(shù)據(jù)是以包為基本單位的。USB總線上數(shù)據(jù)的傳輸速率可以通過對總線上傳輸?shù)陌母袷竭M行分析來確定,但是需要對協(xié)議進行深入地分析。我們還可以通過示波器來測得。經(jīng)試驗測量,總線上的數(shù)據(jù)傳輸速率為15Kb/s,因此,設(shè)計中采用30k的時鐘來對輸入數(shù)據(jù)進行采樣。
串并轉(zhuǎn)換模塊的核心是一有限狀態(tài)機FSM。當USB總線上沒有數(shù)據(jù)傳輸時,總線一直呈高電平,檢測到一個高電平到低電平的數(shù)據(jù)變化時,表示有數(shù)據(jù)傳輸?shù)陌l(fā)生。對于傳輸?shù)臄?shù)據(jù)是干擾還是有效數(shù)據(jù),需要對接下來各個狀態(tài)下所采樣到的數(shù)據(jù)進行分析,當其滿足USB數(shù)據(jù)包的格式,則認為是有效的USB數(shù)據(jù)。
編碼解碼模塊的設(shè)計遵循的都是USB總線協(xié)議。編碼是解碼的逆過程。故而,本文僅對解碼模塊進行詳細分析。
USB總線上傳輸數(shù)據(jù)的基本單位是包。一個包被分成不同的域。USB協(xié)議中主要規(guī)定了4種包:令牌包、數(shù)據(jù)包、握手包和特殊包。這4種包,所包含的域是不一樣的。其中,令牌包、握手包主要用在重枚舉過程中;特殊包在一些特殊的場合中使用,如:PING (測試)、ERR (錯誤)等。在本系統(tǒng)中,采用了Cypress芯片來模擬USB設(shè)備,芯片本身集成了對各種包的處理功能,所以在與PC接口端的連接無需考慮各種包的處理過程;在設(shè)備端,F(xiàn)PGA負責對通用USB鍵盤/鼠標發(fā)送過來的數(shù)據(jù)進行處理,而忽略重枚舉和差錯檢測等過程,所以,只需要關(guān)注對數(shù)據(jù)包的處理。
數(shù)據(jù)包和所有包一樣,都是以同步域SYNC開始,緊跟著一個包標識符PID,最終以包結(jié)束符EOP結(jié)束。數(shù)據(jù)包格式見表1。
表1 USB數(shù)據(jù)包格式
要進行編解碼操作,就需要對數(shù)據(jù)包進行深入地分析。下述分析都是針對差分轉(zhuǎn)單端后的信號而言。
對于全速和低速設(shè)備,同步域使用的是00000001,后面緊跟著PID標識,DATA表示要傳輸?shù)臄?shù)據(jù),全速USB的最大長度為1023Bytes,CRC16表示DATA的校驗和,全速/低速設(shè)備的EOP是一個大約2個數(shù)據(jù)位寬的單端0信號。
如上所述,這就是單端串行數(shù)據(jù)線上要發(fā)送的原始數(shù)據(jù)。并非數(shù)據(jù)線上所傳輸?shù)恼嬲龜?shù)據(jù),原始數(shù)據(jù)還需要經(jīng)過位填充和不歸零NRZI編碼后方能進行傳輸。因此,F(xiàn)PGA接收到的、USB鍵盤所能接收的都是經(jīng)過位填充和NRZI編碼后的數(shù)據(jù)。
CY7C68013與PC機通信時也是遵循這樣的數(shù)據(jù)格式。但是,CY7C68013與FPGA之間傳輸?shù)臄?shù)據(jù)格式遵循的卻是USB HID類設(shè)備用途表中的定義,具體值可以參考USB HID usage table,此不贅述。因此,設(shè)計中需要將接收的來自鍵盤的編碼后的數(shù)據(jù)解碼成USB HID類設(shè)備用途表中定義的鍵值。
通過上述分析,通常的解碼方案是按照USB數(shù)據(jù)包協(xié)議,逐步解碼,即先反NRZI編碼,在去除位填充,然后再提取出數(shù)據(jù)值,這種方案需要按照USB協(xié)議順序解包,算法工作量比較大,但是具有通用性,對于按照USB協(xié)議傳輸?shù)臄?shù)據(jù)都可以按照這種方法來解碼。
考慮到鍵盤傳輸?shù)陌存I數(shù)有限 (通用鍵盤104鍵,精簡鍵盤更少),設(shè)計中提出了一種整體處理的思想。即將FPGA接收到的編碼后的數(shù)據(jù)直接作為單個按鍵的碼值,再將每個碼值所對應(yīng)的USB HID類設(shè)備用途表中的鍵值進行轉(zhuǎn)換,這樣發(fā)送給CY7C68013芯片的就是芯片所能處理的有效數(shù)據(jù)。這個方案大大降低了編寫代碼的工作量,有效地提高了設(shè)計效率,能夠滿足鍵盤/鼠標的數(shù)據(jù)傳輸,不足之處在于不具備通用性,對于向U盤、打印機設(shè)備等傳輸?shù)臄?shù)據(jù)無法適用。
發(fā)送模塊的核心也是一有限狀態(tài)機。主要任務(wù)將接收到的數(shù)據(jù)按照鍵盤和鼠標有區(qū)別地發(fā)送至CY7C68013芯片,供其處理。為此,在FPGA串并轉(zhuǎn)換接口模塊部分設(shè)定一標志寄存器以區(qū)分接收到是鍵盤數(shù)據(jù)還是鼠標數(shù)據(jù)。發(fā)送模塊在檢測到有待發(fā)送的數(shù)據(jù)后,通過判斷標志寄存器的值來決定要發(fā)送的數(shù)據(jù)是鍵盤數(shù)據(jù)還鼠標數(shù)據(jù)。狀態(tài)轉(zhuǎn)移圖如圖3所示。
圖3 發(fā)送模塊狀態(tài)轉(zhuǎn)移
按照上述設(shè)計方案設(shè)計的光傳輸一體化鍵盤/鼠標在完成硬件電路的調(diào)試、固件程序和FPGA程序的下載后,插入主機,查看設(shè)備管理器,會看到多了一個USB人體學輸入設(shè)備,一個HID鍵盤設(shè)備,一個USB兼容鼠標。移動鼠標,打開記事本等應(yīng)用程序,鼠標和鍵盤均能正常工作。組合和特殊功能按鍵正常,鍵盤和鼠標也能配合使用。采用QA+Win32測試軟件測試結(jié)果如圖4所示,鼠標測試結(jié)果如圖5所示。
對比普通鍵盤和鼠標,在同時插入鍵盤和鼠標后,查看設(shè)備管理器,會看到多了兩個人體學輸入設(shè)備,一個HID鍵盤設(shè)備,一個USB兼容鼠標。顯然,本設(shè)計能夠更節(jié)省系統(tǒng)資源。
同時,可以看到,采用光傳輸之后的鍵盤/鼠標,傳輸距離較之普通USB設(shè)備傳輸距離得到大幅度的提升。光傳輸良好的抗電磁干擾特性也是其一大亮點。有這兩點優(yōu)勢,USB的光纖傳輸技術(shù)能夠在軍用領(lǐng)域,特別是抗惡劣環(huán)境領(lǐng)域得到很好的應(yīng)用。
本論文基于對USB傳輸在當前軍用領(lǐng)域的應(yīng)用瓶頸進行研究,提出了采用光纖傳輸替代電纜傳輸?shù)脑O(shè)計方案。同時,針對鍵盤和鼠標的共性進行研究,提出了一種鍵盤/鼠標一體化的設(shè)計思路,能夠在保證系統(tǒng)性能的前提下,節(jié)省系統(tǒng)資源。目前,該系統(tǒng)已經(jīng)在多個嵌入式系統(tǒng)中得到了應(yīng)用,運行良好,具有非常好的安全性、可靠性、可移植性。
[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光纖傳輸系統(tǒng)的研究與設(shè)計 [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波分復用光纖通信系統(tǒng)研究與設(shè)計 [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光纖傳輸系統(tǒng)遠端設(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].無錫:江南大學碩士學位論文,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è)計 [D].西安:西安電子科技大學碩士論文,2009.]