资讯详情

三星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,由于这五个等级相同,宏来定义使用哪一个。典型的用途是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.第三节的第二点相互呼应。具体接口如下: 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驱动部分(很重要,需要自己写代码实现)。.4节的第2点将触发相应的sensor的driver驱动,这部分需要自己实现,厂家不能帮你实现这部分。这也是。camera驱动开发和移植的主要部分

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

标签: fmd68m连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台