以模块方式加载 UVC 驱动

配置模块编译

修改 kernel 的默认 config 文件:

CONFIG_USB_VIDEO_CLASS=m

高通平台通过 BOARD_VENDOR_KERNEL_MODULES 变量安装 ko 文件到文件系统。

BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/uvcvideo.ko

修改 init.target.rc 脚本,配置开机完成后自动插入模块。

on property:sys.boot_completed=1insmod /vendor/lib/modules/uvcvideo.ko

验证及问题解决

重新编译 android,升级重新开机:

查看内核模块:

sdm845:/ $ lsmod
Module                  Size  Used by
wlan                 7729152  0
snd_soc_sdm845        151552  0
snd_soc_wcd934x       425984  1 snd_soc_sdm845
swr_wcd_ctrl           32768  1 snd_soc_wcd934x
snd_soc_wcd_mbhc       81920  1 snd_soc_wcd934x
snd_soc_wcd9xxx        73728  1 snd_soc_wcd934x
snd_soc_wsa881x        53248  1 snd_soc_sdm845
wcd_core              143360  5 snd_soc_sdm845,snd_soc_wcd934x,snd_soc_wcd_mbhc,snd_soc_wcd9xxx,snd_soc_wsa881x
snd_soc_wcd_spi        28672  0
wcd_dsp_glink          24576  1
pinctrl_wcd            16384  0
msm_11ad_proxy         32768  0

手动插入模块:

sdm845:/ # insmod /vendor/lib/modules/uvcvideo.ko
insmod: failed to load /vendor/lib/modules/uvcvideo.ko: No such file or directory

发现 uvcvideo.ko 模块没有加载,检查 kernel log:

02-09 11:12:16.089     0     0 W uvcvideo: Unknown symbol vb2_vmalloc_memops (err 0)

判断 uvcvideo.ko 模块依赖其他模块未正确加载,查看对应的 Kconfig 文件:

 config USB_VIDEO_CLASStristate "USB Video Class (UVC)"depends on VIDEO_V4L2select VIDEOBUF2_VMALLOC---help---Support for the USB Video Class (UVC).  Currently only videoinput devices, such as webcams, are supported.For more information see: <http://linux-uvc.berlios.de/>

uvcvideo.ko 依赖 VIDEO_V4L2 和 VIDEOBUF2_VMALLOC,显然 VIDEO_V4L2 已经加载了,搜索 VIDEOBUF2_VMALLOC 对应模块。

drivers/media/v4l2-core/Makefile:39:obj-$(CONFIG_VIDEOBUF2_VMALLOC) += videobuf2-vmalloc.o

搜索 videobuf2-vmalloc 模块:

$ find out -name "videobuf2-vmalloc*"
out/target/product/qssi/obj/kernel/msm-4.9/.tmp_versions/videobuf2-vmalloc.mod
out/target/product/qssi/obj/kernel/msm-4.9/drivers/media/v4l2-core/videobuf2-vmalloc.mod.o
out/target/product/qssi/obj/kernel/msm-4.9/drivers/media/v4l2-core/videobuf2-vmalloc.o
out/target/product/qssi/obj/kernel/msm-4.9/drivers/media/v4l2-core/videobuf2-vmalloc.ko
out/target/product/qssi/obj/kernel/msm-4.9/drivers/media/v4l2-core/videobuf2-vmalloc.mod.c
out/target/product/qssi/dlkm/lib/modules/videobuf2-vmalloc.ko
out/target/product/sdm845/vendor/lib/modules/videobuf2-vmalloc.ko
out/target/product/sdm845/obj/kernel/msm-4.9/.tmp_versions/videobuf2-vmalloc.mod
out/target/product/sdm845/obj/kernel/msm-4.9/drivers/media/v4l2-core/videobuf2-vmalloc.mod.o
out/target/product/sdm845/obj/kernel/msm-4.9/drivers/media/v4l2-core/videobuf2-vmalloc.o
out/target/product/sdm845/obj/kernel/msm-4.9/drivers/media/v4l2-core/videobuf2-vmalloc.ko
out/target/product/sdm845/obj/kernel/msm-4.9/drivers/media/v4l2-core/videobuf2-vmalloc.mod.c
out/target/product/sdm845/obj/PACKAGING/depmod_vendor_intermediates/lib/modules/0.0/vendor/lib/modules/videobuf2-vmalloc.ko
out/target/product/sdm845/dlkm/lib/modules/videobuf2-vmalloc.ko

可以看到 videobuf2-vmalloc 确实被编译成模块了。找到模块文件,push 到 /vendor/lib/modules/ 下,使用 insmod 插入模块,依旧提示 “No such file or directory”。

检查 kernel log:

02-09 11:43:57.012     0     0 W videobuf2_vmalloc: Unknown symbol vb2_common_vm_ops (err 0)
02-09 11:43:57.019     0     0 W videobuf2_vmalloc: Unknown symbol vb2_create_framevec (err 0)
02-09 11:43:57.026     0     0 W videobuf2_vmalloc: Unknown symbol vb2_destroy_framevec (err 0)
02-09 11:43:57.035     0     0 W uvcvideo: Unknown symbol vb2_vmalloc_memops (err 0)

同理找到 videobuf2-vmalloc.ko 依赖的模块 videobuf2-memops.ko。手动插入后,再依次插入 videobuf2-vmalloc、uvcvideo.ko。检查模块插入状态:

sdm845:/ # lsmod
Module                  Size  Used by
uvcvideo               86016  0
videobuf2_vmalloc      16384  1 uvcvideo
videobuf2_memops       16384  1 videobuf2_vmalloc
wlan                 7729152  0
snd_soc_sdm845        151552  0
snd_soc_wcd934x       425984  1 snd_soc_sdm845
swr_wcd_ctrl           32768  1 snd_soc_wcd934x
snd_soc_wcd_mbhc       81920  1 snd_soc_wcd934x
snd_soc_wcd9xxx        73728  1 snd_soc_wcd934x
snd_soc_wsa881x        53248  1 snd_soc_sdm845
wcd_core              143360  5 snd_soc_sdm845,snd_soc_wcd934x,snd_soc_wcd_mbhc,snd_soc_wcd9xxx,snd_soc_wsa881x
snd_soc_wcd_spi        28672  0
wcd_dsp_glink          24576  1
pinctrl_wcd            16384  0
msm_11ad_proxy         32768  0

此时模块正确加载。连接 USB 摄像头,在 /dev 下生成了新的 video 节点。最后模仿 uvcvideo.ko 模块配置 videobuf2_vmalloc.ko、videobuf2_memops.ko 自动加载加载即可。

注意手动执行 insmod 命令时,报错都是 “No such file or directory”,需要通过 kernel log 查看真正错误的原因。

以模块方式加载 UVC 驱动相关推荐

  1. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

  2. arm上加载insmod驱动时出现Unknown symbol in module

    问题 这几天在arm上做蓝牙耳机驱动的时候,编译好了驱动但是在板子上insmod时候. 怎么会出现这种情况,不对呀,仔细查我们会发现,其实编译驱动的时候,就出现了一些警告,只是当时没有在意而已,而恰恰 ...

  3. pythonflask configlist.py_Python+Flask.0004.FLASK配置管理之三种方式加载外部配置

    简单介绍: 说明: 复杂的项目需要配置各种环境,若设置少可直接硬编码,设置多的话可通过加载配置/加载文件/加载变量的方式来设置 1 2 3 app.config.update( DEBUG=True, ...

  4. (16) Node.js 模块的加载逻辑

    一.按照组织方式划分模块 文件模块:是我们上一章节说过的,就是一个独立的.js文件. 目录模块:是我们可以将多个独立的.js文件统一存放在一个目录下,也就是放到一个文件夹中. 二.目录模块的加载逻辑 ...

  5. python加载机制_Python 模块的加载顺序

    基本概念 module 模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块 package 包,包含有 init 文件的文件夹 relative path 相对路径,相对于某个目录的 ...

  6. 【游戏逆向】FPS游戏自瞄透视模块动态加载分析

    用OD附加游戏进程, 进入OD主界面以后,我们CTRL+G 跳转到地址00401000(系统默认通常游戏领空的起始地址)的时候发现了错误. 也就是说代码段不在这了, 那跑哪去了? 为什么会有这样的错误 ...

  7. 一篇文章吃透:为什么加载数据库驱动要用Class.forName()

    1.Class.forName()和ClassLoader.loadClass()和new XX的区别 Class.forName():将类的.class文件加载到jvm中之外,还会对类进行解释,执行 ...

  8. 正确加载MySQL驱动的语句_正确加载MySQL驱动的语句_____________________;_学小易找答案...

    [多选题]电子图书的特点是 [简答题] [单选题]为了准备病理学考试,王同学想在图书馆借一本人民卫生出版社出版的熊小亮编写的<病理学试题库>,经过检索发现该书都被借出去了 , 最方便快捷的 ...

  9. u盘安装linux找不到驱动,利用U盘加载控制器驱动来安装Linux系统的方法

    一般我们在安装服务器过程中需要加载一些scsi卡或raid卡驱动,以便操作系统可以检测到硬盘. 常规的安装方式是要用到软驱,其实我们也是可以通过U盘来进行加载的. 装Linux控制器驱动往往都是*.d ...

  10. linux优化网页加载过程,【zz】Linux起步过程中硬件模块的加载

    [zz]Linux起步过程中硬件模块的加载 [zz]Linux起步过程中硬件模块的加载 日期:2014-05-16 浏览次数:20354 次 [zz]Linux启动过程中硬件模块的加载 文章来源不详. ...

最新文章

  1. windows7下解决caffe check failed registry.count(type) == 1(0 vs. 1) unknown layer type问题
  2. Java连接Oracle数据库开发银行管理系统【一、需求篇】
  3. 三分钟破解无线网——无线网络安全攻防
  4. 通过Socket实现文件上传/上传文件
  5. Lexical environments: ECMAScript implementation
  6. UAC2.0 Requests处理
  7. c语言实现猜数字游戏
  8. 2020年易语言调用大漠插件来制作游戏脚本教程
  9. 计算机主机的组成部分,计算机主机的组成是有哪些
  10. WannaCry感染文件恢复方法_企业再也不用愁了!
  11. 初级会计资料-常用会计公式(三)
  12. 路由器修改wifi密码
  13. 电信smgp3.0短信发送问题
  14. 手把手教你用Unet实现语义分割(Pytorch版)
  15. 现代控制原理专业词汇中英文对照
  16. 什么是5G advanced
  17. 如何通adb命令删除安卓设备上指定的文件和apk
  18. Android7以上的手机通过fiddler抓包
  19. 安装Python 后安装Python-dev
  20. 为什么matlab的程序都加了分号,还会在命令行窗口不断输出

热门文章

  1. 无效的m3u8怎么办_你还在为m3u8文件如何转换而发愁?看了我就有答案了
  2. 助力NBA复赛背后,NBA与可穿戴设备的纠葛缠斗
  3. 向量线性无关和正交及其关系
  4. 市场爆发在即 分布式电站运维出路何在?
  5. 宇宙也能测量,破解未解之谜的三维地图出炉
  6. 软件工程师必须掌握的知识结构
  7. 简述计算机视觉在各领域中的成功应用,现代传感技术与系统课后题及答案
  8. 用PS制作墙壁上的时尚立体文字图案
  9. Android Studio实现多媒体播放器,音乐视频一体化
  10. python导入数学函数_Python 数学函数模块(Math)