小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

<2012 11 14> Linux V4L2驅(qū)動(dòng)架構(gòu)解析與開(kāi)發(fā)導(dǎo)引

 WUCANADA 2013-10-10

Linux V4L2驅(qū)動(dòng)架構(gòu)解析與開(kāi)發(fā)導(dǎo)引

Andrew按:眾所周 知,linux中可以采用靈活的多層次的驅(qū)動(dòng)架構(gòu)來(lái)對(duì)接口進(jìn)行統(tǒng)一與抽象,最低層次的驅(qū)動(dòng)總是直接面向硬件的,而最高層次的驅(qū)動(dòng)在linux中被劃分為 “面向字符設(shè)備、面向塊設(shè)備、面向網(wǎng)絡(luò)接口”三大類來(lái)進(jìn)行處理,前兩類驅(qū)動(dòng)在文件系統(tǒng)中形成類似文件的“虛擬文件”,又稱為“節(jié)點(diǎn)node”,這些節(jié)點(diǎn)擁 有不同的名稱代表不同的設(shè)備,在目錄/dev下進(jìn)行統(tǒng)一管理,系統(tǒng)調(diào)用函數(shù)如open、close、read等也與普通文件的操作有相似之處,這種接口的 一致性是由VFS(虛擬文件系統(tǒng)層)抽象完成的。面向網(wǎng)絡(luò)接口的設(shè)備仍然在UNIX/Linux系統(tǒng)中被分配代表設(shè)備的名稱(如eth0),但是沒(méi)有映射 入文件系統(tǒng)中,其驅(qū)動(dòng)的調(diào)用方式也與文件系統(tǒng)的調(diào)用open、read等不同。

video4linux2(V4L2)是Linux內(nèi)核中關(guān)于視頻設(shè)備的中間驅(qū)動(dòng)層,向上為L(zhǎng)inux應(yīng)用程序訪問(wèn)視頻設(shè)備提供了通用接口,向下為 linux中設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)提供了統(tǒng)一的V4L2框架。在Linux系統(tǒng)中,V4L2驅(qū)動(dòng)的視頻設(shè)備(如攝像頭、圖像采集卡)節(jié)點(diǎn)路徑通常為/dev中 的videoX,V4L2驅(qū)動(dòng)對(duì)用戶空間提供“字符設(shè)備”的形式,主設(shè)備號(hào)為81,對(duì)于視頻設(shè)備,其次設(shè)備號(hào)為0-63。除此之外,次設(shè)備號(hào)為 64-127的Radio設(shè)備,次設(shè)備號(hào)為192-223的是Teletext設(shè)備,次設(shè)備號(hào)為224-255的是VBI設(shè)備。由V4L2驅(qū)動(dòng)的 Video設(shè)備在用戶空間通過(guò)各種ioctl調(diào)用進(jìn)行控制,并且可以使用mmap進(jìn)行內(nèi)存映射。

linux內(nèi)核概略架構(gòu)(source:《Linux Device Drivers  Edition 3》chaper1)

                      (上傳不了,看官去翻書(shū)...)

V4l2在linux中的驅(qū)動(dòng)架構(gòu)(Edit By Andrew):

 

     可以看到從視頻輸入輸入硬件的整個(gè)驅(qū)動(dòng)鏈被抽象成3個(gè)層次:

1、  最底層是直接面向硬件的,驅(qū)動(dòng)框架由v4l2提供。值得注意的是,往往該層驅(qū)動(dòng)需要總線驅(qū)動(dòng)的支持,比如常見(jiàn)的USB2.0總線。

2、  中間層便是v4l2。這是v4l的第二版,由Bill Dirks最開(kāi)始開(kāi)發(fā),最終被收入標(biāo)準(zhǔn)內(nèi)核驅(qū)動(dòng)樹(shù)。

3、  上層是linux內(nèi)核三大驅(qū)動(dòng)模塊之一的“字符設(shè)備驅(qū)動(dòng)層”,因此最終視頻設(shè)備以文件系統(tǒng)中/dev目錄下的字符設(shè)備的面目出現(xiàn),并被應(yīng)用程序使用。

