以模块方式加载 UVC 驱动

以模块方式加载 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=1
	insmod /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_CLASS
	tristate "USB Video Class (UVC)"
	depends on VIDEO_V4L2
	select VIDEOBUF2_VMALLOC
	---help---
	  Support for the USB Video Class (UVC).  Currently only video
	  input 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 查看真正错误的原因。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翻滚吧香香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值