首页 > 其他分享 >Android设备之间UVC Gadget bulk模式无法正常打开问题

Android设备之间UVC Gadget bulk模式无法正常打开问题

时间:2024-09-03 10:26:30浏览次数:11  
标签:UVC Gadget state bulk STATE video Android uvc v4l2

平台:RK3588
Android版本:12
内核版本:Linux 5.10.66

问题: 通过usb gadget枚举uvc设备后,使用bulk传输,连接windows PC可用正常打开预览,连接到另外Android Host设备无法正常打开。如果使用isochronous方式传输则都正常。

分析:连接到PC(windows)上可以正常出图,但是连接到另外一个RK3588设备,可以正常识别到设备,也可以用v4l2-ctl读到正常配置信息,但是打开对应video节点取流时阻塞住了,从另一端RK3588(device)查看uvc gadget应用端 ioctl执行VIDIOC_STREAMON报错: UVC: Unable to start streaming No such device (19). 另外接了一个bulk传输的usb摄像头到rk3588上是正常的,说明问题出在uvc gadget device驱动。

既然报错在VIDIOC_STREAMON,则从驱动代码中对应方法入手排查:

kernel-5.10/drivers/usb/gadget/function/uvc_v4l2.c

static int
uvc_v4l2_streamon(struct file *file, void *fh, enum v4l2_buf_type type)
{
        struct video_device *vdev = video_devdata(file);
        struct uvc_device *uvc = video_get_drvdata(vdev);
        struct uvc_video *video = &uvc->video;
        int ret;

        //通过打印知道在此处判断不是UVC_STATE_CONNECTED状态就直接返回错误
        if (uvc->state != UVC_STATE_CONNECTED)
            return -ENODEV;

        /* Enable UVC video. */
        ret = uvcg_video_enable(video, 1);
        if (ret < 0)
                return ret;

        /*
         * Alt settings in an interface are supported only
         * for ISOC endpoints as there are different alt-
         * settings for zero-bandwidth and full-bandwidth
         * cases, but the same is not true for BULK endpoints,
         * as they have a single alt-setting.
         *
         * For ISOC endpoints, Complete the alternate setting
         * selection setup phase now that userspace is ready
         * to provide video frames.
         */
        if (!usb_endpoint_xfer_bulk(video->ep->desc)) {
                uvc_function_setup_continue(uvc);
        }

        uvc->state = UVC_STATE_STREAMING;

        return 0;
}

在以上代码段加打印调试知道是此时stream on走到这里时 uvc->state 值已经是 UVC_STATE_STREAMING,直接返回 -EINVAL,而对比isoc传输stream on时是UVC_STATE_CONNECTED状态,然后通过连接不同host的log对比发现bulk模式连接 Android设备上的时候就会走了1次 uvc_function_set_alt,然后stream on时又会执行一次,  此时就已经把 uvc->state 改成了 UVC_STATE_STREAMING:

对应源码中就是在此处更改了uvc->state的值:

kernel-5.10/drivers/usb/gadget/function/f_uvc.c

以至于后面走到uvc_v4l2_streamon时就判断uvc->state != UVC_STATE_CONNECTED 直接  return -ENODEV。

解决方法:修改uvc_v4l2_streamon中针对bulk模式时的判断逻辑,在 uvc->state == UVC_STATE_DISCONNECTED 才 return -ENODEV。

--- a/kernel-5.10/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/kernel-5.10/drivers/usb/gadget/function/uvc_v4l2.c
@@ -200,8 +200,15 @@ uvc_v4l2_streamon(struct file *file, void *fh, enum v4l2_buf_type type)
        if (type != video->queue.queue.type)
                return -EINVAL;

-       if (uvc->state != UVC_STATE_CONNECTED)
-               return -ENODEV;
+       //sheldon add begin: for bulk mode
+       if (!usb_endpoint_xfer_bulk(video->ep->desc)) {
+               if (uvc->state != UVC_STATE_CONNECTED)
+                       return -ENODEV;
+       } else {
+               if (uvc->state == UVC_STATE_DISCONNECTED)
+                       return -ENODEV;
+       }
+       //sheldon add end

具体连接Android平台为什么走的流程不一样还不清楚,可能和 https://www.usbzh.com/article/detail-166.html 描述的类似,连接Linux主机时就进行了参数配置,而Windows在打开摄像头的时候才进行相关参数的获取,所以UVC设备在连接Windows和Linux时是有区别的。

