• 22、在Ubuntu 14.0上使用韦东山IP2977测试总结(未成功)


    1. 去www.kernel.org下载同版本的内核(与Ubuntu 14.0)

    解压后把drivers/media/video/uvc目录取出(发现我的3.13版本的在driversmediausbuvc下)
    修改它的Makefile为:

    KERN_DIR = /usr/src/linux-headers-3.13.0-35-generic

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

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

    uvcvideo-objs := uvc_entity.o uvc_debugfs.o uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o
    uvc_status.o uvc_isight.o
    obj-m += uvcvideo.o

    Device Drivers --->
    <*>Multimedia support --->
    [*] Cameras/video grabbers support
    [*] Media usb adapters---->
    <*> USBvideo class (uvc)
    [*] uvc input events device support

    Device Drivers --->
    [*]usb support
    [*] usb announce new device
    <*> usb gadget support à
    < *> usb gadget drivers(usb webcam gadget)

    2、make的时候出错提示很多 media_device*******,media_entity******函数找不到,在Ubuntu内核下make menuconfig,发现没有配置支持Multimedia support,一个做法是配置后make生成内核文件,替换现有的内核,该方法不会,所以我这里使用单独把这些编译成模块,在网上下载的源码中搜索这些函数,发现是在/media目录下,(ubuntu内核中很多文件都找不到,目前不知道原因),修改media下makefile(最开始只添加了media-device.o,在insmod之后的时候通过dmesg看却哪些函数)

     KERN_DIR = /usr/src/linux-headers-3.13.0-35-generic

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

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

    obj-m += media-entity.o
    obj-m += media-devnode.o
    obj-m += media-device.o

    需要注意的是,media-entity和media-devnode中的函数是通过EXPORT_SYMBOL_GPL声明,能使用该符合的模块必须声明为“GPL”,同时要添加头文件“#include <linux/module.h>”,否则会报错“error: expected declaration specifiers or ‘...’ before string constant”,以上三个模块安装后回到uvc目录下

    再次安装make,这时候还是提示warning:media_device****等一些函数undefined

    这是linux kernel 2.6.26 之后版本的bug (详细描述, 请看http://bugzilla.kernel.org/show_bug.cgi?id=12446)
    并且这个bug不会被fix

    解决办法是把mod_a的Module.symvers放到mod_b的当前路径,从而编译mod_b,符号信息会自动连接进去.
    或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers, 如:
    KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers

    编译mod_b时,搜索Module.symvers的路径是:
    1, kernel source path, e.g. /usr/src/kernels/linux-2.6.28.10
    2, makefile中M=所指定的路径, 它等效于变量KBUILD_EXTMOD的值
    3, 变量KBUILD_EXTRA_SYMBOLS的值

       我按照上面所叙述的对我的内核模块的Makefile 做了修改,在编译命令那行加了“KBUILD_EXTRA_SYMBOLS=/linux-3.1.4/Module.symvers”,同时还需要添加MODULE_LICENSE("GPL"); 

    最后模块make 通过,同时insmod也成功了,但是设备在video_register_device时候失败,到这里之后没一点头绪了,等有时间了在弄

    insmod之后通过dmesg查看没有/dev/video0的原因,发现在v4l2-dev.c的779行出错:

    if (WARN_ON(!vdev->v4l2_dev))
    return -EINVAL;

    在video_register_device的时候出现上述错误,接着分析uvc_driver.c和vivi.c,在vivi.c中发现v4l2_dev会被赋值

    vfd->v4l2_dev = &dev->v4l2_dev;

    dev->v4l2_dev;会在v4l2_device_register(NULL, &dev->v4l2_dev);中被设置,而在uvc_driver.c中,在uvc_register_video函数中也赋值了;

    vdev->v4l2_dev = &dev->vdev;

    现在就不知道原来了,但是在v4l2_device_register之前有个#ifdef CONFIG_MEDIA_CONTROLLER的判断,不知道是不是这个没有配置引起的

  • 相关阅读:
    集群架构搭建
    THUWC2019 游记
    【集训队互测2015】未来程序·改
    [NOIP2014普及组T1]珠心算测验
    [CF912D]Fishes
    [POJ2409]Let it Bead
    golang 统计系统测试覆盖率
    tcpdump常用方法
    数学闯关引发的思考
    linux lsof常用方法
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8724005.html
Copyright © 2020-2023  润新知