色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

看看Linux為相機提供的驅動框架

冬至配餃子 ? 來源:嵌入式軟件開發交流 ? 作者:年輕的 ? 2022-08-07 16:03 ? 次閱讀

前言

前面我們了解了一些相機的基礎知識《相機基礎知識》。下面來看看Linux為相機提供的驅動框架。

V4L2簡介

V4L2 (Video Linux Two),是為支持Linux內核設計的驅動框架驅動框架。為應用設置的操作接口層(ioctl),是在提供更廣泛的時候它的設備,它們只有在原件上,才是真正的視頻設備,所以它們才是真正的攝像頭設計。

V4L2框架

poYBAGLvcXOAU-5_AACaFZ8UYXM697.png

在應用層,可以在 /dev 顯示設備節點,程序打開設備設備進行我們的設備目錄發現應用程序0、視頻畫面。video1、video2...這些設備節點是在核心層注冊。

v4l2-dev.c) 起承上啟下的作用,它會為每一個核心層注冊中的設備設置一個統一的 v4l2_fops ,這些統一驅動的接口最終將調用到驅動的 video_device 的 fops 。

重要結構體

視頻設備

視頻設備

//表示一個視頻設備

struct video_device {

#if defined(CONFIG_MEDIA_CONTROLLER);

struct media_entity entity;

struct media_intf_devnode *intf_devnode;

struct media_pipeline pipe;

#endif;

const struct v4l2_file_operations *fops; //文件操作接口(dev/videoX)

u32 device_caps; //設備功能,用于v4l2_capabilities(應用層定義的結構體)

struct device dev;

struct cdev *cdev; //字符設備

struct v4l2_device *v4l2_dev; //V4L2設備

struct device *dev_parent;

struct v4l2_ctrl_handler *ctrl_handler; //設備節點對應的控制句柄

struct vb2_queue *queue;

struct v4l2_prio_state *prio;

char name[32]; //Video設備名稱

enum vfl_devnode_type vfl_type; //V4L設備類型

enum vfl_devnode_direction vfl_dir; //V4L 接收者/發送者/m2m

int minor; //子設備號,主設備為81

u16 num;

unsigned long flags;

int index;

spinlock_t fh_lock;

struct list_head fh_list;

int dev_debug;

v4l2_std_id tvnorms;

void (*release)(struct video_device *vdev); //video_device release()回調

const struct v4l2_ioctl_ops *ioctl_ops; //IOCTL回調

unsigned long valid_ioctls[BITS_TO_LONGS(BASE_VIDIOC_PRIVATE)];

struct mutex *lock;

};

v4l2_device

struct v4l2_device {

struct device *dev;

struct media_device *mdev;

struct list_head subdevs; //用于追蹤已注冊的subdev

spinlock_t lock;

char name[V4L2_DEVICE_NAME_SIZE]; //設備名

void (*notify)(struct v4l2_subdev *sd, unsigned int notification, void *arg);

struct v4l2_ctrl_handler *ctrl_handler; //控制句柄

struct v4l2_prio_state prio; //設備的優先狀態

struct kref ref; //引用

void (*release)(struct v4l2_device *v4l2_dev);//引用計數為0后調用

};

嵌入到video_device中,表示一個v4l2設備實例。

v4l2_subdev

struct v4l2_subdev {

#if defined(CONFIG_MEDIA_CONTROLLER);

struct media_entity entity;

#endif;

struct list_head list; //subdev列表

struct module *owner;

bool owner_v4l2_dev;

u32 flags;

struct v4l2_device *v4l2_dev; //依附的v4l2_device

const struct v4l2_subdev_ops *ops; //subdev操作函數

const struct v4l2_subdev_internal_ops *internal_ops;

struct v4l2_ctrl_handler *ctrl_handler; //控制句柄

char name[V4L2_SUBDEV_NAME_SIZE]; //subdev名稱

u32 grp_id;

void *dev_priv;

void *host_priv;

struct video_device *devnode;

struct device *dev;

struct fwnode_handle *fwnode;

struct list_head async_list;

struct v4l2_async_subdev *asd;

struct v4l2_async_notifier *notifier;

struct v4l2_async_notifier *subdev_notifier;

struct v4l2_subdev_platform_data *pdata;//subdev平臺數據

};