V4L2的是V4L的第二個(gè)版本。原來(lái)的V4L被引入到Linux內(nèi)核2.1.x的開(kāi)發(fā)周期后期。Video4Linux2修正了一些設(shè)計(jì)缺陷,并 開(kāi)始出現(xiàn)在2.5.X內(nèi)核,并在內(nèi)核2.6.38之后,取消了對(duì)第一個(gè)版本v4l的支持。Video4Linux2驅(qū)動(dòng)程序包括Video4Linux1 應(yīng)用的兼容模式,但實(shí)際上,支持是不完整的,并建議V4L2的設(shè)備使用V4L2的模式。現(xiàn)在,該項(xiàng)目的DVB-Wiki托管在 LinuxTV(--->http:///wiki/index.php/Main_Page)的網(wǎng)站上。

要想了解 V4l2 有幾個(gè)重要的文檔是必須要讀的:

1、源碼Documentation/video4linux目錄下的V4L2-framework.txtvideobuf

2、V4L2的官方API文檔V4L2 API Specification

3、源碼drivers/media/video目錄下的sample程序vivi.c(虛擬視頻驅(qū)動(dòng)程序,此代碼模擬一個(gè)真正的視頻設(shè)備V4L2 API)。

V4l2可以支持多種設(shè)備,它可以有以下幾種接口:

1. 視頻采集接口(video capture interface):這種應(yīng)用的設(shè)備可以是高頻頭或者攝像頭.V4L2的最初設(shè)計(jì)就是應(yīng)用于這種功能的.

2. 視頻輸出接口(video output interface):可以驅(qū)動(dòng)計(jì)算機(jī)的外圍視頻圖像設(shè)備--像可以輸出電視信號(hào)格式的設(shè)備.

3. 直接傳輸視頻接口(video overlay interface):它的主要工作是把從視頻采集設(shè)備采集過(guò)來(lái)的信號(hào)直接輸出到輸出設(shè)備之上,而不用經(jīng)過(guò)系統(tǒng)的CPU.

4. 視頻間隔消隱信號(hào)接口(VBI interface):它可以使應(yīng)用可以訪問(wèn)傳輸消隱期的視頻信號(hào).

5. 收音機(jī)接口(radio interface):可用來(lái)處理從AM或FM高頻頭設(shè)備接收來(lái)的音頻流.

 

Andrew附:值得注意的是,內(nèi)核底層驅(qū)動(dòng)程序的支持情況往往是我們關(guān)心的。推薦這篇博文《Linux 下攝像頭驅(qū)動(dòng)支持情況》  http://weijb0606.blog.163.com/blog/static/131286274201063152423963/   這里做一個(gè)簡(jiǎn)要的總結(jié):

1、  由于在內(nèi)核2.6.38版本之后就已經(jīng)完全支持v4l2,且拋棄了第一版。如今(2012-11)的內(nèi)核版本已到3.3.6,且?guī)缀跛械囊曨l設(shè)備驅(qū)動(dòng)都已過(guò)渡到新版,因此在開(kāi)發(fā)程序的時(shí)候應(yīng)該按照v4l2的版本API標(biāo)準(zhǔn)來(lái)開(kāi)發(fā)。

2、  一般市場(chǎng)上容易買到的“免驅(qū)”攝像頭就是符合UVC標(biāo)準(zhǔn)的,內(nèi)核都可以支持。

3、  其他種類的如中星微的ZC3XX、Sunplus系列等,GSPCA一般能支持,內(nèi)核也是自帶的。

4、  內(nèi)核支持的所有種類的視頻設(shè)備驅(qū)動(dòng),都可以在文件系統(tǒng)目錄/lib/modules/kernel%uname –r/kernel/driver/meida/video下找到?;蛘咴诰幾g內(nèi)核時(shí),一一列舉。

相關(guān)網(wǎng)站:

http://

http:///wiki/index.php/Main_Page  linuxTV網(wǎng)站是V4L- (DVB) Digital Video Broadcasting的維護(hù)者。

http://www./uvc/ linux UVC驅(qū)動(dòng)主頁(yè)

http://mxhaard./spca5xx.html gspca驅(qū)動(dòng)主頁(yè)

 

 

===========一些v4l2驅(qū)動(dòng)層細(xì)節(jié)==========

——注意這些細(xì)節(jié)不是應(yīng)用程序調(diào)用的,而是編寫(xiě)驅(qū)動(dòng)程序需要了解的,或者是關(guān)于v4l2本身的一些細(xì)節(jié)。

關(guān)于編寫(xiě)應(yīng)用程序的一些細(xì)節(jié)移步“ http://www.cnblogs.com/andrew-wang/archive/2012/11/14/2770701.html  ”。

 

