全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3552
推到 Plurk!
推到 Facebook!

沒有Report ID的HID Report Descriptor,該如何做IN/OUT控制呢??

答題得分者是:taishyang
phchen0413
一般會員


發表:14
回覆:21
積分:12
註冊:2009-07-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-07-08 15:27:22 IP:180.217.xxx.xxx 訂閱
我有一個HID Report Descriptor(如附件1),在F/W已經build in在C8051F347中...
若main函式(附件4)裡將for loop拿掉且把Device(C8051F347)插入Host就會出現"無法辨識裝置"
反之,若沒有把for loop拿掉,把Device(C8051F347)插入Host就會出現"找到新的硬體可以使用"等訊息..
如果於Host再打開AP它會自動進行In & Out 動作...

因此,我想請問的是
1.沒有Report ID的HID Report Descriptor,該如何做IN/OUT控制呢??
2.為何在main中少了for loop就出現"無法辨識裝置"??
3.我並沒有在IN_PACKET或OUT_PACKET進行任何更新動作,那為何AP打開時Host與Device間會自動進行In & Out 動作??

我是使用Mouse Example進行修改

附件1:HID Report Descriptor
0x06,0xFF,0xFF, // USAGE PAGE(Vendor Define Page)
0x09,0x01, // USAGE(Vendor Usage 1)
0xA1,0x01, // COLLECTION(Application)
0x09,0x02, //
0x09,0x03, //
0x15,0x00, // Logical Minimum(0)
0x26,0xFF,0x00, // Logical Maxmum(255)
0x75,0x08, // Report Size(8)
0x95,0x40, // Report Count(64)
0x81,0x02, // Input(Data,Var,Abs)
0x09,0x04, //
0x09,0x05, //
0x15,0x00, // Logical Minimum(0)
0x26,0xFF,0x00, // Logical Maxmum(255)
0x75,0x08, // Report Size(8)
0x95,0x40, // Report Count(64)
0x91,0x02, // Output(Data,var,Abs)
0x09,0x06,
0x09,0x07,
0x15,0x00, // Logical Minimum(0)
0x26,0xFF,0x00, // Logical Maxmum(255)
0x75,0x08, // Report Size(8)
0x95,0x04, // Report Count(4)
0xB1,0x02, // feature(Data,var,Abs)
0xC0, // End Collection (Application)

附件2: Device Class
EP0 Control In/Out 8bytes
EP2 Interrupt Out 64bytes
EP1 Interrupt IN 64bytes

附件3: Device <-> Host
C8051F347<->Host

附件4:main程式
void main()
{
unsigned char i;
system_Init();
usb0_init();
EA=1;
for(i=0;i<300;i )
{
}
}
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-07-10 11:54:49 IP:114.27.xxx.xxx 未訂閱
大大:
我在幾年前用PIC18F87J50做的一片I/O板子,程式是microchip提供, 參考看看
rom struct{byte report[HID_RPT01_SIZE];}hid_rpt01={
// Report Descriptor : Refer to Sunil's PIC16C745 demo
// 0x06 , 0x00 , 0xff ,
// 0x09 , 0x01 ,
// 0xa1 , 0x01 ,
// 0x19 , 0x01 ,
// 0x29 , 0x08 ,
// 0x15 , 0x00 ,
// 0x26 , 0xff , 0x00 ,
// 0x75 , 0x08 ,
// 0x95 , 0x08 ,
// 0x81 , 0x02 ,
// 0x19 , 0x01 ,
// 0x29 , 0x08 ,
// 0x91 , 0x02 ,

// Report Descriptor : Refer to USB Complete
0x06 , 0xa0 , 0xff ,
0x09 , 0xa5 ,
0xa1 , 0x01 ,
// IN report
0x09 , 0xa6 ,
0x09 , 0xa7 ,
0x15 , 0x00 ,
0x26 , 0xff ,0x00,
0x75 , 0x08 ,
0x95 , HID_INT_IN_EP_SIZE ,
0x81 , 0x02 ,
// OUT report
0x09 , 0xa9 ,
0x15 , 0x00 ,
0x26 , 0xff ,0x00,
0x75 , 0x08 ,
0x95 , HID_INT_OUT_EP_SIZE ,
0x91 , 0x02 ,
0xc0 } ;
請參考:
http://www.atmel.com/dyn/products/product_docs.asp?category_id=163&family_id=604&subfamily_id=1686&part_id=3480
Documents頁下USB Generic Implementation Based on HID Class
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=cn011980
phchen0413
一般會員


發表:14
回覆:21
積分:12
註冊:2009-07-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-07-12 17:40:42 IP:180.217.xxx.xxx 訂閱
謝謝大大回覆,小弟目前自行解到剩下一個蠻奇怪的問題,如下述...

當SimpleHIDWriter軟體對C8051F347在於IN/OUT Transfer都是沒有問題
USB HID
C8051F347 (Device)<------> SimpleHIDWriter(Host)

如果改用Vendor AP對C8051F347在於IN transfer是沒有問題,可是對Vendor AP在於OUT送過來資料,Device都收不到任何資料
USB HID
C8051F347 (Device) -------> Vendor AP(Host)

而這兩個條件所使用的C8051F347 (Device)在於Code,H/W都是一樣的,但不同AP卻有不樣結果??Why??

taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-07-12 19:00:15 IP:122.116.xxx.xxx 訂閱
可以用bushound這類的側錄軟體監看一下兩者之間有何差異 ^^
phchen0413
一般會員


發表:14
回覆:21
積分:12
註冊:2009-07-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-07-13 08:54:31 IP:211.75.xxx.xxx 訂閱
謝謝副站回覆,小弟有用Bus Hound去觀看, 在Host進行OUT Transfer時之前,所有狀態條件都是一樣...
當Host使用兩個不同AP時,就會產生出一個可以接受OUT內容,一個卻不行接受OUT內容,實在令人納悶,自己也想知道問題出在於哪?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-07-13 10:25:21 IP:122.116.xxx.xxx 訂閱
兩個AP應該沒有同時開啟吧^^?
再不然只好用EIILISYS or CATC這類USB tracker來看底層的封包有何差異

===================引 用 phchen0413 文 章===================
謝謝副站回覆,小弟有用Bus Hound去觀看, 在Host進行OUT Transfer時之前,所有狀態條件都是一樣...
當Host使用兩個不同AP時,就會產生出一個可以接受OUT內容,一個卻不行接受OUT內容,實在令人納悶,自己也想知道問題出在於哪?
phchen0413
一般會員


發表:14
回覆:21
積分:12
註冊:2009-07-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-07-13 17:15:09 IP:211.75.xxx.xxx 訂閱
謝謝副站回覆,小弟沒有同時開啟AP,也終於知道為何兩個AP打開時,會有不同結果.因為SimpleHIDWriter是透過Set_Report方式(Control)進行傳輸,而Vendor AP是用EP2 OUT傳輸,
但怪的是,我的Device也有EP2 OUT端點,但為何怎麼收不到Data進來呢??
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-07-13 17:24:47 IP:122.116.xxx.xxx 訂閱
確認一下device EP2是否有丟資料出來?
另外確認一下你AP是否有正確的取得EP2所對應的handle?

===================引 用 phchen0413 文 章===================
謝謝副站回覆,小弟沒有同時開啟AP,也終於知道為何兩個AP打開時,會有不同結果.因為SimpleHIDWriter是透過Set_Report方式(Control)進行傳輸,而Vendor AP是用EP2 OUT傳輸,
但怪的是,我的Device也有EP2 OUT端點,但為何怎麼收不到Data進來呢??
phchen0413
一般會員


發表:14
回覆:21
積分:12
註冊:2009-07-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-07-13 19:48:42 IP:180.217.xxx.xxx 訂閱
謝謝副站回覆,Vendor AP丟的方式只有OUT,但我一直無法收到之後回傳給Host端,如Case 1.
若用SimpleHIDWriter就如case 2般一樣,收到什麼送什麼,但OUT之前都會有CTL傳輸動作...
目前想到條件會有
1.這樣會是MCU只能接收如case 2狀況嗎??對於case 1無法達到??
2.EP2 功能沒有啟動,以至於USB HID動作時它發現不到EP2 OUT動作,因此就直接跑CTL取代OUT動作??

case 1
OUT 01 01 01 ...
IN 01 01 01 ... <-目前收不到無法回相同內容
OUT 02 02 02 ...
IN 02 02 02 ... <-目前收不到無法回相同內容

case 2
CTL xx xx xx ...
OUT 01 01 01 ...
IN 01 01 01 ...
CTL xx xx xx ...
OUT 02 02 02 ...
IN 02 02 02 ...
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-07-14 10:24:18 IP:122.116.xxx.xxx 訂閱
要看裝置端的韌體的溝通協議是怎麼寫的,看起來就是要CTRL OUT給裝置,裝置才會丟東西出來

===================引 用 phchen0413 文 章===================
謝謝副站回覆,Vendor AP丟的方式只有OUT,但我一直無法收到之後回傳給Host端,如Case 1.
若用SimpleHIDWriter就如case 2般一樣,收到什麼送什麼,但OUT之前都會有CTL傳輸動作...
目前想到條件會有
1.這樣會是MCU只能接收如case 2狀況嗎??對於case 1無法達到??
2.EP2 功能沒有啟動,以至於USB HID動作時它發現不到EP2 OUT動作,因此就直接跑CTL取代OUT動作??