依附在一個v4l2_device下面,并表示一個v4l2設備的子設備,v4l2_device下可以有多個sub_device。

v4l2_fh

struct v4l2_fh {

struct list_head list; //文件句柄列表

struct video_device *vdev; //依附的video_device

struct v4l2_ctrl_handler *ctrl_handler;

enum v4l2_priority prio; //文件句柄的優先級

wait_queue_head_t wait;

struct mutex subscribe_lock;

struct list_head subscribed; //訂閱的事件列表

struct list_head available; //可用的事件

unsigned int navailable; //可用的事件數

u32 sequence;

struct v4l2_m2m_ctx *m2m_ctx;

};

追蹤的文件句柄用于

v4l2_device和v4l2_subdev的關系:

subdev 的設計目的是為了多路復用,就是控制使用一個v4l2_device可以掛接多個v4l2_subdev。這樣的多路復用就是一個攝像頭來多個攝像頭。手機和后置攝像頭。

在V4L2驅動中,使用v4l2_device來表示攝像頭攝像頭(ISP)。使用v4l2_subdev來表示具體的某個攝像頭(Sensor)。

v4l2_file_operations

//V4L2設備操作函數

struct v4l2_file_operations {

struct module *owner;

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

__poll_t (*poll) (struct file *, struct poll_table_struct *);

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

#ifdef CONFIG_COMPAT;

long (*compat_ioctl32) (struct file *, unsigned int, unsigned long);

#endif;

unsigned long (*get_unmapped_area) (struct file *, unsigned long, unsigned long, unsigned long, unsigned long);

int (*mmap) (struct file *, struct vm_area_struct *);

int (*open) (struct file *);

int (*release) (struct file *);

};

v4l2_ioctl_ops

//IOCTL操作函數

struct v4l2_ioctl_ops {

......

int (*vidioc_overlay)(struct file *file, void *fh, unsigned int i);

int (*vidioc_g_fbuf)(struct file *file, void *fh, struct v4l2_framebuffer *a);

int (*vidioc_s_fbuf)(struct file *file, void *fh, const struct v4l2_framebuffer *a);

int (*vidioc_streamon)(struct file *file, void *fh, enum v4l2_buf_type i);

int (*vidioc_streamoff)(struct file *file, void *fh, enum v4l2_buf_type i);

......

int (*vidioc_enum_framesizes)(struct file *file, void *fh, struct v4l2_frmsizeenum *fsize);

int (*vidioc_enum_frameintervals)(struct file *file, void *fh, struct v4l2_frmivalenum *fival);

int (*vidioc_s_dv_timings)(struct file *file, void *fh, struct v4l2_dv_timings *timings);

int (*vidioc_g_dv_timings)(struct file *file, void *fh, struct v4l2_dv_timings *timings);

int (*vidioc_query_dv_timings)(struct file *file, void *fh, struct v4l2_dv_timings *timings);

int (*vidioc_enum_dv_timings)(struct file *file, void *fh, struct v4l2_enum_dv_timings *timings);

int (*vidioc_dv_timings_cap)(struct file *file, void *fh, struct v4l2_dv_timings_cap *cap);

int (*vidioc_g_edid)(struct file *file, void *fh, struct v4l2_edid *edid);

int (*vidioc_s_edid)(struct file *file, void *fh, struct v4l2_edid *edid);

int (*vidioc_subscribe_event)(struct v4l2_fh *fh, const struct v4l2_event_subscription *sub);

int (*vidioc_unsubscribe_event)(struct v4l2_fh *fh, const struct v4l2_event_subscription *sub);

long (*vidioc_default)(struct file *file, void *fh, bool valid_prio, unsigned int cmd, void *arg);

};

v4l2_subdev_ops

//subdev操作函數

