發新話題
打印

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

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

我有一個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)
   
附件2evice Class
EP0 Control   In/Out  8bytes
EP2 Interrupt  Out   64bytes
EP1 Interrupt  IN    64bytes

附件3evice <-> Host
C8051F347<->Host

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

TOP

小弟目前解到剩下一個蠻奇怪的問題,如下述...

當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??

TOP

終於知道原因,因為SimpleHIDWriter是透過Set_Report方式(Control)進行傳輸,而Vendor AP是用EP2 OUT Transfer,
但怪的是,我的Device也有EP2 OUT端點,也有修改InterruptServiceRoutine.c,USB_ReportHandle.c及USB_Standard_Request.c把對應EP2 OUT位置修正,但為何怎麼收不到Data進來呢??

TOP

那Silicon Lab MCU可以不先透過CTRL直接看到OUT就可以收資料了嗎??

如收到什麼送什麼:
OUT  01 01 01 ...
IN   01 01 01 ...
OUT  02 02 02 ...
IN   02 02 02 ...

而不是要像這樣
CTL xx xx xx ...
OUT 01 01 01 ...
IN  01 01 01 ...
CTL xx xx xx ...
OUT 02 02 02 ...
IN  02 02 02 ...

TOP

那Silicon Lab MCU可以不先透過CTRL直接看到OUT就可以收資料了嗎??

==>
簡單說
因為usb 是以host端為主體來去跟device端溝通的,
控制端在host上,所以要由host先發ctrl通知device端接來下的動作是什麼.

我不清楚你所謂的
---- Silicon Lab MCU可以不先透過CTRL直接看到OUT就可以收資料了嗎??
是指什麼狀況下.

細節也許可以先看看USB的SPEC及CLASS或是一些USB相關的書來了解CTRL流程.

TOP

引用:
原帖由 mike 於 2011-8-1 15:43 發表
那Silicon Lab MCU可以不先透過CTRL直接看到OUT就可以收資料了嗎??

==>
簡單說
因為usb 是以host端為主體來去跟device端溝通的,
控制端在host上,所以要由host先發ctrl通知device端接來下的動作是什麼.

我不 ...
謝謝版主大大的回覆...小弟已解決此問題,忘了回覆了..抱歉...^^"

TOP

發新話題