阅读:1190回复:5
d12固件的一个小问题
刚刚在看《PDIUSBD12固件编程与驱动开发》,里面有几个地方看不太懂,向各位高手请教!
1)在端点0的OUT中断程序里有这么一句: .... if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE) { bEPPflags.bits.control_state=USB_IDEL; D12_SetEndpointStatus(0,1); D12_SetEndpointStatus(1,0); } else { bEPPflags.bits.contorl_state=USB_RECEIVE; } .... 其中MAX_CONTROLDATA_SIZE=8;程序表明,当要传输的数据大于8时就会停掉端点(属于出错情况);这是当收到的是setup包的时候,但是再看看端点0的另外一种情况当收到的不是setup包的时候: if(bEPPflags.bit.control_state==USB_RECEIVE) { i=D12_ReadEndpoint(0,EP0_PACKET_SIZE, ControlData.dataBuffer+controldata.wCount); contorlData.wCount+=i; } 在这里,一次却可以收到大于8的数,EP0_PACKET_SIZE等于16!即一次可以从端点0的缓冲区里读到16个字节的数据,这是不是程序有矛盾呀??? 2)在D12_SmartBoard里,为什么它的固件里的端点1IN的程序里没有做数据的处理,只是清理了标志位?还有主端点in的程序里也没有数据的处理,难道smart――board里没用到这两个端点吗? |
|
沙发#
发布于:2004-02-25 09:40
因为命令包就是8个字节,如果不是8个字节当然就判断不是命令了
|
|
|
板凳#
发布于:2004-02-25 10:01
我觉得不应该这么理解,ControlData.DeviceRequest.WLength中放的是在SETUP包后主机要发送或接收到多少个字节的数据,它这一个if语句就限制了主机在setup包后只能收到或接受8个字节的数据包,我是这么理解的,这是因为设备固件中接受数据的缓冲区只有MAX_CONTROLDATA_SIZE这么大!
#define MAX_CONTROLDATA_SIZE 8 typedef struct _control_xfer { DEVICE_REQUEST DeviceRequest; unsigned short wLength; unsigned short wCount; unsigned char * pData; unsigned char dataBuffer[MAX_CONTROLDATA_SIZE]; } CONTROL_XFER; 但是当设备接受数据时,就是第二断程序,却一次可以读出EP0_PACKET_SIZE个字节,而EP0_PACKET_SIZE=16; 这就是我疑惑的地方,前面是只要接受的数据大于8就停掉端点,而后面却可以接受到大于16字节的数据(但用不上),因为前面的if语句在接收到的数据大于8时把端点停掉了!所以这是不是程序的逻辑问题,请教大家! |
|
地板#
发布于:2004-02-25 10:35
不是的
这是程序设计成这样的 为了使固件能在字节数正确的情况下再去判断是什么命令 |
|
|
地下室#
发布于:2004-02-26 23:21
我也想知道啊,特别是第2个问题!谁能回答啊!!
|
|
5楼#
发布于:2004-02-29 01:03
我没有smartboad的源代码。
不过可以这样讲,如果你只是传送小规模的数据(指小于等与缓冲区SIZE),除了请中断外,完全不用处理IN管道。因为USB是非对称协议,设备端对IN请求是被动的。但D12帮你做成了可以是主动的。 |
|
|