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 編譯後,檔案很大,暫且就用人家編譯的系統...