海思3518E开发笔记4.4——sensor驱动源码分析

驱动目录

在SDK的\Hi3518E_SDK_V1.0.3.0\package\mpp\ko底下
hi3518e_isp.ko是isp相关部分驱动

sensor部分的源码在\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor

可以通过Makefile看到编译出来的驱动
在这里插入图片描述
编出来的驱动放到了lib目录中

sample中相关部分分析

系统一开始进行内存分配、mpp初始化,等操作,做完之后就开始进入vi部分

vi部分的第一步就是配置sensor的接口
在这里插入图片描述
在VI开始的时候,会根据sensor的名字进行配置mipi,如果是mipi接口就配置mipi,不是就配置为空

接口配置完之后,就是isp的初始化SAMPLE_COMM_ISP_Init
在这里插入图片描述
这个callback就是在驱动里面,sensor驱动里的所有函数就是通过这个函数和应用层关联起来的


这里要注意的是,这里的sensor驱动不是内核驱动,是应用层驱动。
真正的内核不是lib是ko,使用insmod进行安装,这才是真正工作在内核态的。
这里使用的是应用层驱动,好处是灵活。比如这里sensor改了,是不用去重新编译烧录内核的,只需要将新的sensor对于的.a和.so编译一下,再链接进去运行就可以了,不用动内核。
应用层驱动的坏处是很容易被替换,所以不稳定性是有的,本身的效率与纯内核层的驱动相比效率没有那么高

应用层驱动一定是基于一个工作在内核层的驱动的,而不是自己去操作对应的寄存器,这里的内核层驱动就指的就是I2C驱动。


sensor_register_callback进去ar0130的应用层驱动
在这里插入图片描述
后两段是3A算法中的AE和AW
关键的是第一个配置AR0130的寄存器cmos_init_sensor_exp_function
在这里插入图片描述
以内部第一个函数sensor_init为例,里面是sensor支持的两种原始尺寸
在这里插入图片描述

sensor_init_720p_30fps为例
在这里插入图片描述
有非常多配置寄存器的操作,那怎么写呢,肯定是通过I2C总线

追入sensor_write_register,看到内部有一个编译选项#ifdef HI_GPIO_I2C
海思定义了两种I2C,一种是硬件I2C,一种是软件GPIO模拟I2C

追入sensor_i2c_init函数,可以看到
在这里插入图片描述
内核里实现了一个驱动,叫i2c-0,是海思将硬件上的i2c-0硬件接口封装出来的。它是一个总线驱动,工作在内核态,实际不同的sensor应用层驱动,就是调用的这一个驱动进行硬件的去写。

所以sensor驱动中,没有i2c底层操作,只有i2c层次的操作,即只管往i2c发的东西,不管它是怎么发的。

海思中的sensor驱动框架

mpp中定义了一套sensor驱动的实现和封装(应用层驱动)

每一个sensor的应用层驱动包含两个文件

  • xxxx_cmos.c中定义回调和上层函数(面向功能)
  • xxxx_sensor_ctl.c中定义底层硬件相关的寄存器值配置函数(底层)

kernel中的I2C驱动提供I2C层面的物理层操作接口,只关心I2C中的值如何传输

sensor_register_callback详细分析

sensor_register_callback就是应用层和底层交互的函数接口。

函数主要做了回调的绑定,就是实现设计好了一套框架,别人把这套框架及函数名订好了,而且函数已经调用了。只是在注册的时候提供函数的一个实体
sensor驱动就是注册方,也就是在我们的mpp中,规定好了sensor实现的功能,将sensor的所有行为订好了,并有相应的函数和这个行为做对应。sensor驱动提供sensor行为的具体方法。

sensor_register_callback就是sensor驱动为mpp提供回调函数实现的实体。

在这里插入图片描述

HI_MPI_ISP_SensorRegCallBack就是典型的用来注册sensor的函数,有三个参数

  • IspDev
    海思VI中的一个单元,规定了sensor的行为
  • AR0130_ID
    海思给每一个sensor规定了一个唯一的编码,用于区分不同sensor,也做预留,将来可以通过这个编号来某些东西
  • &stAeRegister
    是最关键的数据结构,在isp中定义的有关sensor的一套操作全在这里,每一个操作对应一个函数去执行。它为isp预留了很多函数指针,isp要做什么操作只需要去调用对应的函数指针即可。如下图
    每一种sensor具体的驱动,负责将这些函数指针和具体的函数挂接起来。
    在这里插入图片描述
    以第一个HI_VOID(*pfn_cmos_sensor_init)(HI_VOID);为例,sensor的应用层驱动就会有一个函数和它对应

底下有ISP相关配置,注意这里不是海思VI中的ISP,是sensor内部的ISP。大部分sensor内部有一个简单的ISP。

&stAeRegistercmos_init_sensor_exp_function中填充,将其内部的函数指针和sensor的应用层驱动的函数相接。
在这里插入图片描述
进入sensor_init
在这里插入图片描述
在这里插入图片描述
这里就是在设置sensor的寄存器,通过底层的i2c驱动和硬件进行交互。

除了sensor的配置,底下还有两个结构相似的配置,是AE(自动曝光)和AWB(自动白平衡),分别对应了不同的功能,结构是一模一样的。
可以看到没有AF(自动对焦),因为sensor不支持AF功能
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spark!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值