1 Linux内核之Camera驱动分析-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux内核之Camera驱动分析

冬至配饺子 来源:嵌入式软件开发交流 作者:young 2022-08-07 16:08 次阅读

Camera驱动分析

Linux版本:4.19

Sensor: OV13850

(1)装载和卸载函数

//DTS匹配表
static const struct of_device_id ov13850_of_match[] = {
{.compatible = "omnivision,ov13850-v4l2-i2c-subdev"},
{},
};

MODULE_DEVICE_TABLE(i2c, ov13850_id);

static struct i2c_driver ov13850_i2c_driver = {
.driver = {
.name = ov13850_DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = ov13850_of_match
},
.probe = ov13850_probe,
.remove = ov13850_remove,
.id_table = ov13850_id,
};

module_i2c_driver(ov13850_i2c_driver);
OV13850是使用I2C接口进行控制,所以使用i2c_driver进行注册。

(2)probe()

static int ov13850_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
dev_info(&client->dev, "probing...\n");

ov13850_filltimings(&ov13850_custom_config); //填充时序信息
v4l2_i2c_subdev_init(&ov13850.sd, client, &ov13850_camera_module_ops); //初始化v4l2_subdev
ov13850.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
ov13850.custom = ov13850_custom_config;

mutex_init(&ov13850.lock);
dev_info(&client->dev, "probing successful\n");
return 0;
}
上面主要是根据全局变量ov13850_custom_config中的信息填充时序信息。然后初始化v4l2_subdev, ov13850是I2C接口,所以使用v4l2_i2c_subdev_init 进行初始化。v4l2_i2c_subdev_init就是对v4l2_subdev_init的封装。

//v4l2_subdev_ops
static struct v4l2_subdev_ops ov13850_camera_module_ops = {
.core = &ov13850_camera_module_core_ops, //核心操作
.video = &ov13850_camera_module_video_ops, //video操作
.pad = &ov13850_camera_module_pad_ops
};

static struct ov_camera_module_custom_config ov13850_custom_config = {
.start_streaming = ov13850_start_streaming, //sensor开始输出数据流
.stop_streaming = ov13850_stop_streaming, //sensor停止输出数据流
.s_ctrl = ov13850_s_ctrl,
.s_ext_ctrls = ov13850_s_ext_ctrls, //sensor控制(设置自动曝光控制)
.g_ctrl = ov13850_g_ctrl,
.g_timings = ov13850_g_timings, //获取sensor时序
.check_camera_id = ov13850_check_camera_id, //读取Sensor ID
.s_vts = ov13850_auto_adjust_fps, //自动调节刷新率
.set_flip = ov13850_set_flip, //设置sensor镜像
#ifdef OV13850_ONE_LANE
.configs = ov13850_onelane_configs, //单lane的配置信息(分辨率,刷新率等)
.num_configs = ARRAY_SIZE(ov13850_onelane_configs),

#else
.configs = ov13850_configs, //多lane的配置信息
.num_configs = ARRAY_SIZE(ov13850_configs),
#endif
.power_up_delays_ms = {5, 20, 0},
/*
*0: Exposure time valid fileds; 曝光时间
*1: Exposure gain valid fileds; 曝光增益
*(2 fileds == 1 frames)
*/
.exposure_valid_frame = {4, 4}
};
上面设置的回调基本都是去设置寄存器

(3)打开数据流

static int ov13850_start_streaming(struct ov_camera_module *cam_mod)
{
int ret = 0;

ov_camera_module_pr_debug(cam_mod,
"active config=%s\n", cam_mod->active_config->name);

ret = ov13850_g_VTS(cam_mod, &cam_mod->vts_min);
if (IS_ERR_VALUE(ret))
goto err;

mutex_lock(&cam_mod->lock);
ret = ov_camera_module_write_reg(cam_mod, 0x0100, 1); //写0x0100寄存器, 选择streaming模式 0:standby 1:streaming
mutex_unlock(&cam_mod->lock);
if (IS_ERR_VALUE(ret))
goto err;

msleep(25);

return 0;
err:
ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n",
ret);
return ret;
}
主要就是操作寄存器,开启数据流传输。其他的一些操作函数也基本类似。

总结

我们从上面的内容中可以看出,sensor端的驱动没有特别复杂,主要是一些参数和控制相关的内容。sensor主要是生产数据,而数据的处理主要交给ISP。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209322
  • LINUX内核
    +关注

    关注

    1

    文章

    316

    浏览量

    21644
  • I2C接口
    +关注

    关注

    1

    文章

    125

    浏览量

    25190
  • OV13850
    +关注

    关注

    0

    文章

    2

    浏览量

    2325
收藏 人收藏

    评论

    相关推荐

    Linux编译驱动内核及应用程序分析

    作为一名嵌入式Linux新手,在学习的过程中会遇到很多问题。写了一个驱动程序怎么编译?怎么加载进内核
    的头像 发表于 01-17 13:46 6635次阅读
    <b class='flag-5'>Linux</b>编译<b class='flag-5'>驱动</b>、<b class='flag-5'>内核</b>及应用程序<b class='flag-5'>分析</b>

    Linux驱动分析input子系统

    Linux内核为了能够处理各种不同类型的输入设备,比如: 触摸屏 ,鼠标 , 键盘 , 操纵杆等设备 ,设计并实现了Linux 输入子系统 ,它为驱动和应用提供了统一的接口函数,方便实
    发表于 02-01 10:38 533次阅读

    s3c2440 mmc和cameralinux驱动

    本站提供的s3c2440 mmc和cameralinux驱动资料,详细讲诉了s3c2440 mmc和cameralinux
    发表于 05-25 15:53 54次下载
    s3c2440 mmc和<b class='flag-5'>camera</b>的<b class='flag-5'>linux</b><b class='flag-5'>驱动</b>

    基于Linux内核输入子系统的驱动研究

    Linux因其完全开放的特性和稳定优良的性能深受欢迎,当推出了内核输入子系统后,更方便了嵌入式领域的驱动开放。介绍了Linux的设备驱动基础
    发表于 09-12 16:38 23次下载

    linux内核启动内核解压过程分析

    linux启动时内核解压过程分析,一份不错的文档,深入了解内核必备
    发表于 03-09 13:39 1次下载

    linux2.6内核设备驱动模型精华

    linux 内核驱动部分详解
    发表于 04-27 10:43 20次下载

    基于Linux 2.6内核Makefile分析

    基于2.4内核的,可以说关于2.6内核Makefile相关的文章凤毛麟角,笔者抽时间完成了这篇分析文章,让读者迅速熟悉Linux最新Makefile体系,从而加深对
    发表于 09-18 19:09 0次下载
    基于<b class='flag-5'>Linux</b> 2.6<b class='flag-5'>内核</b>Makefile<b class='flag-5'>分析</b>

    Linux内核输入子系统的驱动研究

    Linux内核输入子系统的驱动研究
    发表于 10-31 14:41 14次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>输入子系统的<b class='flag-5'>驱动</b>研究

    关于Linux 2.6内核Makefile的分析

    的介绍文章都是基于2.4内核的,可以说关于2.6内核Makefile相关的文章凤毛麟角,笔者抽时间完成了这篇分析文章,让读者迅速熟悉Linux最新Makefile体系,从而加深对
    发表于 11-02 10:12 1次下载

    Embeded linuxsoc camera

    soc_camera_device_init(&icd->dev, icl);//设置soc_came_device对应device的bus为soc_camera_bus_type,这样当我们注册设备时,就会调用soc_camera
    发表于 05-15 13:49 1520次阅读

    如何使用Linux内核实现USB驱动程序框架

    Linux内核提供了完整的USB驱动程序框架。USB总线采用树形结构,在一条总线上只能有唯一的主机设备。 Linux内核从主机和设备两个角度
    发表于 11-06 17:59 20次下载
    如何使用<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>实现USB<b class='flag-5'>驱动</b>程序框架

    Linux内核ISP驱动流程分析

    应用层就是通过访问video_device生成的节点来进行操作Camera,所以video_device注册时指定了很多ioctl函数。
    的头像 发表于 08-07 16:13 5869次阅读

    Linux内核SoftIrq源代码分析

    我们在分析linux内核中断剖析时,简单的聊了一下SOFTIRQ, 而没有进行深入分析. Linux内核
    发表于 06-23 15:22 588次阅读

    Linux内核代码60%都是驱动

    为什么Linux内核代码60%都是驱动? 如果每支持新的设备就加入驱动内核会不会变得越来越臃肿?
    的头像 发表于 07-11 11:48 933次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>代码60%都是<b class='flag-5'>驱动</b>?

    linux驱动程序如何加载进内核

    Linux系统中,驱动程序是内核与硬件设备之间的桥梁。它们允许内核与硬件设备进行通信,从而实现对硬件设备的控制和管理。 驱动程序的编写
    的头像 发表于 08-30 15:02 439次阅读