所有的v4l2驅(qū)動(dòng)程序有以下結(jié)構(gòu):

      1) 每個(gè)設(shè)備包含設(shè)備狀態(tài)的實(shí)例結(jié)構(gòu)。

      2) 子設(shè)備的初始化和命令方式(如果有).

      3) 創(chuàng)建V4L2的設(shè)備節(jié)點(diǎn) (/dev/videoX, /dev/vbiX and /dev/radioX)和跟蹤設(shè)備節(jié)點(diǎn)的具體數(shù)據(jù)。

      4)文件句柄特定的結(jié)構(gòu),包含每個(gè)文件句柄數(shù)據(jù);

      5) 視頻緩沖處理。

V4L2 驅(qū)動(dòng)核心

V4L2 的驅(qū)動(dòng)源碼在drivers/media/video目錄下,主要核心代碼有:

復(fù)制代碼
v4l2-dev.c                  //linux版本2視頻捕捉接口,主要結(jié)構(gòu)體 video_device 的注冊(cè)
v4l2-common.c               //在Linux操作系統(tǒng)體系采用低級(jí)別的操作一套設(shè)備structures/vectors的通用視頻設(shè)備接口。
                            //此文件將替換videodev.c的文件配備常規(guī)的內(nèi)核分配。
v4l2-device.c               //V4L2的設(shè)備支持。注冊(cè)v4l2_device
v4l22-ioctl.c               //處理V4L2的ioctl命令的一個(gè)通用的框架。
v4l2-subdev.c               //v4l2子設(shè)備
v4l2-mem2mem.c              //內(nèi)存到內(nèi)存為L(zhǎng)inux和videobuf視頻設(shè)備的框架。設(shè)備的輔助函數(shù),使用其源和目的地videobuf緩沖區(qū)。

頭文件linux/videodev2.h、media/v4l2-common.h、media/v4l2-device.h、media/v4l2-ioctl.h、media/v4l2-dev.h、media/v4l2-ioctl.h等。
復(fù)制代碼

V4l2相關(guān)結(jié)構(gòu)體

 1.V4l2_device

復(fù)制代碼
 struct V4l2_device{
    /* DEV-> driver_data指向這個(gè)結(jié)構(gòu)。 注:DEV可能是空的,如果沒(méi)有父設(shè)備是如同ISA設(shè)備。 */
      struct device *dev;
    /* 用于跟蹤注冊(cè)的subdevs */
      struct list_head subdevs;
    /*鎖定此結(jié)構(gòu)體;可以使用的驅(qū)動(dòng)程序以及如果這個(gè)結(jié)構(gòu)嵌入到一個(gè)更大的結(jié)構(gòu)。 */
      spinlock_t lock;
    /* 獨(dú)特的設(shè)備名稱,默認(rèn)情況下,驅(qū)動(dòng)程序姓名+總線ID */
      char name[V4L2_DEVICE_NAME_SIZE];
    /*報(bào)告由一些子設(shè)備調(diào)用的回調(diào)函數(shù)。 */
      void (*notify)(struct v4l2_subdev *sd,
                    unsigned int notification, void *arg);

};
復(fù)制代碼

v4l2_device注冊(cè)和注銷     

 v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev); 

     第一個(gè)參數(shù)‘dev’通常是一個(gè)pci_dev的struct device的指針,但它是ISA設(shè)備或一個(gè)設(shè)備創(chuàng)建多個(gè)PCI設(shè)備時(shí)這是罕見(jiàn)的DEV為NULL,因此makingit不可能聯(lián)想到一個(gè)特定的父母 v4l2_dev。 您也可以提供一個(gè)notify()回調(diào)子設(shè)備,可以通過(guò)調(diào)用通知你的事件。取決于你是否需要設(shè)置子設(shè)備。一個(gè)子設(shè)備支持的任何通知必須在頭文件中定義 .

注冊(cè)時(shí)將初始化 v4l2_device 結(jié)構(gòu)體. 如果 dev->driver_data字段是空, 它將連接到 v4l2_dev.

v4l2_device_unregister(struct v4l2_device *v4l2_dev);

注銷也將自動(dòng)注銷設(shè)備所有子設(shè)備。

2.video_device   (進(jìn)行視頻編程時(shí)v4l的最重要也是最常用功能)

      在/dev目錄下的設(shè)備節(jié)點(diǎn)使用的 struct video_device(v4l2_dev.h)創(chuàng)建。

