1. 项目概述
在展锐UMS9620 Android 14平台上调试Camera和Flash模块是嵌入式开发中常见的硬件适配工作。作为平台厂商,展锐提供了完整的Camera和Flash驱动框架,但具体的硬件适配需要根据实际硬件设计进行配置和调试。本文将详细介绍从原理图分析到驱动配置的完整过程,包括:
- 硬件原理图解析
- 设备树(DTS)节点配置
- Flash驱动开发与集成
- Camera驱动配置
- Tuning参数设置
- 模组属性配置
2. 硬件原理分析
2.1 Flash模块原理
从提供的原理图可以看出,Flash模块采用的是AW36518芯片,这是一款常见的闪光灯驱动IC。关键点包括:
- I2C接口:Flash IC通过I2C6总线与主控通信,从机地址为0x63
- 控制信号:
- 芯片使能信号(CHIP_EN):GPIO42
- 手电筒使能信号(TORCH_EN):GPIO43
- 电源设计:需要确保供电电压和电流满足规格要求
2.2 Camera模块原理
Camera模块包含前后摄像头:
-
后置摄像头:
- 连接在I2C0总线,地址0x37
- 控制信号:
- 复位信号(RST):GPIO39
- 电源关断信号(PWDN):GPIO45
- 电源域:
- IOVDD:摄像头接口电压
- AVDD:模拟电压
- DVDD:数字电压
- AFVDD:自动对焦电机电压
-
前置摄像头:
- 连接在I2C1总线,地址0x37
- 控制信号:
- 复位信号(RST):GPIO40
- 电源关断信号(PWDN):GPIO46
- 电源域配置与后置类似
3. 设备树(DTS)配置
3.1 Flash节点配置
根据原理图信息,在设备树中配置Flash节点:
dts复制&i2c6 {
status = "okay";
clock-frequency = <400000>;
flash_ic: flash-ic@63 {
status = "okay";
compatible = "sprd,flash-aw36518";
reg = <0x63>;
sprd,flash-ic = <36518>;
flash-torch-en-gpios = <&ap_gpio 43 0>;
flash-chip-en-gpios = <&ap_gpio 42 0>;
};
};
关键参数说明:
clock-frequency:I2C总线频率设置为400kHzreg:I2C从机地址flash-torch-en-gpios:手电筒模式使能GPIOflash-chip-en-gpios:芯片使能GPIO
3.2 Camera节点配置
3.2.1 后置摄像头
dts复制&i2c0 {
status = "okay";
clock-frequency = <400000>;
sensor_main: sensor-main@37 {
status = "okay";
compatible = "sprd,sensor-main";
reg = <0x37>;
clock-names = "clk_src","sensor_eb",
"clk_96m","clk_64m",
"clk_51m2","clk_48m","clk_26m";
clocks = <&mm_clk CLK_SENSOR0>,<&mm_gate CLK_SENSOR0_EN>,
<&g5l_pll CLK_TGPLL_96M>,<&g5l_pll CLK_TGPLL_64M>,
<&g5l_pll CLK_TGPLL_51M2>,<&g5l_pll CLK_TGPLL_48M>,<&ext_26m>;
vddio-supply = <&vddcamio>; //IOVDD
vddcama-supply = <&vddcama0>; //AVDD
vddcamd-supply = <&vddcamd0>; //DVDD
vddcammot-supply = <&vddcammot0>; //AFVDD
reset-gpios = <&ap_gpio 39 0>;
power-down-gpios = <&ap_gpio 45 0>;
sprd,phyid = <0>;
csi = <&csi0>;
power-domains = <&mm_domain>;
};
};
3.2.2 前置摄像头
dts复制&i2c1 {
status = "okay";
clock-frequency = <400000>;
sensor_sub: sensor-sub@37 {
status = "okay";
compatible = "sprd,sensor-sub";
reg = <0x37>;
clock-names = "clk_src","sensor_eb",
"clk_96m","clk_64m",
"clk_51m2","clk_48m","clk_26m";
clocks = <&mm_clk CLK_SENSOR1>,<&mm_gate CLK_SENSOR1_EN>,
<&g5l_pll CLK_TGPLL_96M>,<&g5l_pll CLK_TGPLL_64M>,
<&g5l_pll CLK_TGPLL_51M2>,<&g5l_pll CLK_TGPLL_48M>,<&ext_26m>;
vddio-supply = <&vddcamio>;
vddcama-supply = <&vddcama1>;
vddcamd-supply = <&vddcamd1>;
vddcammot-supply = <&vddcammot1>;
reset-gpios = <&ap_gpio 40 0>;
power-down-gpios = <&ap_gpio 46 0>;
sprd,phyid = <1>;
csi = <&csi1>;
power-domains = <&mm_domain>;
};
};
4. Flash驱动开发
4.1 驱动代码结构
Flash驱动位于bsp/modules/common/camera/flash/aw36518/目录,主要包含:
- Kbuild:内核构建配置文件
- Makefile:外部构建文件
- flash_ic_aw36518_drv.c:驱动核心实现
4.2 关键驱动函数
4.2.1 初始化函数
c复制static int sprd_flash_ic_init(void *drvd)
{
int ret = 0;
struct flash_driver_data *drv_data = (struct flash_driver_data *)drvd;
if (!drv_data)
return -EFAULT;
if (drv_data->i2c_info) {
ret = flash_ic_driver_reg_write(drv_data->i2c_info, 0x01, 0x00);
ret = flash_ic_driver_reg_write(drv_data->i2c_info, 0x08, 0x1f);
pr_info("flash ic init ret %d %d\n", ret, __LINE__);
}
return 0;
}
4.2.2 手电筒模式控制
c复制static int sprd_flash_ic_open_torch(void *drvd, uint8_t idx)
{
struct flash_driver_data *drv_data = (struct flash_driver_data *)drvd;
if (!drv_data)
return -EFAULT;
pr_info("torch_led_index:%d, idx:%d\n", drv_data->torch_led_index, idx);
idx = drv_data->torch_led_index;
if (drv_data->i2c_info) {
flash_ic_driver_reg_write(drv_data->i2c_info, 0x01, 0x0a);
}
return 0;
}
4.2.3 闪光灯模式控制
c复制static int sprd_flash_ic_open_highlight(void *drvd, uint8_t idx)
{
struct flash_driver_data *drv_data = (struct flash_driver_data *)drvd;
if (!drv_data)
return -EFAULT;
pr_info("torch_led_index:%d, idx:%d\n", drv_data->torch_led_index, idx);
idx = drv_data->torch_led_index;
if (drv_data->i2c_info) {
flash_ic_driver_reg_write(drv_data->i2c_info, 0x01, 0x0E);
}
return 0;
}
4.3 驱动集成
将编译生成的KO文件添加到系统镜像中:
- 修改
device/sprd/vnd_mpool/module/vnd_others/bsp/mfeature/kernel/kernel5.15/msoc/qogirn6pro/ko/km.mk:
makefile复制RECOVERY_KERNEL_MODULES += \
$(BSP_KERNEL_MODULES_OUT)/system_heap.ko \
$(BSP_KERNEL_MODULES_OUT)/sprd_flash_drv.ko \
$(BSP_KERNEL_MODULES_OUT)/flash_ic_ocp8137.ko \
$(BSP_KERNEL_MODULES_OUT)/flash_ic_aw36518.ko \
$(BSP_KERNEL_MODULES_OUT)/sprd_sensor.ko \
$(BSP_KERNEL_MODULES_OUT)/sprd_camera.ko \
$(BSP_KERNEL_MODULES_OUT)/sprd_cpp.ko
- 修改
modules.load文件添加驱动加载项:
text复制sprd-dmabuf.ko
sprd_flash_drv.ko
flash_ic_ocp8137.ko
flash_ic_aw36518.ko
sprd_sensor.ko
5. Camera驱动配置
5.1 驱动添加
Camera驱动位于vendor/sprd/modules/libcamera/sensor/sensor_drv/,需要为每个传感器添加对应的驱动库:
- 修改
sensor_lib_cfg.mk添加驱动库:
makefile复制PRODUCT_PACKAGES += libsensor_imx351 \
libsensor_gc5035_x6511 \
libsensor_s5khm6sx \
libsensor_ov8856_transsion \
libsensor_virtual_sensor \
libsensor_gc05a2 \
libsensor_gc08a8
- 驱动库实现:
- 实现传感器初始化、参数配置等接口
- 支持I2C通信和控制信号操作
- 提供图像格式和分辨率配置
5.2 Tuning参数配置
Tuning参数位于vendor/sprd/modules/libcamera/sensor/its_param/目录:
- 为每个传感器创建对应的参数目录
- 参数文件命名必须与
sensor_config.xml中的TuningName一致 - 修改
libcam_device.mk确保参数文件被打包到系统镜像:
makefile复制PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*,vendor/sprd/modules/libcamera/sensor/its_param/qogirn6pro/Galaxycore/gc05a2_back_main,vendor/firmware/gc05a2_back_main) \
$(call find-copy-subdir-files,*,vendor/sprd/modules/libcamera/sensor/its_param/qogirn6pro/Galaxycore/gc05a2_sm_front_main,vendor/firmware/gc05a2_sm_front_main) \
$(call find-copy-subdir-files,*,vendor/sprd/modules/libcamera/sensor/its_param/qogirn6pro/Galaxycore/gc08a8_front_main,vendor/firmware/gc08a8_front_main) \
$(call find-copy-subdir-files,*,vendor/sprd/modules/libcamera/sensor/its_param/qogirn6pro/Galaxycore/gc08a8_back_main,vendor/firmware/gc08a8_back_main)
6. 模组属性配置
模组属性配置文件位于device/sprd/qogirn6pro/ums9620_1h10/module/camera/sensor_config.xml,关键配置项:
xml复制<CameraModuleCfg>
<SlotId>0</SlotId>
<SensorName>gc05a2</SensorName>
<Facing>BACK</Facing>
<Orientation>90</Orientation>
<Resource_cost>55</Resource_cost>
<VCM>
<AfName>dw9714p</AfName>
<Mode>0</Mode>
</VCM>
<TuningParameter>
<TuningName>gc05a2_back_main</TuningName>
</TuningParameter>
</CameraModuleCfg>
配置说明:
SlotId:摄像头物理接口编号SensorName:传感器型号,必须与驱动名称对应Facing:摄像头朝向(BACK/FRONT)Orientation:图像旋转角度VCM:自动对焦马达配置TuningParameter:图像调优参数目录名
7. 调试技巧与常见问题
7.1 Flash调试问题
-
Flash不工作:
- 检查I2C通信是否正常:使用i2c-tools工具验证
- 确认GPIO控制信号是否正确
- 检查电源供电是否正常
-
闪光亮度不足:
- 调整驱动电流设置
- 检查LED选型是否匹配驱动能力
- 验证电源电压是否达到规格要求
7.2 Camera调试问题
-
摄像头无法识别:
- 检查I2C通信是否正常
- 验证reset和pwdn信号时序
- 确认电源各电压域是否正常
-
图像异常:
- 检查MIPI信号质量
- 验证时钟频率和相位
- 检查Tuning参数是否正确加载
-
自动对焦失效:
- 确认VCM驱动是否正确配置
- 检查马达供电是否正常
- 验证AF算法参数
7.3 调试工具推荐
-
I2C调试:
- i2c-tools包中的i2cdetect、i2cget、i2cset
- 逻辑分析仪抓取I2C波形
-
GPIO调试:
- sysfs接口:/sys/class/gpio
- 示波器验证信号时序
-
Camera调试:
- 展锐提供的IspTool工具
- Camera HAL层日志
8. 性能优化建议
-
启动速度优化:
- 合理配置Camera probe时序
- 预加载Tuning参数
- 优化电源上电时序
-
功耗优化:
- 合理设置低功耗模式
- 优化传感器工作模式切换
- 减少不必要的I2C通信
-
图像质量优化:
- 精细调整Tuning参数
- 优化AE/AWB/AF算法
- 校准镜头 shading
在实际调试过程中,建议先确保基本功能正常工作,再逐步进行性能优化。同时要密切关注功耗和温升情况,避免因过度优化导致其他问题。
