把“USB驱动”拆开理解。底层负责硬件的部分只管收发,确实不要求0包。但是Host确认数据接收完成并不是底层的动作,而是由Host驱动的Class部分决定的。不同的Class,对于USB数据有不同的要求,需要不同的“完成”标志。好多设备Class要求取到“0”为一个命令的结束。USB传输4字节对齐,不能被4整除的数据天然的后面就带“0”。而未满整包的受到长度制约,也可以读完。但如果收到的数据如果恰好等于包大小(USB2.0为512)的整数倍时,数据就正好没有“0”作为结尾。有点类似于C语言里找不到字符串结尾‘\0’的情况。这时就需要Device端通过发0字节包(Zero-length package,zlp)的形式为发送完成的数据补‘0’。
所以在Device端开发的时候,不能把0包的逻辑加到底层,而应该在Class层相对的Function逻辑层进行判断并发送0包,底层只要支持0数据的发送就可以了。
当然底层驱动自己发0也没错,因为大多数设备收到单独的0跟没收一样。
USB驱动的Class层负责决定数据接收完成的标志,不同设备Class对数据有不同要求。当数据无自然0结尾或等于包大小整数倍时,需通过发送Zero-lengthpackage(zlp)补0。开发中,0包逻辑应在Class层的Function逻辑层处理,底层仅需支持0数据发送。
9621

被折叠的 条评论
为什么被折叠?