復(fù)制代碼
struct video_device
     {
         /*設(shè)備操作函數(shù) */
         const struct v4l2_file_operations *fops;
         /* 虛擬文件系統(tǒng) */
         struct device dev;        /* v4l 設(shè)備 */
         struct cdev *cdev;        /* 字符設(shè)備 */
         struct device *parent;        /*父設(shè)備 */
         struct v4l2_device *v4l2_dev;    /* v4l2_device parent */
        /* 設(shè)備信息 */
         char name[32];
         int vfl_type;
         /* 'minor' is set to -1 if the registration failed */
         int minor;
         u16 num;
         /* use bitops to set/clear/test flags */
         unsigned long flags;
         /*屬性來(lái)區(qū)分一個(gè)物理設(shè)備上的多個(gè)索引 */
         int index;
         /* V4L2 文件句柄 */
         spinlock_t        fh_lock;   /*鎖定所有的 v4l2_fhs */
         struct list_head    fh_list; /* List of struct v4l2_fh */
         int debug;                   /* Activates debug level*/
         /* Video standard vars */
         v4l2_std_id tvnorms;         /* Supported tv norms */
         v4l2_std_id current_norm;    /* Current tvnorm */
         /* 釋放的回調(diào)函數(shù) */
         void (*release)(struct video_device *vdev);
         /* 控制的回調(diào)函數(shù) */
         const struct v4l2_ioctl_ops *ioctl_ops;
     }
復(fù)制代碼

   動(dòng)態(tài)分配:

 struct video_device *vdev = video_device_alloc();

   結(jié)構(gòu)體配置:

         fops:設(shè)置這個(gè)v4l2_file_operations結(jié)構(gòu),file_operations的一個(gè)子集。v4l2_dev: 設(shè)置這個(gè)v4l2_device父設(shè)備

         name:

         ioctl_ops:使用v4l2_ioctl_ops簡(jiǎn)化的IOCTL,然后設(shè)置v4l2_ioctl_ops結(jié)構(gòu)。

         lock:如果你想要做的全部驅(qū)動(dòng)程序鎖定就保留為NULL。否則你給它一個(gè)指針指向一個(gè)mutex_lock結(jié)構(gòu)體和任何v4l2_file_operations被調(diào)用之前核心應(yīng)該釋放釋放鎖。

         parent:一個(gè)硬件設(shè)備有多個(gè)PCI設(shè)備,都共享相同v4l2_device核心時(shí),設(shè)置注冊(cè)使用NULL v4l2_device作為父設(shè)備結(jié)構(gòu)。

         flags:可選的。設(shè)置到V4L2_FL_USE_FH_PRIO如你想讓框架處理VIDIOC_G/ S_PRIORITY的ioctl。這就需要您使用結(jié)構(gòu)v4l2_fh。這個(gè)標(biāo)志最終會(huì)消失,一旦所有的驅(qū)動(dòng)程序使用的核心優(yōu)先處理。但現(xiàn)在它必須明確設(shè) 定。

   如果使用v4l2_ioctl_ops,那么你應(yīng)該設(shè)置。unlocked_ioctlvideo_ioctl2在v4l2_file_operations結(jié)構(gòu)。

注冊(cè)/注銷 video_device:

   video_register_device(struct video_device *vdev, int type, int nr);

    __video_register_device(struct video_device *vdev, int type, int nr,int warn_if_nr_in_use)

        參數(shù):

           vdev:我們要注冊(cè)的視頻設(shè)備結(jié)構(gòu)。

           type:設(shè)備類型注冊(cè)

           nr:設(shè)備號(hào)(0==/dev/video0,1??== /dev/video1,...-1==釋放第一個(gè))

           warn_if_nr_in_use:如果所需的設(shè)備節(jié)點(diǎn)號(hào)碼已經(jīng)在使用另一個(gè)號(hào)碼代替選擇。

   

       注冊(cè)程式分配次設(shè)備號(hào)和設(shè)備節(jié)點(diǎn)的數(shù)字根據(jù)請(qǐng)求的類型和注冊(cè)到內(nèi)核新設(shè)備節(jié)點(diǎn)。如果無(wú)法找到空閑次設(shè)備號(hào)或設(shè)備節(jié)點(diǎn)編號(hào),或者如果設(shè)備節(jié)點(diǎn)注冊(cè)失敗,就返回一個(gè)錯(cuò)誤。

 video_unregister_device(struct video_device *vdev);

3.v4l2_subdev 子設(shè)備結(jié)構(gòu)體

          每個(gè)子設(shè)備驅(qū)動(dòng)程序必須有一個(gè)v4l2_subdev結(jié)構(gòu)。這個(gè)結(jié)構(gòu)可以獨(dú)立簡(jiǎn)單的設(shè)備或者如果需要存儲(chǔ)更多的狀態(tài)信息它可能被嵌入在一個(gè)更大的結(jié)構(gòu)。由 于子設(shè)備可以做很多不同的東西,你不想結(jié)束一個(gè)巨大的OPS結(jié)構(gòu)其中只有少數(shù)的OPS通常執(zhí)行,函數(shù)指針進(jìn)行排序按類別,每個(gè)類別都有其自己的OPS結(jié) 構(gòu)。頂層OPS結(jié)構(gòu)包含的類別OPS結(jié)構(gòu),這可能是NULL如果在subdev驅(qū)動(dòng)程序不支持任何從該類別指針。

復(fù)制代碼
struct v4l2_subdev {
     #if defined(CONFIG_MEDIA_CONTROLLER)
         struct media_entity entity;
     #endif

         struct list_head list;
         struct module *owner;
         u32 flags;
         struct v4l2_device *v4l2_dev;
         const struct v4l2_subdev_ops *ops;

         /* 從驅(qū)動(dòng)程序中不要調(diào)用這些內(nèi)部操作函數(shù)! */
         const struct v4l2_subdev_internal_ops *internal_ops;
         /*這個(gè)subdev控制處理程序??赡苁荖ULL。 */
         struct v4l2_ctrl_handler *ctrl_handler;
         /* 名字必須是唯一 */
         char name[V4L2_SUBDEV_NAME_SIZE];
         /* 可用于到類似subdevs組,值是驅(qū)動(dòng)程序特定的 */
         u32 grp_id;
         /* 私有數(shù)據(jù)的指針 */
         void *dev_priv;
         void *host_priv;
         /* subdev 設(shè)備節(jié)點(diǎn)*/
         struct video_device devnode;
         /* 事件的數(shù)量在打開(kāi)的時(shí)候被分配 */
         unsigned int nevents;
      };
復(fù)制代碼

 4.v4l2_buffer 緩沖區(qū)結(jié)構(gòu)體

復(fù)制代碼
struct v4l2_buffer {
    __u32            index;
    enum v4l2_buf_type      type;
    __u32            byteSUSEd;
    __u32            flags;
    enum v4l2_field        field;
    struct timeval        timestamp;
    struct v4l2_timecode    timecode;
    __u32            sequence;

    /* memory location */
    enum v4l2_memory        memory;
    union {
        __u32           offset;
        unsigned long   userptr;
    } m;
    __u32            length;
    __u32            input;
    __u32            reserved;
};
復(fù)制代碼

   V4L2核心API提供了一套標(biāo)準(zhǔn)方法的用于處理視頻緩沖器(稱為“videobuf”)。這些方法允許驅(qū)動(dòng)程序以一致的方式來(lái)實(shí)現(xiàn) read(),mmap()和overlay()。目前使用的設(shè)備上的視頻緩沖器,支持scatter/gather方法(videobuf-dma- SG),線性存取的DMA的(videobuf-DMA-contig),vmalloc分配的緩沖區(qū),主要用于在USB驅(qū)動(dòng)程序(DMA緩沖區(qū)的方法 videobuf-vmalloc)。

   videobuf層的功能為一種V4L2驅(qū)動(dòng)和用戶空間之間的粘合層。它可以處理存儲(chǔ)視頻幀緩沖區(qū)的分配和管理。有一組可用于執(zhí)行許多標(biāo)準(zhǔn)的POSIX I / O系統(tǒng)調(diào)用的功能,包括read(),poll()的,happily,mmap()。另一套功能可以用來(lái)實(shí)現(xiàn)大部分的V4L2的ioctl()調(diào)用相關(guān) 的流式I/ O的,包括緩沖區(qū)分配,排隊(duì)和dequeueing,流控制。驅(qū)動(dòng)作者使用videobuf規(guī)定了一些設(shè)計(jì)決定,但回收期在驅(qū)動(dòng)器和一個(gè)V4L2的用戶空 間API的貫徹實(shí)施在減少代碼的形式。

   關(guān)于videobuf的層的更多信息,請(qǐng)參閱Documentation/video4linux/videobuf

 

