我有一个基于英特尔Apollo Lake的系统,它有一个USB双角色端口。我想使用linux USB gadget functionFs框架来创建USB设备。DWC3 USB设备控制器具有USB3.0超高速功能。然而,我希望设备将自己表示为只有USB 2.0高速功能。
我已经搜索了几个小时的linux内核源代码,还没有找到一种不修改内核就能实现这一点的方法。基本上,我想将bcdUSB设置为0x0200。configFs有一个bcdUSB选项,但它似乎在以后会被覆盖。我相信它是从here改写的
if (gadget_is_superspeed(gadget)) {
if (gadget->speed >= USB_SPEED_SUPER) {
cdev->desc.bcdUSB = cpu_to_le16(0x0320);
cdev->desc.bMaxPacketSize0 = 9;
} else {
cdev->desc.bcdUSB = cpu_to_le16(0x0210);
}
} else {
if (gadget->lpm_capable)
cdev->desc.bcdUSB = cpu_to_le16(0x0201);
else
cdev->desc.bcdUSB = cpu_to_le16(0x0200);
}为了归档我想要的0x0200的价值,我必须使我的设备不能超高速,也不能支持LPM。对应的字段是usb_gadget结构中的max_speed和lpm_capable。如何在不更改内核的情况下从用户空间修改这些值?
configFs有一个max_speed设置,但它修改了usb_composite_driver结构中的字段,这似乎是不同的。对于支持LPM的设置,我什么也没有找到。
发布于 2021-05-14 17:48:43
我也有类似的需求。它认为它必须修改dwc3寄存器值。默认值为superspeed。驱动程序/usb/dwc3/gadget.c中的代码
if (DWC3_VER_IS_PRIOR(DWC3, 220A) &&
!dwc->dis_metastability_quirk) {
reg |= DWC3_DCFG_SUPERSPEED;
} else {
switch (speed) {
case USB_SPEED_LOW:
reg |= DWC3_DCFG_LOWSPEED;
break;
case USB_SPEED_FULL:
reg |= DWC3_DCFG_FULLSPEED;
break;
case USB_SPEED_HIGH:
reg |= DWC3_DCFG_HIGHSPEED;
break;
case USB_SPEED_SUPER:
reg |= DWC3_DCFG_SUPERSPEED;
break;
case USB_SPEED_SUPER_PLUS:
if (DWC3_IP_IS(DWC3))
reg |= DWC3_DCFG_SUPERSPEED;
else
reg |= DWC3_DCFG_SUPERSPEED_PLUS;
break;
default:
dev_err(dwc->dev, "invalid speed (%d)\n", speed);
if (DWC3_IP_IS(DWC3))
reg |= DWC3_DCFG_SUPERSPEED;
else
reg |= DWC3_DCFG_SUPERSPEED_PLUS;
}
}https://stackoverflow.com/questions/67004360
复制相似问题