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

news2025/1/6 19:33:57

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

  • 一、bug描述
  • 二、具体修改方法
    • 1. 找到内核源码位置并复制到其他目录
    • 2. Petalinux里面设置使用自定义内核源码
      • 1) 选第2个Linux Components Selection
      • 2) 选linux-kernel,回车,选择ext-local-src
      • 3) 设置External linux-kernel local source settings
    • 3.修改gadget驱动源码

一、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);
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔试题】【day22】

文章目录第一题(循环队列的元素个数)第二题(二叉排序树插入规则)第三题(线性探测的平均查找长度)第四题(关键字比较次数与初始序列无关的)第一题(循环队列的元素个数&…

m短波宽带通信系统的信道建模matlab仿真

目录 1.算法概述 1.1 Watterson信道模型理论简介 1.2 Nakagami信道模型 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 宽带短波信道的研究是设计宽带大容量短波通信的基础,但是传统的短波信道的研究仅限于窄带信号传输,这已经…

论文阅读-Whisper语音识别(OpenAI)

一、论文信息 论文名称:Robust Speech Recognition via Large-Scale Weak Supervision 代码地址:https://github.com/openai/whisper 官方博客:https://openai.com/blog/whisper 作者团队:OpenAI 二、介绍 Whisper是一个通用…

HAProxy实现负载均衡

目录 一、HAProxy介绍 二、环境准备 三、实验拓扑 四、HAProxy部署 五、配置HAProxy状态页面 一、HAProxy介绍 ha-proxy是一款高性能的负载均衡软件,主要是做7层负载均衡,也可以做4层负载均衡。因为其专注于负载均衡这一些事情,因此与ng…

8、如何使用FactoryBean向Spring容器中注册bean?

📫作者简介:zhz小白 公众号:小白的Java进阶之路 专业技能: 1、Java基础,并精通多线程的开发,熟悉JVM原理 2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线…

openEuler快速入门-openEuler命令行基础操作

系列文章目录 第一章 openEuler快速入门(一)-openEuler操作系统介绍 文章目录系列文章目录前言一、shell是什么二、Linux命令行操作技巧三、基础命令3.1、Linux命令分类3.2、目录和文件3.2.1 相对路径和绝对路径3.2.2 处理目录的常用命令ls:cd:pwd&…

tkinter绘制组件(36)——树状图

tkinter绘制组件(36)——树状图引言布局函数结构内容数据格式整体框架绘制元素与重绘宽度标识元素展开与闭合完整函数代码效果测试代码最终效果github项目pip下载结语引言 TinUI的第38个元素控件,也是TinUI-4.0-添加的第一个组件&#xff0c…

Rsync下行同步+inotify实时同步介绍和部署

一、Rsync(Remote Sync,远程同步) 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩&#xf…

2022世界杯结果预测,简单AI模型最有效?附代码!

2022世界杯冠军是谁?本文将为你揭晓一个利用简单AI模型得到的靠谱预测。 许多人称足球为“不可预测的比赛”,因为一场足球比赛有不同的因素可以改变最终比分。 这是真的……在某种程度上。 北大出版社,人工智能原理与实践 人工智能和数据科…

面试官:什么是伪共享,如何避免?

本文已收录到 GitHub AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 加入 Android 交流群。 前言 大家好,我是小彭。 在前面的文章里,我们聊到了 CPU 的高速缓存机制。…

【electron】判断当前进程是否是开发环境的五种方案(获取一些资源的路径)

文章目录导读需求开发环境判断是否是开发环境方案一:location.protocol方案二:全局变量__static方案三:全局变量process.resourcesPath方案四:全局变量process.env.WEBPACK_DEV_SERVER方案五:app.isPackaged获取配置目…

OS-process

process 什么是进程 进程是被加载到内存中、正在运行的程序;多个进程可能对于同一个程序、一个正在运行的OS中会有多个进程 进程是程序的一次执行过程,是操作系统分配资源的基本单位 作业等同于进程 进程的布局: 每个进程都有一个不同的…

内网渗透中最常见的十种漏洞分析总结

【环境搭建资料、工具包、全套视频…等籽料】私信聆取 以下信息是根据2020年和2019年为全球各种中型组织和企业完成的60多个渗透测试报告汇总而来的,在跳转到列表之前,让我们简要介绍一下全面的测试方法。 一、测试方法 目的是使用白盒(灰盒)方法在现场…

spirngboot项目.mvn/wrapper/maven-wrapper.properties‘ does not exist.

rm -rf ~ 命令后,项目出现一些问题,如下 执行命令: ./mvnw clean package -am -pl bistoury-dist -P$PROFILR -Dmaven.test.skip -Denforcer.skiptrue 报异常: starting to build bistoury agent Exception in thread "ma…

[附源码]java毕业设计同德佳苑物业管理系统论文

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

SpringBoot数据层解决方案/ 内置持久化解决方案JdbcTemplate使用/内置数据库H2使用以及RedisNoSql使用

写在前面: 继续记录自己的SpringBoot学习之旅,这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 3.4 数据层解决方案 3.4.1 使用项目 新建空项目&a…

redis的事务

Redis的事务:一次事务操作,改成功的成功,该失败的失败。 提交事务 如果遇见错误 成功的成功,失败的失败,不会回滚 先开启事务,执行一些列的命令,但是命令不会立即执行,会被放在一…

web分享会

文章目录前言平台1. 在线练习平台2. 自己搭建靶场3. CTF真题平台分享前言 个人的学习过程仅供参考。 个人情况 我是大二进的工作室,算是比较晚的了,工作室的师兄人也很好,我有问题也会去找他们。我是一位女生,非常欢迎师妹们加入&…

从购买云服务器开始到成功部署网站并且可以正常外网访问整个体系流程(从0到1的过程)

准备工作: 购买云服务器(阿里云或腾讯云都行),过程一样。购买域名,并做解析处理,通过域名访问网站(后面需要自行备案)。 云服务器一些基本配置处理: 用密码登录方式登录root用户到云服务器上 登录成功后&#xff0c…

MHDNet

发现一种性能更优的目标检测网络,不同的输入分辨率下,目标分布和检测头之间存在不同的匹配关系。基于这些有指导意义的发现,作者提出了一种基于检测头和目标分布之间匹配的轻量化交通目标检测网络,称为MHDNet。该模型在BDD100K数据…