作为一名在MTK平台摸爬滚打多年的Camera驱动工程师,我深知Sensor移植这项工作的技术含量和实际价值。今天以IMX335这颗经典Sensor为例,手把手带大家走通MTK Android11平台的完整移植流程。
IMX335是索尼推出的1/2.8英寸、500万像素CMOS图像传感器,在安防监控、车载影像等领域应用广泛。在MTK平台上移植这颗Sensor,需要打通从硬件接口到软件驱动的全链路,涉及I2C通信、时钟配置、电源管理、图像处理管线适配等多个技术环节。下面我就结合最近完成的一个实际项目,分享具体操作方法和避坑经验。
IMX335采用MIPI CSI-2接口与主控通信,硬件连接需要重点关注以下几点:
电源轨配置:
时钟输入:
MIPI线路设计:
提示:硬件设计阶段务必用示波器检查各电源上电时序,IMX335要求DVDD早于AVDD上电,间隔建议100ms以上。
建议准备以下调试工具:
MTK平台Camera驱动采用V4L2框架,主要修改以下文件:
添加Sensor驱动文件:
c复制// kernel-4.19/drivers/misc/mediatek/imgsensor/src/mt6765/imx335_mipi_raw/
├── imx335mipi_Sensor.c // 主要驱动逻辑
├── imx335mipi_Sensor.h // 寄存器定义
└── Makefile
关键驱动接口实现:
c复制static struct imgsensor_vendor_register_info imx335_vendor_reg = {
.sensor_register = imx335_write_register,
.sensor_read_register = imx335_read_register,
.sensor_config = imx335_config,
};
static int imx335_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
// 初始化时序配置
imx335_table_write_cmos_sensor(init_setting, ARRAY_SIZE(init_setting));
// 注册V4L2子设备
register_camera_sensor(&imx335_vendor_reg);
}
时钟配置要点:
c复制// 在dtsi文件中配置
&camera0 {
clocks = <&topckgen CLK_TOP_CAMTG_SEL>,
<&topckgen CLK_TOP_UNIVPLL_48M_D2>;
clock-names = "camtg", "pll";
};
Android Camera HAL需要实现以下关键功能:
3A算法参数调整:
xml复制<!-- vendor/mediatek/proprietary/hardware/mtkcam/feature/3a/3a_hal/params/imx335.xml -->
<AETarget>
<ExpTimeRange min="10000" max="10000000"/> <!-- 1ms-1s -->
<GainRange min="100" max="1600"/> <!-- 1x-16x -->
</AETarget>
分辨率配置:
cpp复制// vendor/mediatek/proprietary/hardware/mtkcam/feature/setting/plugin/p1/imx335.cpp
static std::vector<Resolution> supportedResolutions = {
{2592, 1944, 30}, // 500万像素@30fps
{1920, 1080, 60}, // 1080p@60fps
{1280, 720, 120} // 720p@120fps
};
使用i2c-tools检查设备地址:
bash复制adb shell i2cdetect -y 0 # 扫描I2C总线
正常应显示IMX335的地址0x1A
寄存器读写测试:
bash复制adb shell i2cset -f -y 0 0x1a 0x0100 0x01 # 写寄存器
adb shell i2cget -f -y 0 0x1a 0x0100 # 读寄存器
常见问题:若通信失败,检查:
- 上电时序是否符合规格书要求
- I2C上拉电阻是否合适(建议4.7KΩ)
- 信号完整性(用示波器检查SCL/SDA波形)
检查CSI-2数据链路:
bash复制adb shell cat /proc/mtk_mipitx/0/csi2
正常输出应显示lane同步状态和错误计数
使用v4l2-ctl抓图测试:
bash复制adb shell v4l2-ctl -d /dev/video0 --set-fmt-video=width=2592,height=1944,pixelformat=RGGB \
--stream-mmap=3 --stream-to=/data/test.raw --stream-count=1
通过优化以下参数可提升帧率:
缩短blanking时间:
c复制// 在init_setting数组中调整:
{0x0340, 0x0C}, // frame_length_lines[15:8]
{0x0341, 0xDC}, // frame_length_lines[7:0]
{0x0342, 0x13}, // line_length_pck[15:8]
{0x0343, 0x88} // line_length_pck[7:0]
启用Binning模式:
c复制{0x0390, 0x01}, // binning_mode_x
{0x0391, 0x01}, // binning_mode_y
调整模拟增益曲线:
c复制{0x0204, 0x00}, // coarse_integration_time[15:8]
{0x0205, 0x00}, // coarse_integration_time[7:0]
{0x020E, 0x01}, // analog_gain[9:8]
{0x020F, 0x00} // analog_gain[7:0]
优化黑电平校准:
bash复制adb shell "echo 1 > /sys/class/camera/imx335/black_level_cal"
可能原因及解决方案:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 固定位置条纹 | MIPI时钟抖动 | 检查时钟源质量,添加屏蔽罩 |
| 随机噪点 | 电源噪声 | 增加电源滤波电容 |
| 周期性波纹 | 同步信号干扰 | 调整MIPI lane走线 |
典型调试流程:
bash复制adb shell cat /sys/class/regulator/regulator.10/state
bash复制adb shell gpioset 0 18=1 # 拉高reset
adb shell gpioset 0 18=0 # 拉低reset
bash复制adb shell "echo 1 > /sys/class/clk/pmic_clk/enable"
OTP烧录规范:
老化测试项目:
生产测试脚本示例:
python复制def test_camera():
# 检查Sensor ID
assert read_sensor_id() == 0x0335
# 测试自动对焦
assert af_test() < 300 # 对焦时间<300ms
# 检查图像质量
img = capture_test_pattern()
assert psnr(img, ref_img) > 30dB
移植完成后,建议用MTK提供的Camera Tuning Tool进行细致的图像质量调校。实际项目中我发现,IMX335在低照度下的表现很大程度上取决于模拟增益的校准精度,这部分需要反复测试不同光照条件下的图像信噪比。另外,MTK平台的ISP流水线配置也需要与Sensor特性匹配,特别是去马赛克算法和降噪参数的调整,对最终成像效果影响很大。