呵呵,你真走运,我正好这几天在做枚举这部分,并且已经成功了。下面告诉你我的过程:
根集线器检查到设备连接后,激活主机USB总线驱动程序,USBD发出一系列的SETUP包。这过程中并不要用到你自己编的驱动,会由系统的总线驱动来自动处理,所以你要自己还没编主机那的驱动,也能调枚举过程。
主机的第一个命令要求得到设备描述符,此SETUP包为8个字节数据(80,06,00,01,00,00,40,00),其具体含义自己看资料。40表示返回数据长度最大为40H个字节。实际上,你只只返回一个包,即数组DEV_DESC[]中的前8个字节。用于说明设备的描述符的真实长度和设备的类型。
接着是设置设备地址处理事件,主机发送一个含有指定地址的数据包(00,05,02,00,00,00,00,00),设备需返回一个0数据包(这一步一定要做)。在主机只有一个USB设备的时候,这个地址一般会是2。设置地址事件处理结束后,设备进入地址状态,主机会在指定地址处访问设备。
主机再次发送得到设备描述符的数据包(80,06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的数据长度。因为设备每次只能发送16字节,因此它会分两次(18字节)完成此要求。
接着主机要求得到设备的配置描述符(80,06,00,02,00,00,09,00),包中数据“09”指定设备发送9个字节,这正是设备配置描述符的长度。
接着主机要求得到设备的配置描述符、接口描述符和节点描述符(80,06,00,02,00,00,FF,00),由于不知道设备描述符的真实长度,因此它要求得到256个字节,
以上过程主机都是总线驱动层在处理,你用USBVIEW能看到你发出的东西,下面的一步(最后一步)就需要你的设备驱动来做了:
最后主机发送设置设备配置SETUP包(00,09,01,00,00,00,00,00),设备处理此事件,将允许所有节点进入工作状态。
如果D12固件没问题,则只收到:
1,get_descriptor;d12发送8字节的设备描述符信息
2.set_address;
3,get_descriptor;获取全部设备描述符
4,get_decriptor:9byte配置描述符
5,get_decriptor:整个配置描述符,包括interface,endpoit
6,找驱动程序->终止,d12灯灭
根集线器检查到设备连接后,激活主机USB总线驱动程序,USBD发出一系列的SETUP包。这过程中并不要用到你自己编的驱动,会由系统的总线驱动来自动处理,所以你要自己还没编主机那的驱动,也能调枚举过程。
主机的第一个命令要求得到设备描述符,此SETUP包为8个字节数据(80,06,00,01,00,00,40,00),其具体含义自己看资料。40表示返回数据长度最大为40H个字节。实际上,你只只返回一个包,即数组DEV_DESC[]中的前8个字节。用于说明设备的描述符的真实长度和设备的类型。
接着是设置设备地址处理事件,主机发送一个含有指定地址的数据包(00,05,02,00,00,00,00,00),设备需返回一个0数据包(这一步一定要做)。在主机只有一个USB设备的时候,这个地址一般会是2。设置地址事件处理结束后,设备进入地址状态,主机会在指定地址处访问设备。
主机再次发送得到设备描述符的数据包(80,06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的数据长度。因为设备每次只能发送16字节,因此它会分两次(18字节)完成此要求。
接着主机要求得到设备的配置描述符(80,06,00,02,00,00,09,00),包中数据“09”指定设备发送9个字节,这正是设备配置描述符的长度。
接着主机要求得到设备的配置描述符、接口描述符和节点描述符(80,06,00,02,00,00,FF,00),由于不知道设备描述符的真实长度,因此它要求得到256个字节,
以上过程主机都是总线驱动层在处理,你用USBVIEW能看到你发出的东西,下面的一步(最后一步)就需要你的设备驱动来做了:
最后主机发送设置设备配置SETUP包(00,09,01,00,00,00,00,00),设备处理此事件,将允许所有节点进入工作状态。
如果D12固件没问题,则只收到:
1,get_descriptor;d12发送8字节的设备描述符信息
2.set_address;
3,get_descriptor;获取全部设备描述符
4,get_decriptor:9byte配置描述符
5,get_decriptor:整个配置描述符,包括interface,endpoit
6,找驱动程序->终止,d12灯灭