沒有Report ID的HID Report Descriptor,該如何做IN/OUT控制呢?? |
答題得分者是:taishyang
|
phchen0413
一般會員 發表:14 回覆:21 積分:12 註冊:2009-07-01 發送簡訊給我 |
我有一個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 發送簡訊給我 |
大大:
我在幾年前用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 發送簡訊給我 |
謝謝大大回覆,小弟目前自行解到剩下一個蠻奇怪的問題,如下述...
當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 發送簡訊給我 |
|
phchen0413
一般會員 發表:14 回覆:21 積分:12 註冊:2009-07-01 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
兩個AP應該沒有同時開啟吧^^?
再不然只好用EIILISYS or CATC這類USB tracker來看底層的封包有何差異 ===================引 用 phchen0413 文 章=================== 謝謝副站回覆,小弟有用Bus Hound去觀看, 在Host進行OUT Transfer時之前,所有狀態條件都是一樣... 當Host使用兩個不同AP時,就會產生出一個可以接受OUT內容,一個卻不行接受OUT內容,實在令人納悶,自己也想知道問題出在於哪? |
phchen0413
一般會員 發表:14 回覆:21 積分:12 註冊:2009-07-01 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
確認一下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 發送簡訊給我 |
謝謝副站回覆,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 發送簡訊給我 |
要看裝置端的韌體的溝通協議是怎麼寫的,看起來就是要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 發送簡訊給我 |
謝謝副站回覆,所以如此一來需要去把Device端在於USB 溝通協定可能要重新改寫,不然就還是維持CTL->OUT動作然後才會有對應的IN動作...
因為我有直接試過Example,它的動作也是CTL->OUT然後才會有對應的IN動作... 不過令我納悶的事,會跑<!--[if gte mso 9]><xml> ===================引 用 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 發送簡訊給我 |
不是吧
完全是看韌體端怎麼寫的 ===================引 用 phchen0413 文 章=================== 不過令我納悶的事,會跑<!--[if gte mso 9]><xml> |
phchen0413
一般會員 發表:14 回覆:21 積分:12 註冊:2009-07-01 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
就我知道的是,假設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 發送簡訊給我 |
謝謝副站給我一個好觀念,後來我確實去改了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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |