v4l2 程式設計介面 二 driver

2021-08-15 14:10:17 字數 3174 閱讀 2437

1、 video_device

[cpp]view plain

copy

struct

video_device  

;  其中  

struct

cdev ;  

struct

v4l2_file_operations ;  

[cpp]view plain

copy

static

const

struct

v4l2_ioctl_ops ***_cam_ioctl_ops = ;  

該結構各域的作用如上篇文章所述。video_device 通過video_register_device函式註冊,函式原型如下:

[cpp]view plain

copy

/***  video_register_device - 註冊乙個 v4l2 裝置

*  @vdev: video_device 結構

*  @type: v4l2 裝置的型別

*  @nr:   從裝置號(0 == /dev/video0, 1 == /dev/video1, -1 == first free)

**  註冊**將會根據註冊裝置的型別指派從裝置號,如果沒有合適的從裝置號將會返回錯誤值.

**  通常有如下幾種裝置型別**

*  %vfl_type_vtx     - **電視裝置

**  %vfl_type_vbi     - 場消隱區解碼裝置(undecoded)

**  %vfl_type_radio   - 無線裝置

*/int

video_register_device(

struct

video_device *vdev, 

inttype, 

intnr)  

export_symbol(video_register_device);  

該函式註冊流程較簡單:首先會根據裝置型別確定在 /dev 目錄下的節點名稱以及從裝置號的偏移和值,然後為 cdev 申請記憶體空間並註冊,將 vdev->cdev->ops 設定為核心提供的 v4l2_fops,最後將 vdev->dev 註冊到 sysfs 中。

2、v4l2_subdev

[cpp]view plain

copy

struct

v4l2_subdev ;  

其中 list 域作為鍊錶節點鏈結至 v4l2_dev 指向的v4l2_device結構中,這個結構中最重要的成員就是 struct v4l2_subdev_ops *ops,該域包含了 v4l2 裝置支援的所有操作,定義如下:

[cpp]view plain

copy

struct

v4l2_subdev_ops ;  

v4l2_subdev_core_ops包含的操作合集是各種型別裝置通用的:

[cpp]view plain

copy

struct

v4l2_subdev_core_ops ;  

v4l2_subdev_tuner_ops包含的操作合集則是調諧器獨有的:

[cpp]view plain

copy

struct

v4l2_subdev_tuner_ops ;  

v4l2_subdev_audio_ops包含的操作合集則是音訊部分獨有的:

[cpp]view plain

copy

struct

v4l2_subdev_audio_ops ;  

[cpp]view plain

copy

struct

v4l2_subdev_video_ops ;  

因為 v4l2 裝置一般用 i2c 匯流排通訊,所以註冊函式需要提供 i2c_client,函式原型如下:

[cpp]view plain

copy

/***  v4l2_i2c_subdev_init - 註冊乙個 v4l2_subdev

*  @sd: v4l2_subdev 結構

*  @client: 通訊用的i2c裝置

*  @ops: v4l2_subdev_ops 操作合集

*/void

v4l2_i2c_subdev_init(

struct

v4l2_subdev *sd, 

struct

i2c_client *client, 

const

struct

v4l2_subdev_ops *ops)  

當 video_device 中的介面需要呼叫 v4l2_subdev 的成員函式時一般採用如下巨集定義:

[cpp]view plain

copy

/* 呼叫成員函式之前需要先檢查成員函式是否被設定

*  v4l2_subdev_call - 呼叫 v4l2_subdev 成員函式

*  @sd: v4l2_subdev 結構

*  @o:  v4l2_subdev_ops 成員名稱

*  @f:  v4l2_subdev 成員函式

*  @args:  v4l2_subdev 成員函式的引數

使用示例: err = v4l2_subdev_call(sd, core, g_chip_ident, &chip);

*/#define v4l2_subdev_call(sd, o, f, args...)             \

(!(sd) ? -enodev : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ?  \  

(sd)->ops->o->f((sd) , ##args) : -enoioctlcmd))  

V4L2程式設計

include include include include include include include include include include typedef struct buftype buftype user buf int n buffer 0 開啟攝像頭裝置 int ope...

V4L2 程式設計

v4l2程式設計 1.定義 2.工作流程 開啟裝置 檢查和設定裝置屬性 設定幀格式 設定一種輸入輸出方法 緩衝區管理 迴圈獲取資料 關閉裝置。3.裝置的開啟和關閉 include int open const char device name,int flags include int close ...

V4L2程式設計 轉

前言 目前正在忙於arm 平台的linux 應用程式的開發 其實是剛剛起步學習啦 底層的東西不用考慮了,開發板子提供了 nand bootloader 和linux 2.6 的原始碼,而且都編譯好了。自己編譯的 bootloader 可以用,但是 linux 編譯後,檔案很大,暫且就用人家編譯的系統...