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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FPGA是一种可编程逻辑器件,具有灵活性高、可配置性强、并行性强等特点。要在FPGA上添加IP核并启用USB功能,通常需要以下几个步骤: 首先,选择合适的IP核IP核是预设计的功能模块,用于实现特定的功能。在这种情况下,我们需要选择适用于USB功能的IP核,常见的有USB控制器IP核USB PHY IP核等。这些IP核提供了实现USB协议和物理层接口所需的硬件逻辑和电路。 接下来,将选定的IP核集成到FPGA设计中。这包括将IP核的源代码或电路图等文件添加到FPGA开发工具的项目中,然后根据需要进行定制和连接。此外,还需要进行IP核的参数配置,如设定USB的速率、协议类型等。 然后,进行FPGA设计的逻辑连接与布线。在将IP核添加到FPGA设计后,需要确保IP核与其他逻辑电路之间的正确连接。这通常需要在FPGA开发工具中进行逻辑设计和布线操作,确保信号路径和时序满足USB协议的要求。 最后,生成并下载到FPGA设备中。在整个设计过程结束后,需要将FPGA设计生成可执行的比特流文件,并将其下载到目标FPGA设备中。这可以通过FPGA开发工具提供的编译、合成和下载功能来实现。 通过以上步骤,我们可以在FPGA上成功添加IP核并启用USB功能。这样,FPGA就具备了USB接口,可以与其他USB设备进行通信和数据传输。这对于许多应用场景,如工业自动化、医疗设备、通信设备等都具有重要意义。 ### 回答2: FPGA添加IP核启用USB是一种常见的应用场景。FPGA是一种可编程逻辑器件,可以通过配置实现不同的功能。而IP核则是包含特定功能的模块,可以用于扩展FPGA的功能。 要启用USB功能,首先需要在FPGA中添加支持USBIP核。这可以通过使用FPGA厂商提供的开发工具来完成,比如Xilinx的Vivado或Altera的Quartus。通过这些工具,可以从IP库中选择合适的USB IP核,并将其添加到FPGA设计中。 添加完IP核后,需要对其进行配置。这涉及到设置IP核的参数,如USB协议类型、数据传输速率等。可以根据具体的应用需求来配置IP核的各项参数。 配置完成后,需要将整个设计综合并生成比特流文件。比特流文件是对FPGA设计的实际配置信息的描述,可以用于将设计加载到FPGA中。加载比特流文件可以利用FPGA开发板上的烧录接口,将比特流文件通过USB或其他接口加载到FPGA中。 一旦完成加载,FPGA便可开始使用USB功能。通过与外部USB设备通信,可以实现一系列的应用,如USB输入输出、USB通信等。 总的来说,要实现FPGA中的USB功能,需要添加相应的IP核,并进行配置和综合生成比特流文件,最后将比特流文件加载到FPGA中。通过这样的步骤,可以实现FPGAUSB功能扩展,以满足各种应用需求。 ### 回答3: FPGA是一种可编程逻辑设备,它可以使用硬件描述语言(HDL)对其内部的数字电路进行编程。为了向FPGA添加USB功能,可以通过添加USB IP核来实现。 IP核是一种可重用的硬件片段,它可以在FPGA中实现特定的功能。对于添加USB功能的FPGA设计,可以使用已经开发好的USB IP核。这个IP核包含了USB控制器和接口电路等必要的硬件组件,可以与外部USB设备进行通信。 添加IP核需要一定的步骤,首先需要在FPGA设计工具中导入所需的USB IP核。然后,将IP核实例化并连接到FPGA设计中的其他模块。这样,FPGA就具备了与USB设备进行数据传输的能力。 在设计过程中,还需要配置USB IP核的参数,如操作模式、数据传输速率等。这些参数根据具体应用的需求进行设置。配置完成后,可以将设计逻辑编译,并通过下载到FPGA中进行验证和测试。 启用USB功能后,FPGA可以与外部USB设备进行通信。例如,可以使用USB接口与计算机或其他USB设备进行数据交换。通过编程控制,可以实现USB数据的读取和写入,以及实时数据传输。 总之,通过添加USB IP核,可以使FPGA具备USB功能,实现与USB设备的通信。这为FPGA的应用提供了更多的扩展和连接方式,可以满足更多的应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值