第三阶段应用层——2.2 视频监控—根据虚拟驱动vivi的使用过程彻底分析摄像头驱动

本文详细解析了虚拟驱动vivi在视频监控中的使用流程,涵盖了从设备测试到源码分析的全过程。通过log信息提取关键函数,深入探讨了vivi.c源码中的ioctl操作,包括缓冲区管理、数据流控制等核心机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视频监控—根据虚拟驱动vivi的使用过程彻底分析摄像头驱动


一、虚拟驱动vivi测试

  1. 在Ubuntu虚拟机上安装xawtv,执行uname -a确实ubuntu的内核版本;
  2. 去www.kernel.org下载同版本的内核,解压后/drivers/media/video目录取出修改它的Makefile为:
KERN_DIR = /usr/src/linux-headers-"内核版本"-generic

all:
        make -C $(KERN_DIR) M=`pwd` modules 

clean:
        make -C $(KERN_DIR) M=`pwd` modules clean
        rm -rf modules.order

obj-m   += vivi.o
obj-m   += videobuf-core.o
obj-m   += videobuf-vmalloc.o
obj-m   += v4l2-common.o
  1. 执行make进行编译
  2. 加载驱动sudo modprobe vivisudo rmmod vivisudo insmod ./vivi.ko
  3. 查看对应的设备节点ls /dev/video*
  4. 执行xawtv -c /dev/videoX,启动测试vivi

二、根据log分析摄像头驱动

执行,打印出vivi使用时的xawtv.log,从中彻底分析摄像头驱动

由于log信息过多,只挑选出对应部分,由于vivi对应的设备节点为/dev/event0,在日志搜索/dev/event0得到以下有用信息

open("/dev/video0", O_RDWR|O_LARGEFILE) = 4
ioctl(4, VIDIOC_QUERYCAP or VT_OPENQRY, 0xbfaccd44) = 0
ioctl(4, VIDIOC_G_FMT or VT_SENDSIG, 0xbfaccc78) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0xbfaccbec) = 0
ioctl(4, 0xc02c564a, 0xbfaccb58)        = -1 EINVAL (Invalid argument)
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0xbfaccbec) = 0
ioctl(4, 0xc02c564a, 0xbfaccb58)        = -1 EINVAL (Invalid argument)
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0xbfaccbec) = 0
ioctl(4, 0xc02c564a, 0xbfaccb58)        = -1 EINVAL (Invalid argument)
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0xbfaccbec) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0xbfaccbec) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0xbfaccbec) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0xbfaccbec) = -1 EINVAL (Invalid argument)
ioctl(4, VIDIOC_QUERYCAP or VT_OPENQRY, 0xbfaccb84) = 0
ioctl(4, VIDIOC_G_INPUT, 0xbfacca2c)    = 0
ioctl(4, VIDIOC_ENUMINPUT, 0xbfacca2c)  = 0
fstat64(4, {
   st_mode=S_IFCHR|0660, st_rdev=makedev(81, 0), ...}) = 0
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0xbfacca78) = -1 EINVAL (Invalid argument)
ioctl(4, VIDIOC_QUERYCAP or VT_OPENQRY, 0x9b40998) = 0
fcntl64(4, F_SETFD, FD_CLOEXEC)         = 0
ioctl(4, VIDIOC_ENUMINPUT, 0x9b40acc)   = 0
ioctl(4, VIDIOC_ENUMINPUT, 0x9b40b18)   = 0
ioctl(4, VIDIOC_ENUMINPUT, 0x9b40b64)   = 0
ioctl(4, VIDIOC_ENUMINPUT, 0x9b40bb0)   = 0
ioctl(4, VIDIOC_ENUMINPUT, 0x9b40bfc)   = -1 EINVAL (Invalid argument)
ioctl(4, VIDIOC_ENUMSTD, 0x9b40f8c)     = 0
ioctl(4, VIDIOC_ENUMSTD, 0x9b40fcc)     = 0
ioctl(4, VIDIOC_ENUMSTD, 0x9b4100c)     = 0
ioctl(4, VIDIOC_ENUMSTD, 0x9b4104c)     = 0
ioctl(4, VIDIOC_ENUMSTD, 0x9b4108c)     = 0
ioctl(4, VIDIOC_ENUMSTD, 0x9b410cc)     = 0
ioctl(4, VIDIOC_ENUMSTD, 0x9b4110c)     = 0
ioctl(4, VIDIOC_ENUMSTD, 0x9b4114c)     = -1 EINVAL (Invalid argument)
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0x9b4138c) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0x9b413cc) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0x9b4140c) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0x9b4144c) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0x9b4148c) = 0
ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0x9b414cc) = 0
ioctl(4, VIDIOC_G_PARM, 0x9b40a00)      = 0
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41b8c) = 0
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41bd0) = 0
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41c14) = 0
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41c58) = 0
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41c9c) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41ce0) = 0
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41d24) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41d68) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41dac) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41df0) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41e34) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41e78) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41ebc) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41f00) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41f44) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41f88) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41fcc) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b42010) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b42054) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b42098) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b420dc) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b42120) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b42164) = -1 EINVAL (Invalid argument)
ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b421a8) = -1 EINVAL (Invalid argument
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值