【Linux】在Xilinx平台上实现UVC Gadget(2)- 解决dwc3驱动bug

2023-11-02

一、bug描述

前文详情见
【Linux】在Xilinx平台上实现UVC Gadget(1)

在usb插入电脑时,开发板会瞬间报错,报错信息如下。
经过仔细研究,dwc3驱动drivers/usb/dwc3/gadget.c存在一个bug

在usb gadget 枚举过程中,会触发不需要的假中断,为了避免这个问题,
需要清除DWC3_DCTL_KEEP_CONNECT位,禁用DWC3_GCTL_GBLHIBERNATIONEN休眠中断

[  111.954284] ------------[ cut here ]------------
[  111.958916] WARNING: CPU: 0 PID: 1095 at drivers/usb/dwc3/gadget.c:3305 dwc3_stop_active_transfer.part.0+0xc4/0xd0
[  111.969247] Modules linked in: vivid v4l2_tpg cec g_webcam g_ffs zocl(O) dmaproxy(O) al5e(O) al5d(O) allegro(O) mali(O) xlnx_vcu regmap_mmio uio_pdrv_genirq [last unloaded: zocl]
[  111.985179] CPU: 0 PID: 1095 Comm: irq/92-dwc3 Tainted: G           O      5.10.0-xilinx-v2021.1 #1
[  111.994210] Hardware name: ZynqMP ZCU104 RevC (DT)
[  111.998987] pstate: 60000085 (nZCv daIf -PAN -UAO -TCO BTYPE=--)
[  112.004985] pc : dwc3_stop_active_transfer.part.0+0xc4/0xd0
[  112.010549] lr : dwc3_stop_active_transfer.part.0+0x60/0xd0
[  112.016110] sp : ffff80001239bc10
[  112.019409] x29: ffff80001239bc10 x28: 0000000000000000 
[  112.024712] x27: ffff000002249380 x26: ffff00000224e880 
[  112.030015] x25: ffff800011140568 x24: ffff000004934300 
[  112.035319] x23: ffffffffffff3f00 x22: 0000000000000001 
[  112.040622] x21: 0000000000000000 x20: ffff000004934300 
[  112.045926] x19: ffff000002249000 x18: fffffdfffff27a08 
[  112.051229] x17: 0000000000000000 x16: 000000000000000e 
[  112.056532] x15: 0000000000000000 x14: 000006160d349044 
[  112.061836] x13: 00000000bd08a39e x12: 00000000000002d2 
[  112.067139] x11: 0000000000000000 x10: 00000000000008e0 
[  112.072443] x9 : ffff80001239bd10 x8 : ffff000004934c40 
[  112.077747] x7 : 000000000000b68d x6 : 0000000000000000 
[  112.083050] x5 : 0000000000000508 x4 : 0000000000000000 
[  112.088353] x3 : ffffffffffff3f08 x2 : 0000000000000000 
[  112.093657] x1 : ffff800012f00200 x0 : 00000000ffffff92 
[  112.098961] Call trace:
[  112.101395]  dwc3_stop_active_transfer.part.0+0xc4/0xd0
[  112.106611]  dwc3_stop_active_transfer+0x2c/0x40
[  112.111219]  dwc3_gadget_enter_hibernation.part.0+0xc0/0x2e0
[  112.116860]  dwc3_gadget_enter_hibernation+0x2c/0x40
[  112.121809]  dwc3_thread_interrupt+0x2f0/0xe5c
[  112.126246]  irq_thread_fn+0x2c/0x90
[  112.129811]  irq_thread+0x248/0x370
[  112.133285]  kthread+0x124/0x130
[  112.136505]  ret_from_fork+0x10/0x3c
[  112.140069] ---[ end trace 5d566d21e39ee647 ]---
[  112.253848] dwc3-xilinx ff9d0000.usb0: Failed to set power state to D3
[  112.260367] dwc3-pmu-regulator: failed to disable: -EIO
[  112.265585] dwc3 fe200000.dwc3: dwc3_gadget_enter_hibernation: 373 Failed to enable dwc3_pmu supply
[  112.274619] dwc3 fe200000.dwc3: Fail in handling Hibernation Interrupt

二、具体修改方法

1. 找到内核源码位置并复制到其他目录

find . -name "gadget.c"

可以看到第1行是我们要的源代码,但是不能直接修改这个文件,因为Petalinux会自动恢复

LeoWang@u16:/opt/work/uvc-demo/xilinx-zcu104-2021.1$ find . -name "gadget.c"
./build/tmp/work-shared/zynqmp-generic/kernel-source/drivers/usb/dwc3/gadget.c
./build/tmp/work-shared/zynqmp-generic/kernel-source/drivers/usb/cdns3/gadget.c
./build/tmp/work-shared/zynqmp-generic/kernel-source/drivers/usb/dwc2/gadget.c
./build/tmp/work/zynqmp_generic-xilinx-linux/u-boot-xlnx/v2021.01-xilinx-v2021.1+gitAUTOINC+41fc08b3fe-r0/git/board/samsung/common/gadget.c
./build/tmp/work/zynqmp_generic-xilinx-linux/u-boot-xlnx/v2021.01-xilinx-v2021.1+gitAUTOINC+41fc08b3fe-r0/git/drivers/usb/dwc3/gadget.c
./build/tmp/work/zynqmp_generic-xilinx-linux/u-boot-xlnx/v2021.01-xilinx-v2021.1+gitAUTOINC+41fc08b3fe-r0/git/drivers/usb/cdns3/gadget.c