case 1
OUT 01 01 01 ...
IN 01 01 01 ... <-目前收不到無法回相同內容
OUT 02 02 02 ...
IN 02 02 02 ... <-目前收不到無法回相同內容

case 2
CTL xx xx xx ...
OUT 01 01 01 ...
IN 01 01 01 ...
CTL xx xx xx ...
OUT 02 02 02 ...
IN 02 02 02 ...
phchen0413
一般會員


發表:14
回覆:21
積分:12
註冊:2009-07-01

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-07-14 10:46:15 IP:180.217.xxx.xxx 訂閱
謝謝副站回覆,所以如此一來需要去把Device端在於USB 溝通協定可能要重新改寫,不然就還是維持CTL->OUT動作然後才會有對應的IN動作...
因為我有直接試過Example,它的動作也是CTL->OUT然後才會有對應的IN動作...
不過令我納悶的事,會跑<!--[if gte mso 9]><xml> </xml><![endif]--><!--[if gte mso 9]><xml> Normal 0 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><xml> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:表格內文; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> 要看裝置端的韌體的溝通協議是怎麼寫的,看起來就是要CTRL OUT給裝置,裝置才會丟東西出來

===================引 用 phchen0413 文 章===================
謝謝副站回覆,Vendor AP丟的方式只有OUT,但我一直無法收到之後回傳給Host端,如Case 1.
若用SimpleHIDWriter就如case 2般一樣,收到什麼送什麼,但OUT之前都會有CTL傳輸動作...
目前想到條件會有
1.這樣會是MCU只能接收如case 2狀況嗎??對於case 1無法達到??
2.EP2 功能沒有啟動,以至於USB HID動作時它發現不到EP2 OUT動作,因此就直接跑CTL取代OUT動作??

case 1
OUT 01 01 01 ...
IN 01 01 01 ... <-目前收不到無法回相同內容
OUT 02 02 02 ...
IN 02 02 02 ... <-目前收不到無法回相同內容

case 2
CTL xx xx xx ...
OUT 01 01 01 ...
IN 01 01 01 ...
CTL xx xx xx ...
OUT 02 02 02 ...
IN 02 02 02 ...
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-07-14 10:58:30 IP:122.116.xxx.xxx 訂閱
不是吧
完全是看韌體端怎麼寫的



===================引 用 phchen0413 文 章===================
不過令我納悶的事,會跑<!--[if gte mso 9]><xml> </xml><![endif]--><!--[if gte mso 9]><xml> Normal 0 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><xml> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:表格內文; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> CTL->OUT應該是沒有定義OUT EP才會這麼做,如果有定義了OUT EP該是要將OUT權力給OUT EP不是嗎??


phchen0413
一般會員


發表:14
回覆:21
積分:12
註冊:2009-07-01

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-07-14 11:12:09 IP:211.75.xxx.xxx 訂閱
是喔~如此一來不見得要依據HID 1.11規範去做,完全是由F/W底層溝通協定去define

===================引 用 taishyang 文 章===================
不是吧
完全是看韌體端怎麼寫的




taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-07-14 11:25:13 IP:122.116.xxx.xxx 訂閱
就我知道的是,假設Endpoint規劃如下

[韌體端] [USB HID DRIVER] [AP端用的API]
EP0 (control pipe) <--------------> HidD_SetOutputReport/HidD_GetInputReport
EP1 (interrupt in) <--------------> WriteFile
EP2 (interrupt out) <--------------> ReadFile

是一對一的關係,所以我才會說要看韌體端怎麼寫的 ^^

P.S:EP0是雙向,EP1/EP2單一方向,IN或OUT可以改變


===================引 用 phchen0413 文 章===================
是喔~如此一來不見得要依據HID 1.11規範去做,完全是由F/W底層溝通協定去define



phchen0413
一般會員


發表:14
回覆:21
積分:12
註冊:2009-07-01

發送簡訊給我
#15 引用回覆 回覆 發表時間:2011-07-14 15:53:34 IP:211.75.xxx.xxx 訂閱
謝謝副站給我一個好觀念,後來我確實去改了USB F/W底層的協定之後,現在可以直接OUT就直接IN了..

===================引 用 taishyang 文 章===================
就我知道的是,假設Endpoint規劃如下

[韌體端] [USB HID DRIVER] [AP端用的API]
EP0 (control pipe) <--------------> HidD_SetOutputReport/HidD_GetInputReport
EP1 (interrupt in) <--------------> WriteFile
EP2 (interrupt out) <--------------> ReadFile

是一對一的關係,所以我才會說要看韌體端怎麼寫的 ^^

P.S:EP0是雙向,EP1/EP2單一方向,IN或OUT可以改變


===================引 用 phchen0413 文 章===================
是喔~如此一來不見得要依據HID 1.11規範去做,完全是由F/W底層溝通協定去define



系統時間:2024-03-29 17:12:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!