閱讀linux的ov2655的驅動程式時,并沒有發現I2C裝置驅動的初始化函數i2c_add_driver,
隻是定義了
static struct v4l2_i2c_driver_data v4l2_i2c_data =
{
.name = S5K4BA_DRIVER_NAME,
.probe = ov2655_probe,
.remove = __devexit_p(ov2655_remove),
.id_table = ov2655_id,
};
其實相關I2C初始化函數在v4l2-i2c-drv.h裡
I2C攝像頭驅動程式都會包含該檔案
#include 該檔案代碼很簡單,I2C驅動初始化如下:
static int __init v4l2_i2c_drv_init(void)
{
//其中的v4l2_i2c_data就是前面提到的在ov2655驅動裡定義結構體。
v4l2_i2c_driver.driver.name = v4l2_i2c_data.name;
v4l2_i2c_driver.command = v4l2_i2c_data.command;
v4l2_i2c_driver.probe = v4l2_i2c_data.probe;
v4l2_i2c_driver.remove = v4l2_i2c_data.remove;
v4l2_i2c_driver.suspend = v4l2_i2c_data.suspend;
v4l2_i2c_driver.resume = v4l2_i2c_data.resume;
v4l2_i2c_driver.id_table = v4l2_i2c_data.id_table;
return i2c_add_driver(&v4l2_i2c_driver);
}
static void __exit v4l2_i2c_drv_cleanup(void)
{
i2c_del_driver(&v4l2_i2c_driver);
}
module_init(v4l2_i2c_drv_init);
module_exit(v4l2_i2c_drv_cleanup);
之後調用v4l2_i2c_driver.probe,也就是v4l2_i2c_data.probe,即ov2655_probe。
注冊子裝置
v4l2_i2c_subdev_init(sd, client, &ov2655_ops);
ov2655_ops包含了操作接口函數的結構體
static const struct v4l2_subdev_core_ops ov2655_core_ops =
{
.init = ov2655_init,
.s_config = ov2655_s_config,
.queryctrl = ov2655_queryctrl,
.querymenu = ov2655_querymenu,
.g_ctrl = ov2655_g_ctrl,
.s_ctrl = ov2655_s_ctrl,
};
static const struct v4l2_subdev_video_ops ov2655_video_ops =
{
.g_fmt = ov2655_g_fmt,
.s_fmt = ov2655_s_fmt,
.enum_framesizes = ov2655_enum_framesizes,
.enum_frameintervals = ov2655_enum_frameintervals,
.enum_fmt = ov2655_enum_fmt,
.try_fmt = ov2655_try_fmt,
.g_parm = ov2655_g_parm,
.s_parm = ov2655_s_parm,
};
static const struct v4l2_subdev_ops ov2655_ops =
{
.core = &ov2655_core_ops,
.video = &ov2655_video_ops,
};
最後調用ov2655_init完成攝像頭初始化。
閱讀(1050) | 評論(0) | 轉發(0) |