三星FIMC架构分析

一. 涉及的文件作用说明
drivers\media\video\s5p-fimc\fimc-mdevice.c---------整个模块的主入口函数,里面实现的是一种框架,无实质硬件bsp操作。需要以下文件的实现来填充此框架实现具体的功能
drivers\media\video\s5p-fimc\fimc-core.c---------涉及实质的硬件bsp操作,属于fimc-mdevice.c的子功能
drivers\media\video\s5p-fimc\fimc-capture.c---------属于fimc-core.c的子功能
drivers\media\video\s5p-fimc\fimc-m2m.c---------涉及实质的硬件bsp操作,属于fimc-core.c的子功能,与fimc-capture.c属于同级别功能
drivers\media\video\s5p-fimc\fimc-lite.c---------涉及实质的硬件bsp操作,与fimc-core.c属于同级别功能
drivers\media\video\s5p-fimc\mipi-csis.c---------涉及实质的硬件bsp操作,与fimc-core.c属于同级别功能

二.框架介绍(主要是fimc-mdevice.c的实现)
1. 注册平台driver。有以下5中driver,由于这5种同级别,所以由宏来定义使用其中的哪些个。典型使用的就是fimc-core.c fimc-capture.c fimc-m2m.c这3个平台driver.真正触发这些平台driver,需要开发人员写好正确的平台device
(fimc-core.c fimc-capture.c fimc-m2m.c fimc-lite.c mipi-csis.c)
2. 框架核心处,总的结构体是struct fimc_md
2.1 申请空间 fmd = devm_kzalloc(&pdev->dev, sizeof(*fmd), GFP_KERNEL);
2.2 对总结构体进行设置,主要是名称啊什么的,其实不重要
2.3 fimc_md_register_platform_entities(fmd); 注册平台实体(很重要),见2.3节
2.4 fimc_md_register_sensor_entities(fmd); 注册sensor实体(很重要),见2.4节
2.5 v4l2_device_register_subdev_nodes(&fmd->v4l2_dev);    //根据v4l2_subdev注册各种/dev/video*视频节点

2.3节
fimc_md_register_platform_entities(fmd); 注册平台实体
1. 根据名称查询得到所有的平台driver。这些平台driver就是(fimc-core.c fimc-capture.c fimc-m2m.c fimc-lite.c mipi-csis.c)这些函数实现的平台driver
涉及查找的名称有,"s5p-fimc","s5p-mipi-csis","exynos-fmic-lite",这样就能查找到平台driver,也让(fimc-core.c fimc-capture.c fimc-m2m.c fimc-lite.c mipi-csis.c)这些的实现能被调用,有用武之地
2. 调用 v4l2_device_register_subdev() 函数,会触发平台driver的register函数。这样比如fimc-capture.c里的register函数被调用,进行一系列复杂的操作

2.4节
fimc_md_register_sensor_entities(fmd); 注册sensor实体
1. 获得sensor传感器的信息(比如使用的iic总线编号,该sensor的地址等)
2. 根据sensor信息,触发对应sensor的driver驱动,并返回v4l2_subdev.这个v4l2_subdev就会在2.5 v4l2_device_register_subdev_nodes()函数里注册成具体的/dev/video*节点

至此,整个框架就是这样,非常简单!


三. 子模块的分析
子模块的分析就拿fimc-core.c来分析,它是一个平台driver,用户设置好平台device后,它就被调用
int fimc_probe(struct platform_device *pdev)
1. 创建属于它的总结构体
fimc = devm_kzalloc(&pdev->dev, sizeof(*fimc), GFP_KERNEL);
2. 对这个结构体进行设置(寄存器地址,时钟,中断等信息)
其中最重要的注册信息是sd->internal_ops = &fimc_capture_sd_internal_ops; fimc_capture_sd_internal_ops它的内部有个register()接口,与2.3节的第二点相呼应。具体接口如下:
int fimc_capture_subdev_registered(struct v4l2_subdev *sd)
3. 分析int fimc_capture_subdev_registered(struct v4l2_subdev *sd)函数
主要就是使用v4l2架构注册一个/dev/video*的过程,很枯燥。数据使用的是videobuffer2,衍生出一系列的open,read,write,ioctl去实现,很枯燥乏味,但代码量很多

四. 如何使用?
比较关心的是实际工作中会涉及哪些才能让一个camera正常运行起来呢?
1. camera控制器部分的平台device设置。包括寄存器首地址,中断号等信息。(这部分其实不重要,开发板厂商提供的源码一般会设置好)
2. sensor驱动部分(很重要,需要自己去写代码实现)。2.4节的第2点提到会触发对应sensor的driver驱动,这部分需要自己去实现,厂商没法帮你实现这一部分。这也是camera驱动开发移植的最主要部分了

总结:
至此,整个fimc模块都分析完了,其中注册了好多个/dev/video*结构体,有对camera控制器的,有对sensor的,有对m2m的,还有lite,is等。
各个子模块都有各自的总数据结构,各自分散,比较凌乱。最后通过fimc-mdevice.c的实现,将各个凌乱的数据结构连接在一起,这也是fimc-mdevice.c框架的意义!清楚了解了如何将各个凌乱的数据结构连接在一起,也就了解了FIMC的精华!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值