了解CAMX-CHI

网上有很多描写高通CAMX-CHI架构的描写可以去了解下,总体用下来的话对于mtk 了解的话还是停留在使用.c 文件逻辑控制去读写i2c 寄存去配置,但是高通的话利用CHI-CDK ,讲sensor的寄存器配置 还是tuning 参数配置都利用 xml 来描述无论是逻辑的封装还是可读性的话都是比较好的

chi-cdk:厂商自定义功能实现(com.qti.chi.override.so)。 二者通过 dlopen 互调回调函数,实现功能扩展。 Framework 与 HAL 的通信流程为: request → camx → chi-cdk → camx → kernel → camx → chi-cdk → camx → framework,并伴随 notify(shutter) 与多路 metadata/imagebuffer 返回

这里只是简单介绍下

CHI-CDK中sensor 驱动配置

回到我们camera 驱动的配置上来,对于我们sensor 传感器的寄存器配置我们通常将他用三个文件来描述,一个是不同场景需要用到不同的出图 不同的寄存器配置的sensor.xml ,一个是描述sensor id ,sensor name 不同客制化暴露接口控制的module.xml ,还有就是我们的曝光CPP

1.sensor module XML

module 通常包含一些子器件的配置信息还有些sensor name,

vendor/qcom/proprietary/chi-cdk/oem/qcom/module/xxx_sunny_s5khm2_wide_module.xml

为例子这个是高通给的一些例子真实场景oem 下面会有实际的手机厂商下会有driver 下各个项目名然后有这些不同的xml.

<ModuleConfiguration description="Module configuration">
    <!--CameraId is the id to which DTSI node is mapped.
        Typically CameraId is the slot Id for non combo mode. -->
    <cameraId>0</cameraId> // camera id 通常0:注射 1:前置
    <!--Name of the module integrator -->
    <moduleName>sunny_i</moduleName>//
    <!--Name of the sensor in the image sensor module -->
    <sensorName>xxxx_sunny_s5kh2_main</sensorName> sensor name
    <!--Actuator name in the image sensor module
        This is an optional element. Skip this element if actuator is not present -->
    <actuatorName>dw9800v</actuatorName> //af 马达name
    <eepromName>xxxx_sunny_s5kh2_main</eepromName>// eeprom name OTP 的电容器
    <flashName>ktd2691</flashName>//闪光灯配置
    <oisName></oisName>// OIS  name
    <!--PDaf name in the image sensor module
        This is an optional element. Skip this element if PDAF is not present -->
    <pdafName>s5kh2_pdaf</pdafName>
    <!--Chromatix name to be used to open binary.
        Binary name is of the form sensor_model_chromatix.bin -->
    <chromatixName>xxxx_sunny_s5kh2</chromatixName>// 不同的tuning 配置如果你有多个国家不同肤色还能有些不同配置
    <i2cFrequencyMode>FAST_PLUS</i2cFrequencyMode>
    <!--Position of the sensor module.
        Valid values are: REAR, FRONT, REAR_AUX, FRONT_AUX, EXTERNAL -->
    <position>REAR</position>// 后置
    <!--CSI Information -->
    <CSIInfo description="CSI Information">
        <laneAssign>0x3210</laneAssign>
        <isComboMode>0</isComboMode>
    </CSIInfo>
    <!--Lens information -->
    <LensInfo description="Lens Information">
        <!--Focal length of the lens in millimeters. -->
        <focalLength>5.89</focalLength>
        <!--F-Number of the optical system. -->
        <f-Number>1.89</f-Number>
        <!--Minimum focus distance in meters. -->
        <minFocusDistance>0.1</minFocusDistance>
        <!--Maximum focus distance in meters. -->
        <maxFocusDistance>10.0</maxFocusDistance>
        <!--Horizontal view angle in degrees. -->
        <horizontalViewAngle>69.5</horizontalViewAngle>
        <!--Vertical view angle in degrees. -->
        <verticalViewAngle>55.1</verticalViewAngle>
        <!--Maximum Roll Degree. Valid values are: 0 to 359 -->
        <maxRollDegree>360</maxRollDegree>
        <!--Maximum Pitch Degree. Valid values are: 0, 90, 180, 270 -->
        <maxPitchDegree>360</maxPitchDegree>
        <!--Maximum Yaw Degree. Valid values are: 0 to 359 -->
        <maxYawDegree>360</maxYawDegree>
    </LensInfo>
</ModuleConfiguration>

SIInfo

laneAssign

主板和sensor之间的mipi data lane连接顺序。如0x3210表示主板的data lane3接到sensor 的data lane3,依次顺序,主板的data lane0接到sensor 的data lane0。

isComboMode

Combo mode表示一个csi phy的五组线(data0/data1/data2/data3/clk)被分成两个大组,可以同时接到两个sensor上,其中一个sensor分配data0和CLK,另一个分配位data0/data1/CLK。

lensInfo

(查看模组spec)

focalLength

焦距,模组spec里面有

fNumber

光圈大小,模组spec里面有

minFocusDistance

最小对焦距离,模组spec里面有

maxFocusDistance

最大对焦距离,模组spec里面有

horizontalViewAngle

水平FOV(视场角),模组spec里面有

verticalViewAngle

垂直FOV,模组spec里面有

maxRollDegree

Roll方向偏转角度,目前在dtsi中定义后置 270

maxPitchDegree

Pitch方向偏转角度,目前在dtsi中定义后置 0

maxPitchDegree

Yaw方向偏转角度,目前在dtsi中定义后置 0

配置注意事项:

· “cameraID” 需要跟kernel 里面的device tree 匹配;

· 各个模组的Name 不能写错, 通过这个名字找到对应的模块的配置信息;

· “position” 的信息会根据这些信息来枚举模组,在camera provider的启动流程里面会涉及到;

sensor dtsi也有maxRollDegree、maxPitchDegree、maxPitchDegree,当xml里面不是360,就以xml里面的参数为准。xml里面参数会覆盖dtsi里面的参数

2.Camera Sensor.xml 配置

sensor xml 一般是包括我们的sensor 的一些具体的寄存器配置,手机厂商会用到很多不同的 sensor mode sensor mode 可以将他理解为不同的出图模式把包括出不同size 的图不论是4:3 用于拍照 还是16:9 的录像模式或者是 bining mode 这类图像。都会有不同的还有一些sensor的上电时序之类的。

// XML  中sensor 相关的解释可以查看API 文件
//chi-cdk/api/sensor/camxsensordriver.xsd
 
<sensorDriverData>
   // sensor 附属信息
   <slaveInfo>
       //sensor 名称
       <sensorName>s5k***_rear</sensorName>// 
       <slaveAddress>0x5a</slaveAddress>// i2c 地址
       // Sensor ID
       <sensorId>0x38</sensorId>//唯一sensor  id sensor probe 的时候会用到
       //i2c 频率类型: STANDARD (100 KHz) , FAST(400 KHz) , FAST_PLUS(1 MHz), Custom(dtsi 中客制化) //一般选择fast
       <i2cFrequencyMode>FAST</i2cFrequencyMode>
       //上下电顺序相反
       //上电类型以及配置的值
       <powerUpSequence> 
           <powerSetting>
               //配置上电类型,比如:VANA 、VIO、VAF、VDIG、RESET、MCLK 等待
               <configType>VANA</configType>
               <configValue>1</configValue>
               <delayMs>0</delayMs>
           </powerSetting>
           ... ...
           <powerSetting>
               //配置上电类型,比如:VANA 、VIO、VAF、VDIG、RESET、MCLK 等
               <configType>MCLK</configType>
               <configValue>19200000</configValue>
               <delayMs>10</delayMs>
           </powerSetting>
       </powerUpSequence>
       
       //下电类型以及配置的值 上下电顺序相反
       <powerDownSequence> 
           <powerSetting>
               //配置上电类型,比如:VANA 、VIO、VAF、VDIG、RESET、MCLK 等待
               <configType>MCLK</configType>
               <configValue>19200000</configValue>
               <delayMs>0</delayMs>
           </powerSetting>
           ... ...
           <powerSetting>
               //配置上电类型,比如:VANA 、VIO、VAF、VDIG、RESET、MCLK 等
               <configType>VANA</configType>
               <configValue>1</configValue>
               <delayMs>0</delayMs>
           </powerSetting>
       </powerDownSequence>
   </slaveInfo>
 
   //sensor 所有resolution 的 setting 与 sensormode 相关 
   <resolutionInfo>
   //指定sensor 版本
   <sensorVersion>0</sensorVersion>
   // sensor mode 0 for full size  第一个必须 Full 全尺寸size
   <!-- Res 0 8160*6144 10fps -->
   <resolutionData> 
       // stream 流信息
       <streamInfo>
           <streamConfiguration>
           // VC:  数据传输的虚拟通道(0-31)
           //Virtual Channel of the data
           <vc range="[0,3]">0</vc>
           // DT:数据流类型,默认 Raw10
           //Data type of the stream. Default value is 0x2B (10-bit RAW) 
           <dt>0x2B</dt>
           
           //出图 50M Full Size   
           <frameDimension>
               <xStart>0</xStart>//这个设计到一个sensor datasheet 的一个坐标系大概就是你整个sensor 的full szie 的最左上交定义坐标系为(0,0) 一直到右下角的画幅
               <yStart>0</yStart>
               <width>8160</width>
               <height>6144</height>
           </frameDimension>
           
           <!--Bit width of the data -->
           <bitWidth>10</bitWidth>
           <type>IMAGE</type>
        </streamConfiguration>
       </streamInfo>
       //每行有多少pixel clock  主要是用来计算帧率
       <!--Line length pixel clock of frame
         Typically this value is the active width + blanking width -->
       <lineLengthPixelClock>8688</lineLengthPixelClock> // 每行有多少实际上是包含了H blanking
       //总共有多少行frameLength 
       <!--Frame length lines of frame
         Typically this value is the active height + blanking height -->
       <frameLengthLines>6400</frameLengthLines>// 有多少实际的感应行包含 V blanking 
       <!--Output pixel clock -->
       <outputPixelClock>556800000</outputPixelClock> //mipi 输出频率 但是整个是除了一个系数与多少line 输出的实际频率应该成line lin 即是CPHY还是DPHY
       // 帧率 fps  = outputPixelClock/(frameLengthLines*lineLengthPixelClock)
       // 10fps =556800000/(6400*8688)=10.013实际上是要超出的如果用CPHY 3lane  要× 3 所以真率不同
       <!--Maximum frame rate -->
       <frameRate>10.07</frameRate>
       
       //数据流传输通道数
      <laneCount>4</laneCount>
       // FAE给的对应模式下的 多组寄存器setting 
       <regSettings>  
       //
           <regSetting>
               <registerAddr>0x0204</registerAddr>
               <registerData>0x4008</registerData>
               <regAddrType range="[1,4]">2</regAddrType>
               <regDataType range="[1,4]">2</regDataType>
               <operation>WRITE</operation>
               <delayUs>0x00</delayUs>
           </regSetting>
          ... ...
       </regSettings>
       
       // 每帧crop 参数 这里都是0 因为是full size 如果有裁切或者binning 是有系数转换和加减的
       <cropInfo>
           <left>0</left>
           <right>0</right>
           <top>0</top>
           <bottom>0</bottom>
       </cropInfo>
       
       // Feature 支持 比如QCFA ,软硬件Remosaic 等 或者ROI
       <capability>QUADCFA</capability>
       <RemosaicTypeInfo>SWRemosaic</RemosaicTypeInfo>
       <ADCReadoutTime>-6</ADCReadoutTime>
   </resolutionData>
       
   // sensor mode 1  binning size相机最常用的size 之一
   <!-- Res 1 4080*3072 30fps 4:3 -->
   <resolutionData>
       <streamInfo>
       <!--Information for a stream data -->
       <streamConfiguration>
           // VC:  数据传输的虚拟通道(0-31)
           //Virtual Channel of the data
           <vc range="[0,3]">0</vc>
           // DT:数据流类型,默认 Raw10
           //Data type of the stream. Default value is 0x2B (10-bit RAW) 
           <dt>0x2B</dt>
           
           // 12.5M 出图 binning size  因为是binning 实际是没有裁切
           <frameDimension>
               <xStart>0</xStart>
               <yStart>0</yStart>
               <width>4080</width>
               <height>3072</height>
           </frameDimension>
       </streamConfiguration>
       ... ...
       
       // Feature 支持 NORMAL
       <capability>NORMAL</capability>
       <ADCReadoutTime>0</ADCReadoutTime>
       </streamInfo>
 
   </resolutionData>
    ... ...
   </resolutionInfo>
   
   //曝光控制相关
   <exposureControlInfo>
       <!--Maximum analog again supported by sensor -->
       <maxAnalogGain>64</maxAnalogGain>// 模拟gain
       <!--Maximum digital again supported by sensor -->
       <maxDigitalGain>1</maxDigitalGain> //数字转换gain
       <!--Minimum offset to be maintained between line count and frame length lines -->
       <verticalOffset>16</verticalOffset>
       //最小 最大曝光行数
       <!--Minimum line count supported by sensor -->
       <minLineCount>9</minLineCount>
       //长曝光需要
       <maxLineCount>0xFFFFFF</maxLineCount>
       ... ...
   </exposureControlInfo>
   
   //sensor 启流 通过寄存器控制
   <streamOnSettings> 
       <regSetting>
         <!--Register address that is accessed -->
         <registerAddr>0x0b00</registerAddr>
         <!--If operation is WRITE, registerData is the data value to be written into the specified register address
             If operation is READ, registerData is the number of bytes to be read from the specified register address -->
         <registerData>0x0100</registerData>
         <!--Register address / data size in bytes -->
         <regAddrType range="[1,4]">2</regAddrType>
         <!--Register address / data size in bytes -->
         <regDataType range="[1,4]">2</regDataType>
         <!--Type of the operation
             Valid values are: WRITE, READ, POLL -->
         <operation>WRITE</operation>
         <!--Delay in micro seconds. Delay is 0 if not explicitly provided -->
         <delayUs>0</delayUs>
       </regSetting>
   </streamOnSettings>
   //sensor 关流
   <streamOffSettings> 
       <regSetting>
           <!--Register address that is accessed -->
           <registerAddr>0x0b00</registerAddr>
           <!--If operation is WRITE, registerData is the data value to be written into the specified register address
               If operation is READ, registerData is the number of bytes to be read from the specified register address -->
           <registerData>0x0000</registerData>
           <!--Register address / data size in bytes -->
           <regAddrType range="[1,4]">2</regAddrType>
           <!--Register address / data size in bytes -->
           <regDataType range="[1,4]">2</regDataType>
           <!--Type of the operation
               Valid values are: WRITE, READ, POLL -->
           <operation>WRITE</operation>
           <!--Delay in micro seconds. Delay is 0 if not explicitly provided -->
           <delayUs>0</delayUs>
       </regSetting> 
   </streamOffSettings>
   
   //帧同步相关的master setting
   //仅当 HWRemosaic 开启的时候才可以生效
   <masterSettings>
     <regSetting>
       <registerAddr>0x0326</registerAddr>
       <registerData>0x2240</registerData>
       <regAddrType range="[1,4]">2</regAddrType>
       <regDataType range="[1,4]">2</regDataType>
       <operation>WRITE</operation>
       <delayUs>0x00</delayUs>
     </regSetting>
    ... ...
   </masterSettings>
   
   //sensor 初始化的时候调用
   <initSettings>
       <initSetting>
       <regSetting>
           <registerAddr>0x0790</registerAddr>
           <registerData>0x0100</registerData>
           <regAddrType range="[1,4]">2</regAddrType>
           <regDataType range="[1,4]">2</regDataType>
           <operation>WRITE</operation>
           <delayUs>0x00</delayUs>
       </regSetting>
       ... ...
       <regSetting>
           <registerAddr>0x9C60</registerAddr>
           <registerData>0x79 0x68 0x00 0x01 0xDA 0x04 0x00 0x01 0xA6 0x40 0x00 0x00 0xDE 0x6C 0x00 0x01 0xDE 0x58 0x00 0x01 0xDE 0x44 0x00 0x01 0xA6 0x98 0x00 0x00 0xA6 0x84 0x00 0x00 0xA6 0x70 0x00 0x00</registerData>
           <regAddrType range="[1,4]">2</regAddrType>
           <regDataType range="[1,4]">1</regDataType>
           <operation>WRITE_SEQUENTIAL</operation>
           <delayUs>0x00</delayUs>
       </regSetting>
   </initSettings>
   // ITS  testPattern 纯色图片 测试相关 不支持 off ,常用 SOLID_COLOR  支持 纯黑,纯白,纯红,纯绿,纯蓝
  <testPatternInfo>
   <testPatternData>
     <!--Test pattern mode
         Supported modes are: OFF, SOLID_COLOR, COLOR_BARS, COLOR_BARS_FADE_TO_GRAY, PN9, CUSTOM1 -->
     <mode>OFF</mode>
     <settings>
       <regSetting>
         <registerAddr>0x0C0A</registerAddr>
         <registerData>0x0000</registerData>
         <regAddrType range="[1,4]">2</regAddrType>
         <regDataType range="[1,4]">2</regDataType>
         <operation>WRITE</operation>
         <delayUs>0</delayUs>
       </regSetting>
     </settings>
   </testPatternData>
 </testPatternInfo>
 
</sensorDriverData>

各配置参数含义如下:

参数名

说明

SensorName

sensor型号

slaveAddress

i2c write address,i2c地址一般是7位,最后一位读写位,写地址8位

regAddrType

地址类型1,2,4Byte

regDataType

数据类型1,2,4Byte

sensorIdRegAddr

sensor id寄存器地址

sensorId

sensor id值,没写对就对导致匹配失败

sensorIdMask

一般值为0xFFFFFFFF

i2cFrequencyMode

i2c操作频率,比如FAST_PLUS

 powerUpsequence

powerDownsequence

上下电相关信息

configType

上下电控制节点,VANA/VDIG/VIO/MCLK/RESET

configValue

电压/电平/时钟状态,MCLK为24M就填24M

delayMs

上下电延时,一般都填0 尽量填0 但是要根据sensor datasheet 来有的sensor 需要一定的演示

 /powerUpsequence

/powerDownsequence

根据data sheet 上面的上下电时序严格遵守否则会出不了图或者上电失败

xOutput

sensor x寄存器地址

yOutput

sensor y寄存器地址

frameLengthPixelClock

垂直水平时钟输出的Piexl

LineLengthPixelClock

水平包含水平消隐

coarseIntgTimeAddr

linecount曝光寄存器地址

shortCoarseIntgTimeAddr

短曝光寄存器地址

globalGainAddr

gain寄存器地址

shortGlobalGainAddr

短帧gain寄存器地址

digitalGlobalGainAddr

数字gain寄存器地址

testPatternRAddr

R通道测试寄存器

testPatternGRAddr

Gr通道测试寄存器

testPatternDAddr

B通道测试寄存器

testPatternGBAddr

Gb通道测试寄存器

 resoltionData

/resoltionData

一组配置信息

colorFiltArrangement

bayer阵列,如BAYER_BGGR

vc

虚拟通道,0/1/2/3

dt

dataType,数据类型

xStart

x坐标

yStart

y坐标

width

h_active

height

v_active

bitWidth

位宽

type

数据流类型,如IMAGE/PDAF

lineLengthPixelClock

HTS

frameLengthLines

VTS

minHorizontalBlanking

hblanking,影响到isp时钟的计算,可直接填0

minVerticalBlanking

vblanking,影响到isp时钟的计算,可直接填0

outputPixelClock

op_clk

horizontalBinning

hbinning

VertialBinning

vbinning

framerate

帧率fps

laneCount

mipi lane count

settleTimeNs

mipi settle time,默认一般14,LP->HS需要稳定的时间,丢包可考虑方向

is3Phase

DPHY或者CPHY,0表示DPHY,1表示CPHY

operation

读写操作,WRITE表示写,READ表示读

delayUs

延时,如0x00

 

cropInfo

left

左边宽度

right

右边宽度

top

上边宽度

bottom

下边宽度

 

/cropInfo

RemosaicTypeInfo

HW/SW,硬件马赛克还是软件马赛克,Bayer BGGR,有的sensor四个像素点全是B(类似这种)

capability

如QuadCFA,四合一sensor

ADCReadoutTime

行数据ADC转换时间,如2,基本可忽略

maxAnalogGain

最大模拟gain,如32,sensor实际spec填写

maxDigitalGain

最大数字gain,没用到就填1

verticalOffset

offset <= vts - linecount

minLineCount

最大曝光行

maxLineCount

最小曝光行

realToRegDigitalGainConversionFactor

转行系数,描述模拟gain到真实寄存器Gain转换系数,在驱动xml里面可填

realToRegGain

真实系数

regToRealGain

 streamOnSettings

/streamOnSettings

streamon寄存器,一般为一个寄存器,开流

 streamOffSettings

/streamOffSettings

停流

 groupHoldOnSettings/groupHoldOnSettings

groupHoldOffSettings

/groupHoldOffSettings

sensor holdon寄存器,寄存器打开之后,再去写lanecount,写holdoff批量同时生效

 masterSettings/masterSettings

slaveSettings

/slaveSettings

双摄配置,作为master和slave都有相应的寄存器配置

 initSettings

/initSettings

sensor初始化配置,在resolution组之前跑的

 testPatternData

/testPatternData

color bar格式配置

 

colorLevelInfo

whiteLevel

最大亮度,根据raw位宽设置,比如raw10,最大表示的亮度就是1024

rPedestal

暗电流

grPedestal

暗电流

gbPedestal

暗电流

gbrPedestal

暗电流

 

/colorLevelInfo

 

opticalBlackRegionInfo

 

dimension

xStart

非感光区域x坐标

yStart

非感光区域y坐标

width

非感光区域宽

height

非感光区域高

 

/dimension

/opticalBlackRegionInfo
 

activeDimension

width

sensor最大有效输出尺寸,sensor的固定值

height

 

/activeDimension

 

dummyInfo

描述的dummy数据

left

左边宽度

right

右边宽度

top

上边宽度

bottom

下边宽度

 

/dummyInfo

SOF-exp-linereadout-adcreadout = 一帧开始曝光的时间

参数名

说明

 

delayInfo

linecount

lineCount延时几帧生效,Pipieline delay

gain

gain延时几帧生效

framelengthLines

VTS延时一帧生效

maxPipeline

sensor延迟几帧生效,比如2

frameSkip

sensor丢帧

 

/delayInfo

 

sensorProperty

sensor固有属性

pixelSize

像素尺寸

cropFactor

crop因子

sensingMethod

ONE_CHIP_COLOR_AREA

 

/sensorProperty

3.曝光CPP介绍

曝光cpp 通常是各大sensor 厂商提供的一份原始的 cpp 文件 提供一些接口包括api 进行gain值的下发转换,手机的OEM厂商可以在这里进行一些客制化

1.写gain

ain是增益的意思Again,Dgain,ispgain. 模拟增益,数字增益,isp软件增益。AGAIN DGAIN都属于电子硬件放大。而ispgain是软件放大,对图像质量影响很大。三个增益引入的噪声Again<Dgain<ISPgain。 所以我们一般顺序也是反着来先动Again

static kal_uint16 set_gain(kal_uint16 gain)
{
	kal_uint16 reg_gain;
	
	LOG_INF("set_gain(): %d \n", gain);
  	//gain = 64 = 1x real gain.
	if (gain < BASEGAIN || gain > 16 * BASEGAIN) {
		LOG_INF("Error gain setting");
		if (gain < BASEGAIN)
			gain = BASEGAIN;
		else if (gain > 16 * BASEGAIN)
			gain = 16 * BASEGAIN;		 
	}

    	reg_gain = gain2reg(gain);
	spin_lock(&imgsensor_drv_lock);
	imgsensor.gain = reg_gain; 
	spin_unlock(&imgsensor_drv_lock);
	LOG_INF("gain = %d , reg_gain = 0x%x\n ", gain, reg_gain);

	write_cmos_sensor_16_16(0x0204, (reg_gain&0xFFFF));    
	return gain;
}	/*	set_gain  */

这个就是简单的一些set gain 实际要有转换 曝光cpp 里面的函数比较多还涉及 again->Dgain的转换。

希望看到的给主播点点关注把

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