12.21.2006

GET_DESCRIPTOR - TotalLebngth - XP's behave

在收到 GET_DESCRIPTOR 後,第一次,request length 是 9。剛好是 configuration descriptor 的size。

configuration descriptor 中有一個field 是"Total descriptor length" ,total 就是所有descriptor 的意思,包含這個device 所有的configuration, interface, endpoint。
所以要把這些descriptor 的長度都加起來。

XP 收到9 個byte 的configuration descriptor 後,會知道"totoal descriptor size",於是,會再送出一次相同的 GET_DESCRIPTOR request,但是這次request 的legth 就不只是 9了。

根據"USB complete" 說,XP 會送出你第一次傳給他的configuration descriptor 中total length 的值。

但是我收到的是 0xFF. - 不管我第一次的configuration descriptor 中total length 的值寫的是什麼。

USB 2.0 spec 說 ..(p.253 sec 9.4,3..)
The wLength field specifies the numbers of bytes to return. If the descriptor is longer than the wLength field, only the initial bytes of the descriptor are returned. If the descriptor is shorter than the wLength field, the device indicates the end of the control transfer by sending a short packet when further data is requested. A short packet is defined as a packet shorter than the maximum payload size or a zero length data packet(refer to Chapter 5).

也就是說,XP 第一次要求9 byte,第二次要求0xFF bytes 都是合理的。而且我還真的要follow request bytes length, 第一次只送9 bytes, 第二次送全部的,多的部份送 Null Data.

因為0xFF 這一段跟"USB complete" 說得不一樣,所以google 一下source code..
有一個比較近的.. http://www.google.com/codesearch?hl=zh-TW&q=+USB_DESCRIPTOR_TYPE_CONFIGURATION+show:_S5IVIQqAzc:jVtJyZxm8xs:2mzD8Tn8zNc&sa=N&cd=2&ct=rc&cs_p=http://cq.cx/dl/at91sam7sXXX.zip&cs_f=bootrom/usb.c#a0

 switch(usd.bRequest) {
case USB_REQUEST_GET_DESCRIPTOR:
.....
} else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_CONFIGURATION) {
UsbSendEp0((BYTE *)&ConfigurationDescriptor,
min(sizeof(ConfigurationDescriptor), usd.wLength));
} else if(...
...
..也是一樣。
. 所以是我看錯了 :P

沒有留言: