Camera Sensor 驱动

前面两篇文章我们从 设备树 将到高通的平台配置也就是我们的sensor xml,其实这也源自我们国内的手机厂商都是安卓阵营的,像苹果只有自己那堆人在做系统他整个生态是完整的但又闭源的,如果你只是在这个手机厂商做但是你只要是安卓阵营的那也是大差不差,而平台呢就是说的我们主流的类似于高通啊 mtk 的,但是国产还有个低端平台那就是我们的展锐 他也是有自己的ISP 处理的。但是这些都是运行在安卓这个拥有Linux 内核的操作系统上,camera sensor的注册也是在V4l2的架构中,注册vedio 节点管理,注册信号和管理sensor ,通过设备树来对节点进行挂载进行上下电的操作。而图像数据采用mipi 协议进行传输,sensor 通信又是采用 i2c 进行通信读写。传输主要是sensor转换为的数字信号传输到我们的hal 层

谈到HAL层就是安卓为保护平台芯片厂商和手机厂商等厂商的一些专利技术所抽象出来的中间层。像摄像头这种需要和硬件打交道的按理说直接运行在Linux 设备上可以直接进行读写操作,但是中间的逻辑被封装在这个层中我们就对这个层进行比原,包括一些厂商的客制化和对图像的一些操作。都被隐藏了,像读取和写入就写入kernel 层这又是通过另一个组件就是我们的CSL 来进行操作这是高通平台哈 封装了IOCTL 这个函数然后通过一些函数映射表的操作去操作kernel 层。

而我们的xml 就是包装了一系列的sensor的寄存器 包括 出图size 开关流 啊 ,vc 通道啊 还有一些sensor 的OB 啊这个都是sensor 厂商会提供给我们的一些setting。当然也可以通过这些做一些客制化。比方说现在很火的sat.。

Camera 子器件

今天的这篇文章其实是对前面的一个补充,因为一个摄像头模组就像我们之前所说他有sensor 镜头,还有一些子器件类似于马达 内含 AF IC OIS IC 闪光灯等。 这些子器件我们同样需要上下电,同样我们需要在设备数上挂在上他们的节点通常这些子器件都是安排到sensor 下的才probe 的是后会去识别这些节点然后将子器件一同probe 成功

AF actuator

这里的VCM 就是我们说的马达 但是我们要注意到现在的手机 有OIS的话他在水平sensor的平面额也就是我们的x y轴 是属于OIS的马达 的,对于AF 来说,他是一个垂直于sensor 所在平面 z轴方向的一个马达。

1.设备树节点的添加

我们首先自定义一个我们的设备数节点的name用作驱动我们AF 

cam_0: cam_0 {
    compatible = "qcom,cam-sensor";
    
    /* 传感器配置 */
    、、、
    qcom,actuator-src = <&actuator0>;// 
    
    /* AF 器件子节点 */ //简易写法
    actuator@0 {
        compatible = "qcom,actuator";
        reg = <0>;
        status = "ok";
    };

    //一个参考模板与实际配置有所差异
    actuator@0 {
    compatible = "qcom,actuator-dw9800v";  // 根据实际型号
    reg = <0>;  // I2C 地址或索引
    status = "ok";
    
    /* 基本信息 */
    qcom,actuator-name = "dw9800v";
    qcom,actuator-slave-addr = <0x18>;  // I2C 从设备地址
    
    /* 电源管理 */
    vdd-supply = <&pm8998_l19>;  // AF 驱动电源
    vcc-supply = <&pm8998_lvs0>;  // 逻辑电源
    
    /* I2C 配置 */
    qcom,i2c-freq = <400000>;  // I2C 通信频率
    i2c-wakeup-source;
    
    /* 光学中心 */
    qcom,position = <0>;  // 镜头位置
    
    /* GPIO 配置 */
    gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>;  // 复位 GPIO
    qcom,gpio-reset = <12>;
    qcom,gpio-mclk = <13>;
    、、、
};
};

设备树的节点我们需要挂在camera-sensor 里面方便probe 的时候识别到,上下电的正常是保证AF能正常运行的首要前提

2.xml 配置

同样高通需要在chi-cdk下面进行配置这个配置需要在同sensor xml 的同级目录下面通常名字是icname.xml

<ActuatorInfo>
    <!-- 基本信息 -->
    <ActuatorName>dw9800v</ActuatorName>
    <ActuatorType>VCM</ActuatorType>
    <SlaveAddress>0x18</SlaveAddress>
    
  
    
    <!-- 电源配置 -->
    <PowerConfig>
        <VDD>2.8</VDD>
        <VCC>1.8</VCC>
        <PowerUpTime>5</PowerUpTime>
        <PowerDownTime>5</PowerDownTime>
    </PowerConfig>
</ActuatorInfo>
、、、
//还有些eeprom 里面烧录的配置

3.pdaf

pdaf 在高通同样有xml 的配置

