阅读:1330回复:7
D12如何“设备应答”?
看周立功的枚举过程列出来的数据――其中设备应答是怎么完成的呢?
是否是那个应答SETUP命令就可以,为什么要对端点索引0和端点索引1都要应答一次? 还有,我到现在都没搞清楚――到底D12的端点索引0和端点索引1是不是共用的缓冲区,还是它们各自拥有自己的缓冲区? 我现在可以接受到主机第一次发来的设备描述符、主机分配的地址,,,也收到了第二次发来的设备描述符,,,可就是收不到主机发的配置符!!!!!!!! 感觉调D12真是步履为艰,,,,,, [编辑 - 12/19/03 by Wxy8030] |
|
沙发#
发布于:2003-12-19 10:25
呵呵,D12规定每收到1个SETUP包就会屏蔽2条命令(清空缓冲区命令和使缓冲区有效命令)以保证SETUP包的完整性(不受破坏),所以接收到数据包以后需要用应答命令重新使这两条命令有效,否则你将不能发送数据,端点索引0和1的缓冲区是分开的,0负责接收(即OUT),1负责发送(即IN),所以你需要对0和1都应答一次。枚举过程简单来讲是这样的:主机通过SETUP包的形式向设备发调档命令,设备接收到命令分析后把相应档案资料上传,而在资料数据发送完后都要发一个ACK(0字节数据包)作为正确应答。
|
|
板凳#
发布于:2003-12-19 10:38
不好意思,还要请教啊――
既然IN、OUT缓冲区是分开的,SETUP包只会出现在OUT的缓冲区内,并不影响IN缓冲区啊?为什么也要禁止IN缓冲区的清空和使缓冲区有效这两个命令呢?应答端点索引0我可以理解,为什么要应答端点索引1就有点模糊了,,,(是否是D12就这么规定的,接受到SETUP包后,IN、OUT着两个缓冲区都不能动了?) 还有――“主机通过SETUP包的形式向设备发调档命令,设备接收到命令分析后把相应档案资料上传,而在资料数据发送完后都要发一个ACK(0字节数据包)作为正确应答。” 此ACK是主机发到从机,还是从机自己发出的? |
|
地板#
发布于:2003-12-19 11:06
不好意思,还要请教啊―― 此处是主机发给设备。接收数据方发送ACK给发送方 |
|
|
地下室#
发布于:2003-12-19 11:46
清空缓冲区命令是针对端点索引0的,即OUT缓冲区,使缓冲区有效命令是针对端点索引1的,即针对IN缓冲区,IN和OUT都是针对主机而言,ACK当然是设备发往主机的啊,表示正确应答了主机的SETUP包啊。
|
|
5楼#
发布于:2003-12-19 14:13
清空缓冲区命令是针对端点索引0的,即OUT缓冲区,使缓冲区有效命令是针对端点索引1的,即针对IN缓冲区,IN和OUT都是针对主机而言,ACK当然是设备发往主机的啊,表示正确应答了主机的SETUP包啊。 拜托,仔细看看协议吧,不要误导别人。 ――“主机通过SETUP包的形式向设备发调档命令,设备接收到命令分析后把相应档案资料上传,而在资料数据发送完后都要发一个ACK(0字节数据包)作为正确应答。” 首先,“0字节数据包”和“ACK”是两码事 针对上面这句话,设备正确收到setup包后,立即就发ACK给host;然后才是发送数据,每发一次数据,如果host正确接收到的话,就给设备发ACK确认,直到数据发送完(注意,这里的ACK是host发给设备的!);数据发送完成,host端发送一个0字节的数据包给设备,注意他不是ACK!,设备正确接收到这个数据包,返回ACK。至此,一个USB控制传输事务才算完成。 |
|
|
6楼#
发布于:2003-12-19 14:16
呵呵,没事没事,这个我大概知道了,,,,,,
|
|
7楼#
发布于:2003-12-19 16:04
flycat0101说得对,我那段话确实有误导的嫌疑,在这里向Wxy8030表示道歉。一个完整的控制模式下传输事务就像flycat0101所说,在这里我做一点补充:如果上传数据不是端点0缓冲区大小的整数倍的话,那么上传的最后一个数据包必小于缓冲区大小,也就向主机宣告了本次数据阶段的结束,如果上传数据刚好是缓冲区大小的整数倍的话,那么最后设备还必须发送一个0字节长度的数据包表示本次状态的结束(我一开始理解错了,这里特别指出)。
|
|