【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);
}

修改后的效果如下图

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

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

  1. 【Linux】在Xilinx平台上实现UVC Gadget(1)

    [Linux]在Xilinx平台上实现UVC Gadget(1) 前言:关于UVC 一.创建Petalinux工程并修改设备树 1) 创建一个基本的petalinux工程 2) 配置sstate和do ...

  2. 轻松实现各种文档格式转换,doc转pdf、doc转png图片、pdf转png图片,可以实现Windows、Linux、MacOS平台上部署(附源码和说明)

    轻松实现各种文档格式转换,doc转pdf.doc转png图片.pdf转png图片,可以实现Windows.Linux.MacOS平台上部署,可以通过命令行.shell脚本.python等方式调用. 实 ...

  3. linux ftp 登录慢,linux中vsftpd登录,上传下载文件慢解决办法linux操作系统 -电脑资料...

    vsftpd登录慢主要是nameserver #定义DNS服务器的IP地址没有设置了,这样我们只要设置或更新一下nameserver即可解决了, 在使用vsftpd的过程中,一直以来都有一个问题就是在 ...

  4. amd平台运行linux,在amd64平台上安装linux的经历

    在amd64平台上安装linux的经历 (2011-08-29 01:36:25) 标签: 杂谈 在amd64平台上安装linux的经历在amd64平台上安装linux的经历 硬件:Althon 64 ...

  5. hsf传输文件到linux,x86 平台上的 Linux到 SPARC 平台上的 Solaris的说明

    x86平台上的Linux到SPARC平台上的Solaris的说明 关于本次移植的说明 由于目前没有Solaris开发环境,移植过程,主要是参考本文档的说明.具体是对函数调用.字节序列.数据类型.内存对 ...

  6. 部署在SAP云平台上的应用, 该如何解决跨域问题Cross Domain

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  7. [调试记录]3288 7.1平台上移植美格 SLM790 4G模块

    [调试记录]3288 7.1平台上移植美格 SLM790 4G模块 一 驱动配置 1.1 PPP 配置 需要配置 Android 内核来支持 PPP 功能,按照以下步骤来配置 PPP 选项 Devic ...

  8. pureftpd mysql 失败_pureftpd传输速度慢与传送文件失败问题以及不能上传文件/目录的解决办法...

    pureftpd其实是一款不错文件上传功能了,但是如果说我们开了主动模式之后你会发现它传输速度慢与传送文件失败这些问题了,下面我来给各位介绍一个解决办法. pureftpd本身传输文件和反映速度可以, ...

  9. linux xen 管理,ARM平台上运行Xen 可同时管理linux和VxWorks

    Xen项目管理程序从上个世纪90年代就已经在剑桥大学里开始进行,到了2002年项目开源.如今它是最流行的开源管理程序之一,可以在云计算上使用,Xilinx和DornerWorks将这种虚拟化平台应用在 ...

最新文章

  1. Flask之Cookie与Session
  2. 2018 年最值得期待的学术进展——致人工智能研究者们的年终总结
  3. mac安装mysql修改密码_Mac下安装MySQL 5.7.28并且修改root密码-Go语言中文社区
  4. goto语句_11. Go语言流程控制:goto 无条件跳转
  5. python中解决死锁的方法
  6. python第六周实验_第六周实验四
  7. jstree中json data 的生成
  8. python网址编码转换_刚学python,抓中文网页遇到编码的问题,怎么转换也不行……...
  9. 餐厅点餐系统app总结
  10. 电子元器件封装知识大全(内含AD封装库下载资料)
  11. 2020年acwifi拆过的无线路由器配置汇总
  12. 前端软件开发短期培训需要多长时间
  13. 大物 磁场对载流导线的作用 中dl转化为dx
  14. 让WindowsXP SP3支持64G内存
  15. 带计算机来学校检讨,校园检讨书
  16. 回调函数,事件管理器
  17. Quorum快速部署
  18. 软件腐化的七个特征之复杂性、重复性、晦涩性(设计模式原则的反面) (《敏捷软件开发》读书总结第三篇)
  19. MixIO平台初体验
  20. 修改latex表格内容无衬线字体

热门文章

  1. 【学习】笔记本电脑重新安装系统win10
  2. 品牌数字化转型|借势营销节点,3 招解锁品牌营销力
  3. 和刘备相关的人(九 )
  4. 第十四周 项目1 - 验证算法
  5. 【狂神说:秦疆】SpringMVC笔记
  6. oracle实例由,Oracle 数据库的实例由( )组成
  7. python boxplot的使用方法
  8. Android电池信息(Battery information)
  9. tig只看某个作者的提交
  10. Istio Egress Gateway出口流量管理