<PDConfigData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:noNamespaceSchemaLocation="....\api\sensor\camxpdaconfig.xsd">
    <module_version major_revision="1" minor_revision="0" incr_revision="0"/>
    
    <PDCommonInfo>
        <!-- PDAF Name -->
        <PDAFName>imx586_pdaf</PDAFName>
        <!-- PDAF Sensor Orientation
             Valid values: DEFAULT, MIRROR, FLIP, MIRRORANDlLIP -->
        <PDOrientation>DEFAULT</PDOrientation>
        <!-- Defocus confidence threshold level -->
        <PDDefocusConfidenceThreshold>200</PDDefocusConfidenceThreshold>
    </PDCommonInfo>
    
    <!-- RES 4000x3000@30fps -->
    <PDModeInfo>
        <PDSensorMode>1</PDSensorMode>
        <PDType>PDType2</PDType>
        <PDAFLibraryName>com.qtin.stats.pdlib</PDAFLibraryName>
        <!-- Native pattern information
             element for pdBlockCountHorizontal
             element for pdBlockCountVertical
             element for PD Crop Region
             element for downscale factor horizontal
             element for downscale factor vertical -->
        <PDSensorNativePatternInfo>
            <PDNativeBufferFormat>MIPI10</PDNativeBufferFormat>
            <!-- Number of PD blocks in X direction
                 2PD: PD Image Width -->
            <PDBlockCountHorizontal>248</PDBlockCountHorizontal>
        </PDSensorNativePatternInfo>
    </PDModeInfo>
</PDConfigData>

原理解析就是相位对焦这个需要花点时间讲解将相同与有两块接收机一左一又,光线入射进来打在两个接受器中间的点是最准缺德对焦最清晰的。左边或者前面都有不清晰的地方。

这个sensor 厂商会给出每个PD 点然后我们驱动需要配置

项目 内容 备注
<PDCommonInfo>
PDAFName imx586_pdaf pdaf 驱动名称
PDOrientation DEFAULT mirror/flip/both
PDDefocusConfidenceThreshold 200
</PDCommonInfo>
<PDModeInfo>
PDSensorMode 0 对应sensor resolution idx
PDType PDType2 type 1 2 3
PDAFLibraryName com.qti.stats.pdlib pd 算法库
<PDSensorNativePatternInfo>
PDNativeBufferFormat MIPI10 pd 数据格式
PDBlockCountHorizontal 248 width,单位block
PDBlockCountVertical 186 height, 单位block
<PDBlockPattern>
PDPixelCount 32 一个block里pd点数量,包括左右pd
<PDPixelCoordinates>
PDXCoordinate 19 x坐标
PDYCoordinate 13 y坐标
PDPixelShieldInformation RIGHTSHIELDED LEFT pd,屏蔽右半部
</PDPixelCoordinates>
<PDBlockDimensions>
width 16 Block分辨率
height 16 Block分辨率
</PDBlockDimensions>
PDOffsetHorizontal 17 Block 第一个pixel偏移
PDOffsetVertical 12 Block 第一个pixel偏移
</PDBlockPattern>
<PDCropRegion>
xStart 0 x坐标
yStart 0 y坐标
width 4000 frame 宽
height 3000 frame 高
</PDCropRegion>
PDDownscaleFactorHorizontal 1 水平下采样
PDDownscaleFactorVertical 1 垂直下采样
</PDSensorNativePatternInfo>
<PDBufferBlockPatternInfo>
PDStride 1984 pd stats 行buffer大小
PDBufferFormat UNPACKED16 一个pd占16个bit
<PDBlockPattern>
PDPixelCount 32 pd像素个数
<PDPixelCoordinates>
PDXCoordinate 0 x坐标
PDYCoordinate 0 y坐标
PDPixelShieldInformation RIGHTSHIELDED left pd
</PDPixelCoordinates>
<PDBlockDimensions>
width 4 pd宽(block)
height 8 pd高(block)
</PDBlockDimensions>
PDOffsetHorizontal 0 Block 第一个pixel偏移
PDOffsetVertical 0 Block 第一个pixel偏移
</PDBlockPattern>
</PDBufferBlockPatternInfo>
</PDModeInfo>

OIS IC配置

OIS 配置同样需要上下电保证OIS IC的正常运行设备树节点和添加

1.设备树

OIS 的设备树配置

ois@0 {
    compatible = "qcom,ois-st-ois";
    reg = <0>;
    status = "ok";
    
    qcom,ois-name = "st-ois";
    qcom,ois-slave-addr = <0x0D>;
    
    /* ST 特定参数 */
    qcom,st-ois-version = <2>;  // 版本号
    qcom,st-ois-mode = <1>;  // ST 专用模式
    
    /* 电源配置 */
    vdd-supply = <&pm8998_l19>;
    vcc-supply = <&pm8998_lvs0>;
    
  
};

这个也是需要挂在 camera  sensor 下,现在有的af 和OIS 共用一路VDD电为了节约成本

2.xml 配置

然后有的OIS为了节约成本搞了个分离式

<OISInfo>
    <OISName>dw9781</OISName> //写ic name
    <OISType>Electromagnetic</OISType>
    <SlaveAddress>0x0D</SlaveAddress>从地址

// opower 上下电
    </ControlInterface>
</OISInfo>

//一些eeprom 烧录的
比方说 ois 算法用的的烧录的gain值的寄存器

OIS 配置上基本上没有太大的问题。但是OIS 他也算个效果,如果望效果上看的话需要达到比方说一定的防抖等级这就涉及到一些测试一些机构的评定

闪光灯配置

闪光灯适用于一些很暗很暗的环境 设备树同样设置节点,还需要加载一些 闪光等的驱动文件编译产物是.ko。hal 层进行打闪逻辑控制

xml 主要是控制 电流的一个强度的配置通常是固定的,一般适用于手机的手电筒,和相机闪光灯,主要是配置电流的ma ,来达到一个闪光灯亮度的控制

eeprom配置

第16讲 Camera Sensor EEPROM配置详解|极客笔记

这篇文章写的很详细就

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