把./build/tmp/work-shared/zynqmp-generic/kernel-source复制到其他文件夹
比如我的工程目录是

/opt/work/uvc-demo/xilinx-zcu104-2021.1

内核源码目录是

/opt/work/uvc-demo/xilinx-zcu104-2021.1/build/tmp/work-shared/zynqmp-generic/kernel-source

最后把内核复制并改名到这个目录

/opt/work/uvc-demo/kernel-source_leo_wang5.10

2. Petalinux里面设置使用自定义内核源码

petalinux-config

1) 选第2个Linux Components Selection

在这里插入图片描述

2) 选linux-kernel,回车,选择ext-local-src

在这里插入图片描述

3) 设置External linux-kernel local source settings

回车输入自己内核源码的目录
在这里插入图片描述

在这里插入图片描述

3.修改gadget驱动源码

打开文件drivers/usb/dwc3/gadget.c,找到函数
static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
在if (DWC3_VER_IS_PRIOR(DWC3, 188A)) 和dwc3_reset_gadget(dwc)之间加上下面这一段

//add by LeoWang 2022.11.20
if (dwc->has_hibernation) {
	reg = dwc3_readl(dwc->regs, DWC3_DCTL);
	reg &= ~DWC3_DCTL_KEEP_CONNECT;
	dwc3_writel(dwc->regs, DWC3_DCTL, reg);
	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
	reg &= ~DWC3_GCTL_GBLHIBERNATIONEN;
	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
}

修改后的效果如下图
在这里插入图片描述

Ps:
确认在v2021.2还存在这个bug,在2022.1已经增加了这个修复
也就是版本<=2021.2的,必须手动修改

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】在Xilinx平台上实现UVC Gadget(2)- 解决dwc3驱动bug 的相关文章

  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • Linux 中的电源管理通知

    在基于 Linux 的系统中 我们可以使用哪些方法 最简单的方法 来获取电源状态更改的通知 例如 当计算机进入睡眠 休眠状态等时 我需要这个主要是为了在睡眠前保留某些状态 当然 在计算机唤醒后恢复该状态 您只需配置即可获得所有这些事件acp
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • Linux命令列出所有可用命令和别名

    是否有一个 Linux 命令可以列出该终端会话的所有可用命令和别名 就好像您输入 a 并按下 Tab 键一样 但针对的是字母表中的每个字母 或者运行 别名 但也返回命令 为什么 我想运行以下命令并查看命令是否可用 ListAllComman
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 确保 config.h 包含一次

    我有一个库项目 正在使用 Linux 中的 autotools 套件移植到该项目 我对自动工具很陌生 本周 我已经了解了其操作的基础知识 我有一个关于如何保留内容的问题config h免遭重新定义 我惊讶地发现生成的config h文件也没
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 如何查明 Ubuntu 上安装了哪个版本的 GTK+?

    我需要确定 Ubuntu 上安装了哪个版本的 GTK 男人似乎不帮忙 这个建议 https stackoverflow com a 126145 会告诉您安装了哪个 2 0 的次要版本 不同的主要版本将具有不同的包名称 因为它们可以在系统上
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC

随机推荐

  • 开机后黑屏看不到桌面_电脑开机后黑屏不显示桌面解决方法

    方法一 设置原因的解决办法 1 开机后如果不显示桌面的图标 你就在桌面上点击右键 查看 显示桌面图标 这样你的桌面上的图标就会出现了 桌面功能也就正常了 2 如果你的问题是不显示图标也不显示任务栏的话 你就按住键盘上的esc shift c
  • 蓝桥杯官网练习题(0的个数)

    问题描述 给定一个正整数 n 请问 n 的十进制表示中末尾总共有几个 0 输入格式 输入一行包含一个正整数 n 输出格式 输出一个整数 表示答案 样例输入 20220000 样例输出 4 评测用例规模与约定 对于所有评测用例 1 lt n
  • 解决ThinkPad E580因AMD显卡导致系统崩溃的问题

    前言 由于着急解决问题 毕竟是常用电脑 而且现在也没法去修或者换电脑 修不好就真没用的了 所以基本全程没图 最后对问题原因有个猜测 如题 可能是因为AMD显卡相关程序导致的 如果有人知道具体原因请指点一下 对问题原因的猜测依据和文中一部分图
  • 双系统grub引导时,出现error: file '/boot/vmlinuz-xxx-xxx-xxx' not found的解决方法

    晚上本想修改一下grub cfg文件 去掉多余的引导项 没成想出现如题之尴尬局面 一番度娘之后终解决 下面是解决方法 Note 在grub下 注意提示按c进入grub命令行模式 首先需要确定你的ubutun安装到哪个硬盘哪个区 1 1 可以
  • 从零开始搭建物联网平台(三)数模设计

    首先 我们先从数模设计开始 这是一个系统的核心和精髓 决定了系统的架构和扩展控件 ETCloud的数模共有22张表 三个模块 一 用户模块 用户模块主要由企业表 用户表 角色表 权限表构成 1 数据权限 用户共分为三大类 model use
  • 力扣算法题解析

    一 278题 第一个错误的版本 难度 简单 1 题目描述 你是产品经理 目前正在带领一个团队开发新的产品 不幸的是 你的产品的最新版本没有通过质量检测 由于每个版本都是基于之前的版本开发的 所以错误的版本之后的所有版本都是错的 假设你有 n
  • stm32Cubemx:串口的空闲中断和接收中断------stm32f407zgt6

    介绍串口的接收中断与空闲中断 这两种中断都是在串口进行接收时可能会发生的中断 串口接收中断即每当串口完成一次接收之后触发一次中断 在 STM32 中相应的中断处理函数为 USARTx IRQHandler 中断回调函数为 HAL UART
  • 2023数据要素专题研究报告

    数据要素是实际参与社会生产活动的 完成确权的数据资源 数字化的文本 图形等数据经过权属确定后即为数据资产 再经过数据处理 分析后 形成数据产品并参与社会生产经营 对其他生产要素赋能并发挥数据自身价值 完成数据的价值闭环 根据国务院印发的 关
  • Neo4j CQl语句(持续更新)

    1 清空所有数据 MATCH n OPTIONAL MATCH n r DELETE n r 2 删除一个节点及其所有的关系 MATCH r WHERE id r 11 DETACH DELETE r 3 删除一个节点 DELETE 通过属
  • Mac Safari 此连接非私人连接

    1 问题 连接公司vpn的时候 Mac弹出此连接非私人连接 点击访问此网站后输入密码将证书手动设为可信后 又弹出了此连接非私人连接 之后进入了无限循环无论怎样都无法访问该网页 2 解决方案 2 1 点击页面上查看此证书 记住证书名字 可以看
  • 自制GUI

    包含了 sqlmap GUI Xray GUI dirmap GUI
  • selenium测试框架快速搭建(UI自动化测试)

    一 介绍 selenium目前主流的web自动化测试框架 支持多种编程语言Java pythan go js等 selenium 提供一系列的api 供我们使用 因此在web测试时我们要点页面中的某一个按钮 那么我们只需要获取页面 然后根据
  • js控制获得焦点与失去焦点样式

    function focusInput focusClass normalClass var elements document getElementsByTagName input for var i 0 i lt elements le
  • Vue项目保存代码之后页面自动更新

    Vue项目保存代码之后页面自动更新 想要在代码中保存之后 页面自动刷新 命令行敲如下代码 npm install webpack dev server 下载了这个东西就不用每次都手动刷新了 我也不知道这个是干嘛的 留在以后研究研究
  • Chromium OS autotest

    autotest三种主要测试手段 直接调用系统命令 相当于直接运行shell命令 通过dbus进行method call 通过加载插件到browser的方式 运行js代码 以js代码来调用C 方法 通过extension来运行js代码 目的
  • XSS闯关——第五关:level5

    第五关 level5 输入语句测试 gt 观察源代码发现字符被替换 把部分字符换成大写尝试 gt 一样的结果 采用html事件方法 失败 同样是字符被替换 使用伪链接方式假造一个超链接尝试 gt a href link a 点击后执行脚本
  • Laravel Collection 常用方法(1)

    我的个人博客 逐步前行STEP 1 first 返回集合第一个通过指定测试的元素 collect 1 2 3 4 gt first 1 collect 1 2 3 4 gt first function value key return v
  • 深度学习deep learning

    一 简介 深度学习是包含多个隐层的机器学习模型 核心是基于训练的方式 从海量数据中挖掘有用信息 实现分类与预测 早期的深度学习模型 编码器 循环神经网络 深度置信网络 卷积神经网络 衍生模型 堆叠降噪自编码器 稀疏自编码器 降噪自编码器 深
  • mysql 集成测试_使用Go进行集成测试的MySQL Docker容器

    使用Go进行集成测试的MySQL Docker容器 原文链接 https itnext io mysql docker container for integration testing using go f784b70a03b 作者 Mi
  • 【Linux】在Xilinx平台上实现UVC Gadget(2)- 解决dwc3驱动bug

    Linux 在Xilinx平台上实现UVC Gadget 2 解决dwc3驱动bug 一 bug描述 二 具体修改方法 1 找到内核源码位置并复制到其他目录 2 Petalinux里面设置使用自定义内核源码 1 选第2个Linux Comp