Sample驅(qū)動(dòng)源碼分析:vivi.c 虛擬視頻驅(qū)動(dòng)程序

                      ----- 此代碼模擬一個(gè)真正的視頻設(shè)備V4L2 API (位于drivers/media/video目錄下)

復(fù)制代碼
  入口:+int __init vivi_init(void)

                 + vivi_create_instance(i) /*創(chuàng)建設(shè)備*//**/。

                         + 分配一個(gè)vivi_dev的結(jié)構(gòu)體 /*它嵌套這結(jié)構(gòu)體v4l2_device 和video_device*/

                         + v4l2_device_register(NULL, &dev->v4l2_dev);/*注冊(cè)vivi_dev中的V4l2_device*/

                         + 初始化視頻的DMA隊(duì)列

                         + 初始化鎖

                         + video_device_alloc(); 動(dòng)態(tài)分配video_device結(jié)構(gòu)體

                         + 構(gòu)建一個(gè)video_device結(jié)構(gòu)體 vivi_template 并賦給上面分配的video_device

                                static struct video_device vivi_template = {

                                          . name        = "vivi",

                                          .fops           = &vivi_fops,

                                          .ioctl_ops     = &vivi_ioctl_ops,

                                          .minor        = -1,

                                          .release    = video_device_release,

                                          .tvnorms              = V4L2_STD_525_60,

                                          .current_norm         = V4L2_STD_NTSC_M,

                                 };

                       + video_set_drvdata(vfd, dev);設(shè)置驅(qū)動(dòng)程序?qū)S袛?shù)據(jù)

                       + 所有控件設(shè)置為其默認(rèn)值

                       + list_add_tail(&dev->vivi_devlist, &vivi_devlist);添加到設(shè)備列表

          + 構(gòu)建 v4l2_file_operations 結(jié)構(gòu)體vivi_fops 并實(shí)現(xiàn).open .release .read .poll .mmap函數(shù)

                            ----- .ioctl 用標(biāo)準(zhǔn)的v4l2控制處理程序

          + 構(gòu)建 v4l2_ioctl_ops結(jié)構(gòu)體 vivi_ioctl_ops

                             static const struct v4l2_ioctl_ops vivi_ioctl_ops = {

                                        .vidioc_querycap      = vidioc_querycap,

                                        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,

                                        .vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,

                                        .vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,

                                        .vidioc_reqbufs       = vidioc_reqbufs,

                                        .vidioc_querybuf      = vidioc_querybuf,

                                        .vidioc_qbuf          = vidioc_qbuf,

                                        .vidioc_dqbuf         = vidioc_dqbuf,

                                        .vidioc_s_std         = vidioc_s_std,

                                        .vidioc_enum_input    = vidioc_enum_input,

                                        .vidioc_g_input       = vidioc_g_input,

                                        .vidioc_s_input       = vidioc_s_input,

                                        .vidioc_queryctrl     = vidioc_queryctrl,

                                        .vidioc_g_ctrl        = vidioc_g_ctrl,

                                        .vidioc_s_ctrl        = vidioc_s_ctrl,

                                        .vidioc_streamon      = vidioc_streamon,

                                        .vidioc_streamoff     = vidioc_streamoff,

                             #ifdef CONFIG_VIDEO_V4L1_COMPAT

                                       .vidiocgmbuf          = vidiocgmbuf,

                           #endif

                       };

           + int vivi_open(struct file *file)

                     + vivi_dev *dev = video_drvdata(file);  訪問(wèn)驅(qū)動(dòng)程序?qū)S脭?shù)據(jù)

                     + 分配+初始化句柄(vivi_fh)數(shù)據(jù)

                     + 重置幀計(jì)數(shù)器

                     + videobuf_queue_vmalloc_init(); 初始化視頻緩沖隊(duì)列

                     + 開(kāi)啟一個(gè)新線程用于開(kāi)始和暫停

           + 實(shí)現(xiàn)自定義的v4l2_ioctl_ops 函數(shù)
復(fù)制代碼

注* 本文撰寫(xiě)主要參考了linux公社的文章《Android設(shè)備驅(qū)動(dòng)之——V4L2》

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多