基于HID協(xié)議的USB人機(jī)交互設(shè)備的接口設(shè)計(jì)
USB協(xié)議定義了11種請(qǐng)求命令,通過(guò)這些請(qǐng)求來(lái)獲得設(shè)備的信息及對(duì)設(shè)備進(jìn)行設(shè)置。HID類(lèi)設(shè)備除了要支持這11種標(biāo)準(zhǔn)的請(qǐng)求外,還要實(shí)現(xiàn)以下6種特定請(qǐng)求:本文引用地址:http://butianyuan.cn/article/202511.htm
?、?Get_Report——主機(jī)用控制傳輸從設(shè)備接收數(shù)據(jù),所有HID類(lèi)設(shè)備都要支持這個(gè)請(qǐng)求;
?、?Set_Report——設(shè)備用控制傳輸接收主機(jī)的數(shù)據(jù),設(shè)備可以不支持此請(qǐng)求;
③ Get_Idle——主機(jī)讀取設(shè)備當(dāng)前的空閑速率,設(shè)備可以不支持此請(qǐng)求;
?、?Set_Idle——設(shè)置閑置狀態(tài),設(shè)備可不支持此請(qǐng)求;
?、?Get_Protocol——主機(jī)獲得設(shè)備的當(dāng)前活動(dòng)是引導(dǎo)協(xié)議還是報(bào)告協(xié)議;
?、?Set_Protocol——在引導(dǎo)協(xié)議和報(bào)告協(xié)議間切換,設(shè)備如果支持系統(tǒng)引導(dǎo)(如鍵盤(pán)和鼠標(biāo)),就必須支持Get_Protocol和Set_Protocol請(qǐng)求。
2 HID接口固件設(shè)計(jì)與實(shí)現(xiàn)
該設(shè)備采用C8051F120微控制器和PDIUSBD12芯片來(lái)實(shí)現(xiàn),如圖3所示。
圖3 HID系統(tǒng)結(jié)構(gòu)框圖
因?yàn)镻DIUSBD12的主端點(diǎn)(Endpoint2)具有64字節(jié)的雙緩沖,能夠提供比較高的速度,所以在端點(diǎn)描述符里把它配置為中斷傳輸方式,而Endpoint1沒(méi)有使用。PDIUSBD12通過(guò)中斷觸發(fā)CPU來(lái)響應(yīng)主機(jī)的各種請(qǐng)求。
此系統(tǒng)采用的USB協(xié)議版本是1.1,所以能夠支持中斷輸出傳輸。為了讓主機(jī)把設(shè)備識(shí)別為HID類(lèi)別,定義設(shè)備接口描述符時(shí)類(lèi)別這一字段的值必須設(shè)置為0x03(HID類(lèi)別),這樣主機(jī)就會(huì)繼續(xù)請(qǐng)求獲得設(shè)備的HID描述符和報(bào)告描述符。在主機(jī)Get_Descriptor請(qǐng)求中,當(dāng)值字段的高位字節(jié)為0x21時(shí),表示主機(jī)要求獲得HID描述符;當(dāng)值字段高字節(jié)為0x22時(shí),就是主機(jī)要求獲得報(bào)告描述符。對(duì)于報(bào)告描述符,可以參考HID Usage Tables規(guī)范。HID Descriptor Tool工具可以幫助建立和測(cè)試編寫(xiě)的報(bào)告描述符。這里定義了一個(gè)輸入和輸出64字節(jié)數(shù)據(jù)的報(bào)告描述符。
code unsigned char szReport[] = {
0x06,0xA0,0xFF,//用法頁(yè)(FFA0h, vendor defined)
0x09, 0x01,//用法(vendor defined)
0xA1, 0x01,//集合(ApplicaTION)
0x09, 0x02 ,//用法(vendor defined)
0xA1, 0x00,//集合(Physical)
0x06,0xA1,0xFF,//用法頁(yè)(vendor defined)
//輸入報(bào)告
0x09, 0x03 ,//用法(vendor defined)
0x09, 0x04,//用法(vendor defined)
0x15, 0x80,//邏輯最小值(0x80 or -128)
0x25, 0x7F,//邏輯最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75, 0x08,//報(bào)告長(zhǎng)度Report size (8位)
0x95, 0x40,//報(bào)告數(shù)值(64 fields)
0x81, 0x02,//輸入(data, variable, absolute)
//輸出報(bào)告
評(píng)論