文章目录
1. 关闭自动对焦
/* 不同系统可能会有差异 */
adb shell setprop vendor.debug.camera.af.manual 2 //使能手动对焦
adb shell setprop vendor.debug.camera.af.manual 0 //使能自动对焦
2. 手动调节曝光和帧率
// 1. 关闭自动曝光调节
adb root
adb remount
adb shell "echo disableAECStatsProcessing=1>>/vendor/etc/camera/camxoverridesettings.txt"
adb reboot // 或着kill camera进程
// 2. 手动修改曝光值,修改曝光值帧率也会相应发生变化
adb shell setprop vendor.debug.camera.aec.ctrl.expTime 33000000 //示例33ms,值越大曝光越大
// 3. 手动修改gain值
adb shell setprop vendor.debug.camera.aec.ctrl.gain 32.0 //示例32倍gain,该值调节亮度梯度,最小值为1.0
// 4. 开启曝光自动调节,即通过apk调节
adb root
adb remount
adb shell "echo disableAECStatsProcessing=0>>/vendor/etc/camera/camxoverridesettings.txt"
adb reboot // 或着kill camera进程
3.camx架构xml解析
文件路径
vendor/qcom/proprietary/camx/src/
4.打开CAM_DBG的log
4.1 开启方式一
/* 打开OIS log */
adb root && adb shell "echo 0x100000 > /sys/module/camera/parameters/debug_mdl"
/* 打开AF的log */
adb root && adb shell "echo 0x2000 > /sys/module/camera/parameters/debug_mdl"
/* 打开Sensor的log */
adb root && adb shell "echo 0x20 > /sys/module/camera/parameters/debug_mdl"
/* 打开OIS/AF/Sensor的log */
adb root && adb shell "echo 0x102020 > /sys/module/camera/parameters/debug_mdl"
/* 打开所有log方式1 */
adb root && adb shell "echo 0x1fffff > /sys/module/camera/parameters/debug_mdl"
/* 打开所有log方式2 */
adb shell setprop persist.vendor.camera.logVerboseMask 0xFFFFFFFF
adb shell setprop persist.vendor.camera.logInfoMask 0xFFFFFFFF
4.2 开启方式二
/* 开启上层log的命令格式如下:*/
adb shell setprop <setting> <value>
/* 开启AF debug log */
adb shell setprop persist.vendor.camera.logInfoMask 0x000002
/* 所有的camera debug log 遵循下面的格式: */
CamX: [<Verbosity Level>][<Group>] <File>:<Line Number> <Function Name> <Message>
/* 注意:有的配置需要杀 camera 进程 或者 重启设备 才能生效 */
camera driver debug log 分割成了很多组,每组对应很多的log,使能这部分log需要设置正确的bitmask,规则如下:
camera debug 调试技巧请参考博客:https://blog.csdn.net/shangbolei/article/details/106629827
4.3 AF对焦调试
调试AF过程中可能会遇到无法对焦的情况,如果手中恰巧没有逻辑分析仪等设备,debug会有一定困难。在此使用抓取log的方式可以粗略的先测试AF对焦值是否正确的下发
/* adb命令打开AF和CCI的相关log */
adb root && adb shell "echo 0x6000 > /sys/module/camera/parameters/debug_mdl"
/* 抓取log并过滤关键字。包含sid 0x0c或者MoveFocus或者cmd_size */
/* sid 0x0c表示AF从机地址0x0c */
adb shell "logcat -b all | grep -E 'sid 0x0c|MoveFocus|cmd_size'"
/* 打开相机,命令框会实时输出log */
log中关键字出现的位置
5. 脚本打开和关闭camera
通过adb 命令的形式打开和关闭camera有两种方式:
1. adb命令输入屏幕上打开和关闭camera坐标点;
2. adb命令开启和关闭对应的camera服务。
5.1 开启和关闭对应的camera服务
5.1.1 查询对应整机上camera对应的代号
adb root
adb remount
adb shell "getprop | grep cam"
有时会查询到多个代号,无法确认具体是哪一个,如下图所示。
此时需要通过top查询当前进程,输入下面命令,然后打开相机,观察显示的camera相关服务
adb root
adb remount
adb shell "top | grep cam"
5.1.2 编写脚本打开关闭camera
编写bat脚本,循环打开和关闭camera
使用goto跳转实现不计次数的循环执行
//拷贝下面脚本使用时,请删除注释部分
@echo off
adb root
adb remount
set start_time=%DATE:~0,4%.%DATE:~5,2%.%DATE:~8,2%-%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set /a var=0 //初始化计数变量
:start //起始标志位,对应下面goto start
echo "Test open/close camera %var% times."
echo "open camera apk."
adb shell am start org.codeaurora.snapcam //snapcam为相机服务代号,查询方法参考5.2.1
choice /t 8 /d y /n >nul //延时8秒
echo "close camera apk."
adb shell am force-stop org.codeaurora.snapcam
choice /t 2 /d y /n > nul //延时2秒
set /a var=%var%+1 //变量值累加
set end_time=%DATE:~0,4%.%DATE:~5,2%.%DATE:~8,2%-%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
echo "save times log to file"
echo Loop_%var%_%end_time% >> open_close_camera_history_%start_time%.txt
echo "return to start position"
goto start //返回到上面的:start处,重新执行命令
pause
编写shell脚本
#!/bin/bash
adb wait-for-device
starttime=$(date +"%Y-%m-%d_%H_%M_%S")
time=$(date "+%m月%d日-%H时%M分%S秒")
echo "AW86006 test start ${time}"
for((j=1; j<=10000; j++))
do
echo "Test open/close camera $j times."
echo "open camera apk."
adb shell am start org.codeaurora.snapcam
sleep 5s
echo "close camera apk."
adb shell am force-stop org.codeaurora.snapcam
sleep 1s
endtime=$(date +"%Y-%m-%d :%H:%M:%S")
echo "Loop: $j, endtime: ${endtime}" >> open_close_camera_history_"${starttime}".txt
done
sleep 600
5.2 输入坐标点打开关闭camera
1.开启手机开发者模式
2.开启显示屏幕坐标点功能,并记录需要点击的坐标点
3.adb 命令输入坐标点,实现自动点击屏幕上camera功能
5.2.1 启用开发者模式
1.打开设置
2.关于手机
3.版本号,快速点击多次即可看到提示进入开发者模式
5.2.2 开启坐标功能
1.进入开发者模式后
2.返回设置首页
3.系统和更新
4.开发者人员选项
5.打开显示触摸操作、指针位置。此时屏幕上方出现坐标值
5.2.3 adb 输入坐标命令
adb shell input tap X Y /* 输入X Y的坐标值 */
6. OIS/Sensor设置并行初始化
高通平台在初始化OIS和Sensor时,默认是串行模式,即初始化有先后顺序,如果OIS初始化时需要固件更新,更新时间内sensor无法正常初始化,会造成黑屏的现象,为了解决这个问题,可以将初始化设置成并行模式。
文件路径:sm8250_android_q_aosp/vendor/qcom/proprietary/camx/src/settings/
文件:g_camxsetting.xml,有些平台为camxsetting.xml
/* 搜索 OISOptimization,将DefaultValue和Dynamic改为TRUE */
<setting>
<Name>Enable OIS Optimization</Name>
<Help> Enable OIS Optimization</Help>
<VariableName>enableOISOptimization</VariableName>
<VariableType>BOOL</VariableType>
<SetpropKey>vendor.debug.camera.enableOISOptimization</SetpropKey>
<DefaultValue>TRUE</DefaultValue>
<Dynamic>TRUE</Dynamic>
</setting>
7. 高通平台CCI的相关配置修改
修改CCI的i2c stretch、i2c占空比、i2时钟修改都在dtsi中
路径: vendor/qcom/proprietary/camera-devicetree/
文件: {工程名}-camera.dtsi
比如开发平台未kona,文件为kona-camera.dtsi
i2c stretch
,i2c时钟延展,主机处理速度远大于从机处理速度,打开时钟延展为了让主机等待从机,直到从机处理完成。如果时钟延展关闭,可能会出现i2c timeout的问题。
占空比
,i2c的占空比会影响i2c的稳定性,最好的比例是1:2
,考虑到i2c stretch,在9:29
时会更稳定
//找到需要修改的设备CCI对应的编号,此处用CCI 0示例
cam_cci0: qcom,cci@ac4f000 {
cell-index = <0>;
compatible = "qcom,cci";
reg = <0xac4f000 0x1000>;
reg-names = "cci";
reg-cam-base = <0x4f000>;
//找到对应i2c 频率,100K,400K,1M位置相同,在此以1MHz为例
i2c_freq_1Mhz_cci0: qcom,i2c_fast_plus_mode {
hw-thigh = <16>; //i2c占空比高电平
hw-tlow = <22>; //i2c占空比低电平
hw-tsu-sto = <17>;
hw-tsu-sta = <18>;
hw-thd-dat = <16>;
hw-thd-sta = <15>;
hw-tbuf = <24>;
hw-scl-stretch-en = <1>;//i2c stretch时钟延展,默认0表示关闭,设置为1表示开启
hw-trdhld = <3>;
hw-tsp = <3>;
cci-clk-src = <37500000>;//CCI时钟选择,100K、400K时如果不配置,默认19.2M,1M时必须配置为37.5M
status = "ok";
};
}