当前位置:   article > 正文

media设备节点初始化与Video4Linux初始化

video4linux

media设备节点初始化与Video4Linux初始化



media设备节点初始化

media_devnode_init函数是一个内核初始化函数,用于在Linux内核启动期间进行设备节点初始化。
函数的主要作用是创建媒体设备节点(device node)并将其注册到系统的设备树中。媒体设备节点用于表示媒体设备(如摄像头、音频设备等),它们在/dev目录下以特定的名称存在,并允许用户空间应用程序与这些设备进行交互。
在函数的实现中,它会调用media_device_register_entity函数来注册媒体设备实体,然后调用media_devnode_register函数来创建并注册设备节点。这些操作使得媒体设备可以在用户空间中访问。
该函数通常在内核启动期间被调用,以确保媒体设备节点在系统启动完成后可用。它在内核初始化过程中的某个时机被调用,具体取决于内核的配置和架构。
总结而言,media_devnode_init函数的作用是初始化媒体设备节点,并将其注册到系统中,以便用户空间应用程序可以通过设备节点与媒体设备进行通信。
/driver/media/media-devnode.c

static int __init media_devnode_init(void)
{
    int ret;

    pr_info("Linux media interface: v0.10\n"); // 打印信息
    ret = alloc_chrdev_region(&media_dev_t, 0, MEDIA_NUM_DEVICES, MEDIA_NAME); // 分配字符设备号
    if (ret < 0) {
        pr_warn("unable to allocate major\n"); // 分配失败
        return ret;
    }

    ret = bus_register(&media_bus_type); // 注册总线
    if (ret < 0) {
        unregister_chrdev_region(media_dev_t, MEDIA_NUM_DEVICES); // 注册失败,释放字符设备号
        pr_warn("bus_register failed\n"); // 打印错误信息
        return -EIO;
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

接如usb摄像头时对应打印信息如下
在这里插入图片描述

Video4Linux初始化

videodev_init函数是一个内核初始化函数,用于初始化视频设备框架(Video4Linux)。
Video4Linux是Linux内核中用于支持视频设备的框架,它提供了一组API和驱动程序接口,使得应用程序能够访问和控制视频设备,例如摄像头、视频采集卡等。
该函数的作用是注册Video4Linux框架及其相关的设备、驱动程序和功能。在函数的实现中,它会执行以下操作:
调用v4l2_register_subdev函数注册Video4Linux子设备。子设备代表视频设备的具体功能单元,如图像传感器、视频解码器等。
调用v4l2_device_register函数注册Video4Linux设备。该设备代表整个Video4Linux框架,并管理子设备和驱动程序之间的通信。
调用video_register_device函数注册Video4Linux设备节点。设备节点是用户空间应用程序与视频设备进行交互的接口。
注册Video4Linux的驱动程序和算法模块,使其能够被识别和使用。

这些操作将Video4Linux框架和相关设备、驱动程序注册到内核中,使得应用程序可以通过Video4Linux API与视频设备进行通信和控制。
videodev_init函数通常在内核启动期间被调用,以确保视频设备框架在系统启动完成后可用。它在内核初始化过程中的某个时机被调用,具体取决于内核的配置和架构。
总结而言,videodev_init函数的作用是初始化视频设备框架(Video4Linux),注册相关的设备、驱动程序和功能,以便用户空间应用程序可以使用Video4Linux API访问和控制视频设备。

/*
 *    Initialise video for linux
 */
static int __init videodev_init(void)
{
    dev_t dev = MKDEV(VIDEO_MAJOR, 0); // 定义设备号
    int ret;

    printk(KERN_INFO "Linux video capture interface: v2.00\n"); // 打印信息
    ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME); // 注册字符设备
    if (ret < 0) { // 如果注册失败
        printk(KERN_WARNING "videodev: unable to get major %d\n",
                VIDEO_MAJOR); // 打印警告信息
        return ret; // 返回错误码
    }

    ret = class_register(&video_class); // 注册 class
    if (ret < 0) { // 如果注册失败
        unregister_chrdev_region(dev, VIDEO_NUM_DEVICES); // 注销字符设备
        printk(KERN_WARNING "video_dev: class_register failed\n"); // 打印警告信息
        return -EIO; // 返回错误码
    }

    return 0; // 返回 0
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

接如usb摄像头时对应打印信息如下
在这里插入图片描述

如果文章对您有帮助,点赞

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/263169
推荐阅读
相关标签