标签:UVC,Gadget,state,bulk,STATE,video,Android,uvc,v4l2
From: https://www.cnblogs.com/blogs-of-lxl/p/18393324

相关文章

  • Android架构组件:MVVM模式的实战应用与数据绑定技巧
    Android应用开发已经逐渐变得高效且模块化,MVVM(Model-View-ViewModel)设计模式与Android架构组件的结合,无疑提升了开发者的生产力。在本指南中,我们将详细介绍MVVM模式的概念,如何在Android中实现MVVM,并结合实际操作案例让读者更好地理解与运用数据绑定技巧。1.MVVM模式......
  • Android Glide加载图片时,基于图片宽高比自动伸缩ImageView高度
    ImageView布局<ImageViewandroid:id="@+id/iv"android:layout_width="match_parent"android:layout_height="wrap_content"/>代码实现GlideUtil.java/***加载图片,支持高度伸缩*@paramcontext上下文......
  • Android协程的使用场景
    importkotlinx.coroutines.Dispatchersimportkotlinx.coroutines.delayimportkotlinx.coroutines.withContextsuspendfunallPlants():List<Plant>=withContext(Dispatchers.Default){delay(1500)valresult=sunflowerService.getA......
  • 如果我想在Android应用中实现资源的自动管理,除了try-with-resources语句,还有哪些设计
    在Android应用开发中,除了使用try-with-resources语句来实现资源的自动管理,还可以参考以下设计模式和最佳实践:1.**单例模式(Singleton)**:  -对于需要全局访问的资源,如数据库连接或共享的配置对象,可以使用单例模式来确保只有一个实例被创建,并在应用的整个生命周期中复用。2......
  • Android之电量优化
    目录1.减少不必要的网络请求2.优化位置服务3.优化后台任务4.优化图像和动画(界面渲染)5.避免后台服务常驻6.优化电量使用的监控在Android应用开发中,电量优化是一个非常重要的方面,因为用户对设备电量的敏感性很高。1.减少不必要的网络请求网络请求是耗电大户,尤......
  • android AccessibilityService合法合规采集大众点评app商店商品详情(2024-09-02)
    免责任声明:任何可操作性的内容与本人无关,文章内容仅供参考学习,如有侵权损害贵公司利益,请联系作者,会立刻马上进行删除。一、原理介绍1、打开大众点评app商店publicvoidopen_shop(Contextcontext,Stringshop_id){Stringurl="dianping://gcshopshell?shop......
  • android AccessibilityService合法合规增加小红书笔记曝光阅读量(2024-09-02)
    免责任声明:任何可操作性的内容与本人无关,文章内容仅供参考学习,如有侵权损害贵公司利益,请联系作者,会立刻马上进行删除。一、分析目前可增加曝光阅读流量渠道入口(完成)1.发现页打开小红书app选择顶部发现页(完成)2.搜索页打开小红书app点击右上角搜索,进入搜索结果页(完成)3.......
  • Android 9.0 内置google tts语音包功能实现
    1.前言 在9.0的产品开发中,在gms的相关项目对于文字转语音包功能不是内置功能,需要自己下载google的tts语音包,然后内置,在设置googletts语音包apk作为默认的tts语音引擎功能,接下来分析实现这个功能2.内置googletts语音包功能实现的核心类frameworks/base/core/java/androi......
  • mac M1 android studio 安装
    1、官网下载安装包https://developer.android.google.cn/studio?hl=en2、下载完成后,双击安装,中间需要配置代理这个,配置即可,然后点击下一步一直安装 3、到最后的时候会安装androidsdk报错,这个时候打开下面的地址看哪个时间最短,然后配置host代理https://ping.chinaz.com/dl.......
  • android 模拟器 内存修改, 用winshark 抓包,修改数据包
    1.其实我们自己也可以开发软件,对系统线性内存地址做归纳,2.对所有内存系统地址的值,做遍历。(很快,大概32GB2s~5s),如果能找到进程对应内存堆栈,大概100ms就可以查找完毕。参考摆脱八门神器,继续利用CE在安卓游戏做上帝https://zhuanlan.zhihu.com/p/470805411不需要root在Win......