Qualcomm Camera sensor bring up!
本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】
—only for sensor probe sucess.
0. 准确
【0】. 不管是哪个平台都要先去看平台camera bring up 的文档,确认需要配置的内容;
【1】. 拿到sensor 的硬件图用来配置sensormodule.xml;
【2】. 拿到sensor的Datasheet,用来配置sensor.xml;
【3】. 拿到项目硬件图用来配置kernel层的dtsi和pinctrl。
【4】. 配置完成后先检查上电是否成功,I2C,sensor初始化。
1. Kernel 底层驱动配置
主芯片GPIO分布
① Kernenl层的驱动配置主要是关于sensor的上下电、i2c通讯的配置,高通有专门的dtsi来配置上下电、cci等配置。通过硬件电路图配置相应的引脚。CAM_MCLK、CCI_I2C_SDA/SCL、MIPI_CSI、CAM_ID2这些引脚与CPU芯片中GPIO的连接是多少。
首先查看电路图中相关sensor的引脚分别连接到哪里。
② 电路图中会写明每个sensor的AVDD、DVDD、IOVDD对应的上电接口。
③ 确认AVDD、DVDD、IOVDD是否存在使能口上电。
1.1 dtsi
主要是实现sensor的上下电、时钟、I2C的硬件连接配置。这部分要拿到相关sensor的硬件图和datasheet以及sensor的xml配置,其实主要是让sensor保证GPIO上电和电压范围和I2C是通的。
首先查看代码库中的配置格式,其次是先表明白AVDD、DVDD、IOVDD的电源的接口是怎么上电的。是否有上电使能口。
上电的操作一般分为两种,一种是PMIC供电,另外一种的GPIO供电,根据高通文档说明,两种的定义不太相同。根据硬件图来确定供电口。
SM7250平台中,AVDD是有使能口打开电源的,DVDD和IOVDD是PMIC供电的。所以对于使能口需要在dtsi中单独去定义的。
这部分的定义如下:
camera_vana0_ldo: gpio-regulator@0 {
compatible = "regulator-fixed";
reg = <0x00 0x00>;
regulator-name = "camera_vana0_ldo";
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
regulator-enable-ramp-delay = <233>;
enable-active-high;
gpio = <&tlmm 70 0>;
pinctrl-names = "default";
pinctrl-0 = <&cam_sensor_0_vana>;
vin-supply = <&BOB>;
};
接下来配置sensor的dtsi,结合sensor的SPEC来确定电压范围,所以定义的dtsi如下:
qcom,cam-sensor@2 {
cell-index = <2>;
compatible = "qcom,cam-sensor";
reg = <0x02>;
csiphy-sd-index = <1>;
sensor-position-roll = <270>;
sensor-position-pitch = <0>;
sensor-position-yaw = <0>;
eeprom-src = <&eeprom_front>;
cam_vio-supply = <&L7P>;
cam_vana-supply = <&camera_vana0_ldo>;
cam_vdig-supply = <&L1P>;
cam_clk-supply = <&titan_top_gdsc>;
regulator-names = "cam_vio","cam_vana", "cam_vdig", "cam_clk";
rgltr-cntrl-support;
pwm-switch;
rgltr-min-voltage = <1800000 2800000 1050000 0>;
rgltr-max-voltage = <1800000 2800000 1050000 0>;
rgltr-load-current = <0 80000 105000 0>;
gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk1_active
&cam_sensor_active_frontt>;
pinctrl-1 = <&cam_sensor_mclk1_suspend
&cam_sensor_suspend_frontt>;
gpios = <&tlmm 14 0>,
<&tlmm 29 0>;
gpio-reset = <1>;
gpio-req-tbl-num = <0 1>;
gpio-req-tbl-flags = <1 0>;
gpio-req-tbl-label = "CAMIF_MCLK2",
"CAM_RESET2";
sensor-mode = <0>;
//cci-device = <1>;
cci-master = <0>;
status = "ok";
clocks = <&camcc CAM_CC_MCLK1_CLK>;
clock-names = "cam_clk";
clock-cntl-level = "turbo";
clock-rates = <24000000>;
};
上电完成后,还需要注意的是:cci-master,一般只有两个cci-master,但是在7250平台上,有了三个cci-master,这时候,要先在kernel代码库中先去看一下cci-master的地址定义。如果cci-master配置不对,很有可能push了dtbo boot后出现无法开机的情况。
另外,根据习惯,配置完dtsi需要检查是否上电成功,在dtsi配置的过程中,我们的sensor出现了AVDD没有上电成功,但是相机probe成功并且可以打开相机的情况。按照正常情况这是不科学的,而且如果两个以上的相机共用同一个供电口,不好检查问题。因此,dtsi配置完成,首要任务就是检查上电电压是否正确。
1.2 pinctrl
结合dtsi来确定pinctrl是否需要添加。
pinctrl主要是定义GPIO的。如果相应的GPIO没有定义,需要在pinctrl下定义。
2. Chi-Cdk XML 配置
2.1 sensormodule
sensormodule主要是结合sensor的SPEC来填写的。这部分内容主要包括
name | ||
---|---|---|
cameraId | 2 | |
moduleName | ||
sensorName | ||
eepromName | ||
position | ||
CSIInfo | important | △△△△ |
CSIIinfo这部分主要是关系到sensor是否和其他的sensor共用CCI。
在高通文档中,对于sensor的CSI配置有说明,可以去查看文档。
lensinfo | ||
---|---|---|
FocalLength | ||
fNumber | ||
minFocusDistance | ||
maxFocusDistance | ||
horizontalViewAngle | ||
verticalViewAngle |
2.2 sensor
对于sensor的配置每一个都需要确认。
camximagesensordata.cpp
每个sensor的XML文件中基本包含的信息,在配置过程中要确定一下信息的准确性。
name | ||
---|---|---|
slaveinfo | ||
sensorId | ||
regaddrinfo | ||
resolutioninfo | ||
exposureControlInfo | ||
streamonsetting | ||
streamoffsetting | ||
groupholdonsetting | ||
groupholdoffsetting | ||
initsettings | ||
testPatternInfo | ||
colorlevelinfo | ||
opticalblackregionInfo | ||
pixelarrayinfo | ||
delayinfo |
3. CHECK
- dtsi配置完成先去硬件组检查是否每个上电口都已经上电成功;【这一点非常非常重要】
- 接下来检查CCI-master是否通讯成功;
- 检查MIPI是否有信号;
- 检查sensor初始化流程是否有问题:streamon,initsettings,linecount,settleTImeNs etc;
- push sensor的Bin外,还需要push sensor的so;
camxsensornode.cpp
camximagesensordata.cpp
这里需要注意的一点是sensor对应的so需要同时的push到手机,如果so没有加载到,会使相机预览不正常和信号传输错误。