乙個基於v4l2框架的輸出驅動分析

2021-04-23 15:46:47 字數 1793 閱讀 6653

三個結構分析,mxc_v4l2out_fops 向上層註冊其操作,但其上層不是作業系統而是v4l2

static struct file_operations mxc_v4l2out_fops = ;

裝置結構有兩個, 因為即使平台裝置,又是v4l2裝置,,,分別想兩個地方註冊。

static struct video_device mxc_v4l2out_template = ;

static struct platform_device mxc_v4l2out_device = ,

.id = 0,

};平台驅動:

static struct platform_driver mxc_v4l2out_driver = ,

.probe = mxc_v4l2out_probe,

.remove = null,

};mxc_v4l2out_init-》platform_driver_register(&mxc_v4l2out_driver);註冊平台裝置,註冊成功有主要就是呼叫驅動的prode...這裡就是mxc_v4l2out_probe

結構體:

/*!* common v4l2 driver structure.

*/typedef struct _vout_data

vout_data;mxc_v4l2out_probe中有*(vout->video_dev) = mxc_v4l2out_template把v4l2裝置付給 * common v4l2 driver structure.中的video_dev成員

video_register_device向v4l2註冊裝置。。。分析其**:

核心中注釋:

video_register_device - register video4linux devices

* @vfd: video device structure we want to register

* @type: type of device to register

* @nr: which device number (0 == /dev/video0, 1 == /dev/video1, ...

* -1 == first free)

*v4l2裝置分四種不通的型別:video ,vtx,vbi,radio分別有佔不同的

static struct video_device *video_device[video_num_devices];全域性的vide_device結構,靜態在本檔案有效

其中分配乙個指標,,指向註冊的裝置,這樣裝置就註冊成功了(videodev.c)

回到prode中video_set_drvdata(vout->video_dev, vout);繼續吧驅動放到dev->priv中。

接下來分析驅動是如何被呼叫的:

在videodev.c中,videodev_init-》register_chrdev(video_major, video_name, &video_fops)向作業系統註冊了fops..所以,只要是#define video_major 81,,都要由這個ops來呼叫,,其中子裝置就是通過video_register_device來向該高層註冊的

分析ops中的video_open:

file->f_op = fops_get(vfl->fops);

if(file->f_op->open)

err = file->f_op->open(inode,file);

把子裝置相應的fops付給file->f_op,這樣在read,write時候就會呼叫子裝置的read,wrtie了。接下來就是呼叫子裝置的open

V4L2驅動框架

v4l2驅動框架 主裝置號 81 次裝置號 0 63 64 67 192 223 224 255 dev videox 應用層 char驅動 v4l2 具體的驅動 硬體應用層的操作都需要有底層v4l2驅動的支援。核心中有一些非常完善的例子。比如 linux 2.6.26核心目錄drivers med...

V4L2框架分析

uvc probe uvc driver.c硬體相關層,定會分配設定向核心層註冊一結構體 v4l2 device register uvc register chains uvc register terms uvc register video struct video device vdev v...

V4L2程式設計框架

v4l2較v4l有較大的改動,並已成為2.6的標準介面,函蓋video dvb fm 多數驅動都在向v4l2遷移。更好地了解v4l2先從應 來實現。用非阻塞模式開啟攝像頭裝置int camerafd camerafd open dev video0 o rdwr o nonblock,0 如果用阻塞...