阅读:2485回复:13
usb设备的地址和端口(help!)
每一个usb设备都有唯一的地址,这个地址是如何分配的,存放在什么地方,主机要对设备操作时,如何指定这个设备?如何选择端口?在什么地方选择?在接受端有是如何识别端口数的?
迷惑中…… |
|
最新喜欢:![]()
|
沙发#
发布于:2002-05-21 10:13
地址是由host controler分配的
|
|
板凳#
发布于:2002-05-21 10:57
可以按照以下步骤配置USB设备
1。读取设备描述符 2。读取配置描述符 3。读取接口描述符 每一个接口里都包含一组端点。从而可以得到每个端点的地址、传输类型、和最大长度 4。根据需要配置设备 可以看DDK里ISOUSB的例子 |
|
地板#
发布于:2002-05-21 20:05
很感谢!但是我想知道主机从那里读去这些描述符的?
这些描述符存放在什么地方? ??? 如果是设计从设备,那么在什么地方设置这些值? |
|
|
地下室#
发布于:2002-05-23 19:37
配置信息在设备里。读取的具体步骤如下:
1。读取配置描述符 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor= NULL; 配置描述符。 siz=sizeof(USB_DEVICE_DESCRIPTOR)+nByte;//读出的描述符放在ConfigurationDescriptor中,而紧跟其后则存放 接口信息。nByte 的娶值与该配置的接口数有关。在不知道接口数的情况下,可以给一个足够大的数, 具体处理办法可以参照ISOUSB的例子。 ConfigurationDescriptor = ExAllocatePool(NonPagedPool,siz); UsbBuildGetDescriptorRequest(urb, (USHORT) siz, USB_CONFIGURATION_DESCRIPTOR, 0, 0, //要读取的配置号 ConfigurationDescriptor,NULL,siz, NULL); 生成读取配置描述符URB,urb为生成的指针。 soUsb_CallUSBD(DeviceObject, urb); 提交请求。 USB_CONFIGURATION_DESCRIPTOR主要有以下几个域: UCHAR bNumInterfaces :该配置的接口数。 UCHAR iConfiguration :该配置的配置号。每个设备可以有几个不同的配置,配置数可以从设备描述符 中获得。 2。读取接口描述符: urb = USBD_CreateConfigurationRequest(ConfigurationDescriptor, &siz); 此时,urb中的UrbSelectConfiguration域便有效了。 UrbSelectConfiguration 中的Interface为一个指针。指向了一个类型为USBD_INTERFACE_INFORMATION 的数组。该数组的长度可变,具体由接口数决定。 USBD_INTERFACE_INFORMATION主要有以下几个域: NumberOfPipes 该接口的管道数 Pipes 该接口的管道描述符的头指针。指向一组可变长度的管道描述符。 每个管道描述符便包含了每个端点的地址,传输类型,和最大传输长度。 3。对设备进行配置 生成配置URB(比如按我们刚才读到的配置描述符进行配置) UsbBuildSelectConfigurationRequest(urb, (USHORT) siz, ConfigurationDescriptor); IsoUsb_CallUSBD(DeviceObject, urb); 如何把配置信息写入从设备,我也不知道,等你知道了,告诉我一声。希望度交流,共同提高。 [编辑 - 5/23/02 by cqzhl] |
|
5楼#
发布于:2002-05-23 19:46
描述符应该是编写固件程序时写进固件里面的,固件程序检查上位机的请求发出相应的描述符,也就是说是你写的。设备地址由上位机送下来,再由单片机写进usb芯片。
|
|
|
6楼#
发布于:2002-05-23 20:58
dinolos 你能再详细一点吗,我现在要自己设计usb芯片,但苦于不知该如何使硬件能和主机通信,我的理解是描述符是放在usb芯片的一组寄存器中,而后发送给主机的一组寄存器,但发送到主机的哪里,是怎么决定的?
|
|
7楼#
发布于:2002-05-24 07:00
硬件是在甚麽时间和pc交互地址信息的 ?
|
|
8楼#
发布于:2002-05-24 09:07
硬件是在甚麽时间和pc交互地址信息的 ? 是在USBD完成设备描述符读取之后,由驱动程序通过缺省管道配置的。在此之前,只有Endpoint 0可用。设备端应该在接到主机传送的 配置请求返回相应的数据,具体步骤如cqzhl所写。以下是设备固件的一个配置数据例子: config_descriptor[] = { // Configuration descriptor 0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0x80, 0xfa, 0x09, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // interface 0, alt 0 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x01, //bulk-in 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x01, //bulk-out 0x07, 0x05, 0x83, 0x03, 0x08, 0x00, 0x01, //interrupt in }; |
|
|
9楼#
发布于:2002-05-24 09:38
一点补充,我刚写完一个usb device driver,the following is the sample code of dirver:
unsigned char DEV_DESC[] = { 0x12, /*length of this desc. */ 0x01, /*DEVICE descriptor */ 0x00,0x01, /*spec rev level(BCD)(0x100) */ 0x00, /*device class */ 0x00, /*device subclass */ 0x00, /*device protocol */ 0x08, /*max packet size */ 0x51,0x04, /*National\'s vendor ID */ 0xC3,0x81, /*National\'s product ID */ 0x00,0x01, /*National\'s revision ID */ 0x01, /*index of manuf. string */ 0x02, /*index of prod. string */ 0, /*index of ser. # string */ 0x01 /*number of configs. */ }; 在加上楼上的 config_descriptor[] 和 STR_DESC Host 通过contral pipe 来读取device\'s configurations. |
|
10楼#
发布于:2002-05-25 15:18
请问硬件插上主机后,就由主机发送请求,而后设备只要发送设备描述符,其后的工作都由固件驱动程序完成吗?
谁有固件驱程ma? 麻烦寄给我,万分感谢! e-mail:hualr9623@163.com |
|
11楼#
发布于:2002-05-27 09:07
很感谢!但是我想知道主机从那里读去这些描述符的? 主机是从驱动程序里读取这些描述符的. 这些描述符是存放在usb设备中的!由驱动程序来读取. 我不清楚从设备方面的问题!真的不清楚! |
|
12楼#
发布于:2002-05-27 09:47
硬件插上主机后,主机发送请求,而后设备根据请求发送设备描述符(Device descripter,Configuration descripter and String descripter),配置完成后,开始传数据
|
|
13楼#
发布于:2002-05-27 13:04
这位兄弟,俺也做usb固件方面的配置,希望我们多交流,若你有
固件的配置,请给我寄一份,谢谢! E-mail:a-chao@sohu.com |
|