struct v4l2_subdev_ops {

const struct v4l2_subdev_core_ops *core; //subdev核心操作回調

const struct v4l2_subdev_tuner_ops *tuner; //radio模式打開v4l設備時的操作回調

const struct v4l2_subdev_audio_ops *audio; //音頻相關設置回調

const struct v4l2_subdev_video_ops *video; //video模式打開v4l設備時的操作回調

const struct v4l2_subdev_vbi_ops *vbi; //通過vbi設備節點以video模式打開v4l設備時的操作回調

const struct v4l2_subdev_ir_ops *ir; //IR(紅外)設備操作函數

const struct v4l2_subdev_sensor_ops *sensor; //sensor操作函數

const struct v4l2_subdev_pad_ops *pad; //pad操作函數

};

v4l22,所以多部分可以輕松地根據實際設備的需要實現的設備。

上面的_ioctl_ops中實現的部分ioctl最終到v4l2_dev_ops中的調用子函數。

API函數

//注冊/注銷video_device

int video_register_device(struct video_device *vdev, enum vfl_devnode_type type, int nr)

void video_unregister_device(struct video_device *vdev)

//分配/釋放video_device

struct video_device * __must_check video_device_alloc(void);

void video_device_release(struct video_device *vdev)

//注冊/注銷v4l2_device

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

void v4l2_device_unregister(struct v4l2_device *v4l2_dev)

//注冊/注銷v4l2_subdev(關聯v4l2_device和v4l2_subdev)

int v4l2_device_register_subdev(struct v4l2_device *v4l2_dev, struct v4l2_subdev *sd)

void v4l2_device_unregister_subdev(struct v4l2_subdev *sd)

//初始化v4l2_subdev

void v4l2_subdev_init(struct v4l2_subdev *sd, const struct v4l2_subdev_ops *ops);

/********************************I2C subdev*************************************/

//初始化v4l2_subdev, 該subdev是I2C設備

void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client,

const struct v4l2_subdev_ops *ops)

/*******************************SPI subdev************************************************/

//初始化v4l2_subdev, 該subdev是SPI設備

void v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi,

