USB IP核FPGA调试

Posted yuanyun_elber

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了USB IP核FPGA调试相关的知识,希望对你有一定的参考价值。

硬件修复上节提到的单字节读写问题后,就可以继续往下跑了。

我们需要把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模块添加之后,连上网线,我们就可以测试网路通信了。

以上是关于USB IP核FPGA调试的主要内容,如果未能解决你的问题,请参考以下文章

USB IP核FPGA调试

USB IP核FPGA调试

USB IP核FPGA调试

USB IP核FPGA调试

USB IP核FPGA调试

USB IP核FPGA调试