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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值