const struct v4l2_subdev_ops *ops)



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209332
  • 攝像頭
    +關注

    關注

    59

    文章

    4836

    瀏覽量

    95599
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21644
收藏 人收藏

    評論

    相關推薦

    Linux之PWM驅動

    本文主要講述了Linux的PWM驅動框架、實現方法、驅動添加方法和調試方法。
    發表于 05-25 09:19 ?671次閱讀
    <b class='flag-5'>Linux</b>之PWM<b class='flag-5'>驅動</b>

    linux驅動框架是什么

    編寫linux驅動先看一下驅動框架是什么樣子的。驅動編寫和應用層編寫有什么區別呢?
    發表于 07-26 08:14

    Linux下的UART驅動框架詳解

    Linux下的UART驅動框架
    發表于 12-22 07:18

    Linux 驅動 = 軟件框架 + 硬件操作

    ??Linux 驅動 = 軟件框架 + 硬件操作??驅動程序依賴于 Linux 內核,你開發板
    發表于 12-17 07:11

    OpenHarmony相機用戶態驅動框架

    Linux采用的開源協議具有傳染性[1],導致Android HAL[2]成為了手機廠商們競爭的重要戰場。隨著OpenHarmony 3.1[3]的發布,相機模塊也逐漸完善起來,目前提供了基礎預覽和拍照的能力
    發表于 04-20 17:09

    想要駕馭Linux驅動開發,必須深刻理解Linux總線設備驅動框架

    想要駕馭Linux驅動開發,必須深刻理解Linux總線設備驅動框架。之所以會形成這樣的框架,主要
    的頭像 發表于 03-22 11:08 ?1.1w次閱讀
    想要駕馭<b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>開發,必須深刻理解<b class='flag-5'>Linux</b>總線設備<b class='flag-5'>驅動</b><b class='flag-5'>框架</b>

    Linux DMA Engine框架的介紹

    此會話描述如何從設備驅動程序在Linux中使用DMA。 這包括內存分配,緩存控制和DMA設備控制。 詳細介紹了Linux DMA Engine框架
    的頭像 發表于 11-23 06:29 ?6303次閱讀

    你對Linux總線設備驅動框架是否了解

    Linux的設備驅動模型,或者說,Linux的設備驅動框架,都是同一個意思。應該這樣理解,(Linux
    發表于 05-05 15:13 ?734次閱讀

    如何使用Linux內核實現USB驅動程序框架

    Linux內核提供了完整的USB驅動程序框架。USB總線采用樹形結構,在一條總線上只能有唯一的主機設備。 Linux內核從主機和設備兩個角度
    發表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b>內核實現USB<b class='flag-5'>驅動</b>程序<b class='flag-5'>框架</b>

    嵌入式Linux驅動開發從基礎到框架

    想講好嵌入式Linux驅動開發并不容易,各位業界大神最基礎的字符驅動到中斷并發再到驅動框架、應用層調用。但是總覺得業界寫的書都是點到為止,
    發表于 11-01 16:58 ?14次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>開發從基礎到<b class='flag-5'>框架</b>

    IAR 實現類linux驅動模塊框架module_init(init_fun)

    其實在單片機上也能使用類linux驅動模塊框架module_init(init_fun),從而給驅動管理提供了新的方式。boot.icf文件
    發表于 12-03 13:36 ?0次下載
    IAR 實現類<b class='flag-5'>linux</b><b class='flag-5'>驅動</b>模塊<b class='flag-5'>框架</b>module_init(init_fun)

    Linux內核中視頻設備驅動框架V4L2X詳解

    V4L2(Video for Linux 2):Linux內核中關于視頻設備驅動框架,對上向應用層提供統一的接口,對下支持各類復雜硬件的靈
    的頭像 發表于 05-30 16:18 ?6148次閱讀

    Linux的PWM驅動框架及實現方法

    本文主要講述了Linux的PWM驅動框架、實現方法、驅動添加方法和調試方法。
    的頭像 發表于 05-14 15:24 ?1434次閱讀
    <b class='flag-5'>Linux</b>的PWM<b class='flag-5'>驅動</b><b class='flag-5'>框架</b>及實現方法

    Linux驅動分析之RTC框架

    Linux內核啟動時,它會從RTC中讀取時間與日期,作為基準值。然后通過軟件來維護系統時間和日期。Linux系統中提供了RTC核心層,對于驅動開發者而言,操作起來就變得很簡單了。我們
    的頭像 發表于 05-26 15:12 ?1034次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>分析之RTC<b class='flag-5'>框架</b>

    Linux Regmap 驅動框架

    ,regmap 向驅動編寫人員提供的 API 接口,驅動編寫人員使用這些API 接口來操作具體的芯片設備,也是驅動編寫人員重點要掌握的。 2、regmap 結構體
    的頭像 發表于 07-06 17:29 ?1111次閱讀
    <b class='flag-5'>Linux</b> Regmap <b class='flag-5'>驅動</b><b class='flag-5'>框架</b>
    主站蜘蛛池模板: 精彩国产萝视频在线| 国产精品1卡二卡三卡四卡乱码 | 精品少妇爆AV无码专区| 强开少妇嫩苞又嫩又紧九色| 破女在线观看视频| 翁用力的抽插| 亚洲精品国产自在在线观看| 亚洲色噜噜狠狠站欲八| 在线亚洲专区中文字幕| 99热久久视频只有精品6| 超碰在线视频| 国产精品久久久久激情影院| 狠狠色色综合网站| 伦理片 a在线线版韩国| 秋霞av伦理片在线观看| 我和妽妽在厨房里的激情区二区 | 中文有码中文字幕免费视频 | 中文字幕在线视频免费观看| 91精品婷婷国产综合久久8| 苍井空教师BD在线观看全集| 国产精品人成视频免费999| 9LPORM原创自拍达人| AV精品爆乳纯肉H漫网站| 国产Av男人的天堂精品良久| 国产真实女人一级毛片| 噜噜噜在线AV免费观看看| 人妻中文字幕乱人伦在线| 天天躁日日躁狠狠躁AV麻豆| 一本道dvd久久综合高清免费| 99精品视频在线| 国产精品一区二区免费| 久久爽狠狠添AV激情五月| 人妻互换免费中文字幕| 亚洲三级黄色片| 99亚洲精品色情无码久久| 国产亚洲精品久久久久久线投注| 久久这里只有精品国产99| 色欲久久精品AV无码| 中国老头oldday tv| 国产成人精品久久一区二区三区| 九九热视频 这里有精品|