mini2440 usb device controller 驱动的分析--gadget设备(四)---class driver

本文深入探讨了Linux USB gadget驱动中的loopback功能实现。在设备枚举过程中,loopback功能在set interface阶段通过loopback_set_alt启用,enable_loopback函数配置了输入和输出端点。当主机发送数据时,设备接收到数据并调用loopback_complete回调函数,该函数将数据回传给主机。同时,回调函数还处理了发送完成的情况,为继续接收主机数据准备新的读取请求。设备部分的分析完成后,文章将进一步分析主机端的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这节分析loopback具体功能是怎么实现的。

loopback功能的入口在这里。

首先,在枚举的时候,有这样一段:

switch  (ctrl->bRequest) {
case USB_REQ_SET_INTERFACE:
		if (ctrl->bRequestType != USB_RECIP_INTERFACE)
			goto unknown;
		if (!cdev->config || w_index >= MAX_CONFIG_INTERFACES)
			break;
		f = cdev->config->interface[intf];
		if (!f)
			break;
		if (w_value && !f->set_alt)
			break;
		value = f->set_alt(f, w_index, w_value);
		break;


在set interface阶段,会调用f->set_alt函数。对应于loopback的function,调用的就是loopback_set_alt,在这个函数中会调用enable_loopback。也就是说loopback是在set interface 时候使能的。

static int
enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop)
{
	int					result = 0;
	const struct usb_endpoint_descriptor	*src, *sink;
	struct usb_ep		
<think>好的,我需要帮助用户配置RV1106的嵌入式Linux系统以支持USB-ECM网卡。首先,用户之前询问过如何将USB控制器设置为Host模式并使用CDC ECM驱动连接4G模块,现在的问题更具体,是配置系统支持USB-ECM网卡。我需要确保回答覆盖所有必要步骤,并且与之前的建议一致,同时补充可能的遗漏点。 首先,回顾之前的回答,已经涉及了内核配置、驱动加载、网络设置等方面。现在用户可能希望更详细地了解如何确保系统支持USB-ECM,特别是在嵌入式环境中的配置。可能需要考虑内核编译选项、设备树配置、模块加载以及网络管理工具的使用。 接下来,我需要确认USB-ECM需要哪些内核选项。CDC ECM属于内核的USB网络驱动部分,可能需要启用CONFIG_USB_NET_CDCETHER。另外,确保DWC3控制器驱动正确配置,支持Host模式。设备树部分可能需要检查USB节点的配置,比如PHY设置和模式切换。 用户可能没有提到的是udev规则或者自动加载模块的配置,这在嵌入式系统中很重要。此外,网络接口的命名和持久化可能有需求,比如使用Predictable Network Interface Names还是自定义名称。 另外,需要考虑USB供电问题,尤其是Type-C接口的配置是否正确,比如CC引脚电阻是否设置成Host模式。如果硬件设计有误,可能导致USB设备无法识别。 还需要指导用户如何测试USB-ECM设备是否被正确识别,使用dmesg和lsusb命令检查设备信息。网络配置部分可能需要静态IP或DHCP,以及路由和DNS的设置。如果用户遇到问题,如何排查,比如检查驱动是否加载,模块依赖是否满足,或者是否有固件需要加载。 最后,可能需要考虑系统启动时自动配置网络接口,例如通过/etc/network/interfaces或systemd-networkd。另外,如果有防火墙设置,可能需要调整规则允许流量通过。 总结下来,回答需要包括内核配置、设备树检查、驱动加载、网络配置、自动化和故障排除步骤,确保用户能够全面了解并实施配置。</think>在RV1106的嵌入式Linux系统中配置USB-ECM网卡支持,需从内核驱动、硬件验证到网络配置多环节处理。以下是具体实现流程: --- ### **一、内核驱动配置** #### 1. 确认内核版本与补丁 - 要求内核版本 ≥ 4.19(建议使用Rockchip官方BSP) - 若使用旧内核,需确认已打补丁支持`cdc_ether`驱动 #### 2. 内核编译选项 ```bash make ARCH=arm menuconfig ``` 关键配置路径: ```plaintext Device Drivers → USB support → USB Physical Layer drivers <*> NOP USB Transceiver Driver # 确保USB PHY基础驱动启用 → USB Gadget/OTG Support <*> DWC3 Dual Role Controller # 启用DWC3双角色控制器 [*] DWC3 PCI support # 若使用PCI接口需启用 → Network device support → USB Network Adapters <M> CDC Ethernet support (smart devices) # 编译为模块(cdc_ether.ko) <*> Host for RNDIS and ActiveSync devices # 可选(部分4G模块需要) ``` #### 3. 设备树配置 修改设备树文件(如`rv1106.dtsi`): ```dts &usb_host0_ehci { status = "okay"; #address-cells = <1>; #size-cells = <0>; // 强制Host模式(TypeC双角色需明确模式) dr_mode = "host"; }; &usb2phy_grf0 { status = "okay"; }; &u2phy0 { status = "okay"; u2phy0_host: host-port { status = "okay"; phy-supply = <&vcc5v0_host>; }; }; ``` --- ### **二、硬件验证** #### 1. TypeC端口模式 - **CC引脚电阻**:Host模式下需在TypeC接口配置5.1kΩ下拉电阻(参考USB TypeC标准) - **电压输出**:测量VBUS是否输出5V(未供电会导致设备无法枚举) #### 2. 4G模块兼容性测试 ```bash # 插入模块后查看设备信息 lsusb -tv # 预期输出应包含CDC-ECM类设备描述符: # Class=Communications, Subclass=Abstract (modem), Protocol=AT-commands ``` --- ### **三、驱动加载与接口验证** #### 1. 动态加载驱动模块 ```bash # 加载依赖链(DWC3控制器→USB核心→CDC驱动) modprobe dwc3 modprobe dwc3-rockchip modprobe usbnet # USB网络核心驱动 modprobe cdc_ether # ECM协议驱动 # 检查模块加载状态 lsmod | grep -E 'dwc3|cdc_ether' ``` #### 2. 设备枚举日志分析 ```bash dmesg | tail -n 30 # 成功标志: # cdc_ether 1-1:1.0 eth1: register 'cdc_ether' at usb-xhci-hcd.1.auto-1, CDC Ethernet Device ``` --- ### **、网络接口配置** #### 1. 接口命名规则(可选) 禁用Predictable Network Interface Names: ```bash # 在bootargs添加: net.ifnames=0 # 或创建udev规则: echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="cdc_ether", NAME="ecm0"' > /etc/udev/rules.d/70-usb-ecm.rules ``` #### 2. DHCP自动获取IP ```bash udhcpc -i ecm0 -q -n # 或使用systemd-networkd: [Match] Name=ecm0 [Network] DHCP=yes ``` #### 3. 手动静态IP配置 ```bash ifconfig ecm0 192.168.0.10 netmask 255.255.255.0 up route add default gw 192.168.0.1 echo "nameserver 114.114.114.114" > /etc/resolv.conf ``` --- ### **五、高级调试技巧** #### 1. USB协议层抓包 ```bash # 安装usbmon工具 apt-get install usbmon # 捕获USB通信 cat /sys/kernel/debug/usb/usbmon/1u > /tmp/usbmon.log ``` #### 2. 内核调试信息输出 ```bash # 启用动态调试(需内核配置CONFIG_DYNAMIC_DEBUG) echo -n 'file cdc_ether.c +p' > /sys/kernel/debug/dynamic_debug/control dmesg -wH | grep cdc_ether # 实时观察驱动交互细节 ``` #### 3. 电源管理问题排查 若模块频繁断开: ```bash # 禁用USB自动挂起 echo on > /sys/bus/usb/devices/usb1/power/level # 或修改内核启动参数添加usbcore.autosuspend=-1 ``` --- ### **六、自动化部署方案** #### 1. 固件打包增强 在Buildroot/Yocto中: ```makefile # 内核模块自动加载 BR2_ROOTFS_OVERLAY += "overlay/" # overlay/etc/modules-load.d/cdc-ecm.conf内容: cdc_ether ``` #### 2. 4G模块初始化脚本 ```bash #!/bin/sh # 初始化ECM接口并配置APN(示例:移远EC25系列) echo -e "AT+CGDCONT=1,\"IP\",\"cmnet\"\r\n" > /dev/ttyUSB2 sleep 2 ifup ecm0 ``` --- ### **关键验证点总结** 1. **硬件层** - `cat /sys/class/power_supply/usb/online` 返回1(确认VBUS供电正常) - 示波器验证USB DP/DM信号完整性 2. **驱动层** - `cat /sys/kernel/debug/usb/devices` 显示ECM设备绑定正确驱动 3. **网络层** - `ethtool -i ecm0` 显示驱动版本为`cdc_ether` - `ping -I ecm0 8.8.8.8` 丢包率应低于1% 遇到兼容性问题时,可尝试在设备树中调整USB PHY参数(如`dr_mode`或`snps,dis_u2_susphy_quirk`)。对于定制4G模块,可能需要向`cdc_ether`驱动添加特定VID/PID支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值