硬件修复上节提到的单字节读写问题后,就可以继续往下跑了。
我们需要把usb设备枚举成一个rndis设备,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。
现在的几个buffer是这样分配的:
1.控制传输的setup transaction部分,其中的data放在g_ep0_setup_pkt(0x22000)
2.控制传输如果是标准控制传输,其中的data transaction部分,放在g_ep0_status_buf(0x23000),所以,这个g_ep0_status_buf可能是输入也可能是输出
3.控制传输如果是class控制传输,其中的data transaction部分,放在encapsulated_buffer(0x25000)
4.中断传输现在就是8个字节,放在notify_data(0x24000)
5.encapsulated_buffer和g_ep0_status_buf放在一个地址会不会产生问题,需要做个实验验证一下。想像中应该会有问题,就是如果标准控制传输和class控制传输混杂在一起的情况,那么该buffer有时候会不会不知道该给哪个控制传输准备了呢?
在代码dwc_usb3_do_setup函数中添加class control transfer的处理:
?else if ((UT_GET_TYPE(ctrl.bmRequestType)) == UT_CLASS)?
? ? {
? ? ? ? LOG_USB_DEBUG("USB_REQ UT_CLASS \n");
?? ??? ?extern uint8_t *encapsulated_buffer;
?? ??? ?len ?= ((rndis_generic_msg_t *)encapsulated_buffer)->MessageLength;
?? ??? ?if(ctrl.bmRequestType & UE_DIR_IN){
?? ??? ??? ?dwc_usb3_pcd_ep0_data_4class_stage(pcd, len < wlength ? len : wlength);
?? ??? ?}else {
?? ??? ??? ?dwc_usb3_pcd_ep0_data_4class_stage(pcd, wlength);
?? ??? ?}
? ? }
否则在收到class 类控制传输的setup包时,不会准备好接收或者发送接下来的data段的。
发送的数据会在接收到rndis命令的时候准备好,具体来说
在dwc_usb3_handle_ep0函数的EP0_OUT_DATA_PHASE分支下面,由rndis_ep0_recv函数完成。
else {
LOG_USB_DEBUG("OUT COMPLETE\n");
/* This sets ep0state = EP0_IN/OUT_WAIT_NRDY */
ep0_complete_request(pcd, req, desc, 0);
rndis_ep0_recv();
}
这么操作之后,整个rndis的枚举就能顺利跑完了。
接下来把我们的板子连接到电脑,电脑会试图往外发网络包:
?上图是wireshark在电脑端抓包的数据,把bulk端口的数据给过滤出来,可以看到只有电脑往外在发数据,这是因为我们现在fpga还没有支持eth模块,等到eth模块添加之后,连上网线,我们就可以测试网路通信了。
|