本帖最后由 kwell2009 于 2011-7-29 10:58 编辑
2.配置设备。其实,照抄Windows的步骤就可以了,但我承认我蛋疼了,打印出整份配置描述符对着UVC的资料看,这里相关的包括USB_Video_Class_1.1.pdf和USB_Video_Payload_MJPEG_1.1.pdf。
现在把关键的配置描述符分开标明:
0x09 0x02 0x2A 0x02 0x02 0x01 0x00 0x80 0x31
0x08 0x0B 0x00 0x02 0x0E 0x03 0x00 0x01
0x09 0x04 0x00 0x00 0x01 0x0E 0x01 0x00 0x01 -- VC interface descriptor
0x0D 0x24 0x01 0x00 0x01 0x67 0x00 0xC0 0xE1 0xE4 0x000x01 0x01
0x09 0x24 0x03 0x02 0x01 0x01 0x00 0x05 0x00 -- output trminal(ID 02)
0x1A 0x24 0x06 0x04 0x70 0x33 0xF0 0x28 0x11 0x63 0x2E0x4A 0xBA 0x2C 0x68 0x90 0xEB 0x33 0x40 0x16 0x08 0x01 0x03 0x01 0x2F 0x00 –extension unit (ID 04)
0x1A 0x24 0x06 0x05 0x3F 0xAE 0x12 0x28 0xD7 0xBC 0x110x4E 0xA3 0x57 0x6F 0x1E 0xDE 0xF7 0xD6 0x1D 0x08 0x01 0x04 0x01 0x00 0x00 –extension unit (ID 05)
0x12 0x24 0x02 0x01 0x01 0x02 0x00 0x00 0x00 0x00 0x000x00 0x00 0x00 0x03 0x00 0x00 0x00 – camera terminal (ID 01)
0x0B 0x24 0x05 0x03 0x01 0x00 0x00 0x02 0x3F 0x05 0x00 –processing unit(ID 03)
0x07 0x05 0x83 0x03 0x10 0x00 0x06
0x05 0x25 0x03 0x10 0x00
0x09 0x04 0x01 0x00 0x00 0x0E 0x02 0x00 0x00 – VS interface descriptor
0x0E 0x24 0x01 0x01 0x34 0x01 0x81 0x00 0x02 0x02 0x010x00 0x01 0x00 – input header(MJPEG)
0x0B 0x24 0x06 0x01 0x05 0x00 0x01 0x00 0x00 0x00 0x00
0x32 0x24 0x07 0x01 0x00 0x80 0x02 0xE0 0x01 0x00 0x2C0x01 0x00 0x00 0x28 0x23 0x00 0x00 0x2C 0x01 0x00 0x15 0x16 0x05 0x00 0x06 0x150x16 0x05 0x00 0x20 0xA1 0x07 0x00 0x2A 0x2C 0x0A 0x00 0x40 0x42 0x0F 0x00 0x800x84 0x1E 0x00 0x80 0x96 0x98 0x00 – frame01(640*480)
0x32 0x24 0x07 0x02 0x00 0x60 0x01 0x20 0x01 0x00 0x630x00 0x00 0x00 0x9A 0x0B 0x00 0x00 0x63 0x00 0x00 0x15 0x16 0x05 0x00 0x06 0x150x16 0x05 0x00 0x20 0xA1 0x07 0x00 0x2A 0x2C 0x0A 0x00 0x40 0x42 0x0F 0x00 0x800x84 0x1E 0x00 0x80 0x96 0x98 0x00
0x32 0x24 0x07 0x03 0x00 0x40 0x01 0xF0 0x00 0x00 0x4B0x00 0x00 0x00 0xCA 0x08 0x00 0x00 0x4B 0x00 0x00 0x15 0x16 0x05 0x00 0x06 0x150x16 0x05 0x00 0x20 0xA1 0x07 0x00 0x2A 0x2C 0x0A 0x00 0x40 0x42 0x0F 0x00 0x800x84 0x1E 0x00 0x80 0x96 0x98 0x00 – frame03(320*240)
0x32 0x24 0x07 0x04 0x00 0xB0 0x00 0x90 0x00 0xC0 0x180x00 0x00 0x80 0xE6 0x02 0x00 0xC0 0x18 0x00 0x00 0x15 0x16 0x05 0x00 0x06 0x150x16 0x05 0x00 0x20 0xA1 0x07 0x00 0x2A 0x2C 0x0A 0x00 0x40 0x42 0x0F 0x00 0x800x84 0x1E 0x00 0x80 0x96 0x98 0x00
0x32 0x24 0x07 0x05 0x00 0xA0 0x00 0x78 0x00 0xC0 0x120x00 0x00 0x80 0x32 0x02 0x00 0xC0 0x12 0x00 0x00 0x15 0x16 0x05 0x00 0x06 0x150x16 0x05 0x00 0x20 0xA1 0x07 0x00 0x2A 0x2C 0x0A 0x00 0x40 0x42 0x0F 0x00 0x800x84 0x1E 0x00 0x80 0x96 0x98 0x00
0x1B 0x24 0x03 0x00 0x05 0x80 0x02 0xE0 0x01 0x60 0x010x20 0x01 0x40 0x01 0xF0 0x00 0xB0 0x00 0x90 0x00 0xA0 0x00 0x78 0x00 0x01 0x00
0x06 0x24 0x0D 0x01 0x01 0x04
0x09 0x04 0x01 0x01 0x01 0x0E 0x02 0x00 0x00 – alternate setting 01
0x07 0x05 0x81 0x05 0x80 0x00 0x01 – endpoint(128 bytes)
0x09 0x04 0x01 0x02 0x01 0x0E 0x02 0x00 0x00 – alternate setting 02
0x07 0x05 0x81 0x05 0x00 0x01 0x01 – endpoint(256 bytes)
0x09 0x04 0x01 0x03 0x01 0x0E 0x02 0x00 0x00
0x07 0x05 0x81 0x05 0x00 0x02 0x01
0x09 0x04 0x01 0x04 0x01 0x0E 0x02 0x00 0x00
0x07 0x05 0x81 0x05 0x58 0x02 0x01
0x09 0x04 0x01 0x05 0x01 0x0E 0x02 0x00 0x00
0x07 0x05 0x81 0x05 0x20 0x03 0x01
0x09 0x04 0x01 0x06 0x01 0x0E 0x02 0x00 0x00
0x07 0x05 0x81 0x05 0xBC 0x03 0x01
其中,input header descriptor的bDescriptorSubtype=06,说明其图像格式为MJPEG(USB_Video_Payload_MJPEG_1.1.pdf第75,136页),故接下来的内容得对着USB_Video_Payload_MJPEG_1.1.pdf 看。
区分开配置描述符中的各项后,Windows开始对设备进行配置,首先设置 VS接口(set interface),命令为:
01 0b 00 00 01 00 00 00
为设置VS接口的备用0接口(alternating interface),先获取各个参数,先是:
a1 XX 00 YY 00 04 ZZ 00
04 -- 为第一个extension unit 的 ID
和:
a1 XX 00 YY 00 03 ZZ 00
03 -- 为processing unit 的ID
获取processing unit 的信息可以理解,因为其包括大量摄像头的参数(USB_Video_Class_1.1.pdf第138页),但是获取大量的 extension unit 的信息我就挠头了,资料里也找不着,只有一个XU_CONTROL_UNDEFINED—00,还一点都不沾边,不懂不懂。
到此为止,Windows一直在获取设备的信息,判断其当前值是否在允许范围之内,该USB摄像头的设置没有超出允许值,故没有 SET CUR 的命令。所以,我华丽的将这一大段无视了。
接下来,设置点亮摄像头的背光
,并检查是否设置成功:
(为什么是01这个值,为什么?找不到找不到)。然后根据VS_PROBE_CONTROL, VS_COMMIT_CONTROL(USB_Video_Class_1.1.pdf第116页) 的值,设置VS_STILL_PROBE_CONTROL, VS_STILL_COMMIT_CONTROL(USB_Video_Class_1.1.pdf第129页)。其中,这4个接口控制(interfacecontrol,不知该怎么翻译)中,bFormatIndex 和 bFrameIndex 是需要设置的:
前者根据input header 的bNumFormats来设置,这里为1,只有一个,故为 01;
后者根据你要得到的图片分辨率来设置,我需要320*240,故为03 。
还要设置激活(set interface 不知该怎么表达,类似于使能吧)你需要的接口配置(alternatingsetting),
01 0b 01 00 01 00 00 00
需要注意的是:作为主机的CH374接收缓冲区最大只有128字节,所以,根据接口对应的端点大小,选择接口配置01(128字节) 。
09 04 01 01 01 0e 02 00 00
07 05 81 05 80 00 01
端点描述符标明,该端点传输模式为等时传输(isochronous transfer)。
以下是windows的设置过程,照着改就行了。
|