计算机系统应用教程网站

网站首页 > 技术文章 正文

高通平台移植GC2145 Camera驱动 高通驱动安装

btikc 2024-10-27 08:35:20 技术文章 10 ℃ 0 评论

文档说明

本文档以SC806-CN-00(MSM8909平台 / Android 7)为例,说明如何移植GC2145 Camera驱动。

不想看分析的,直接跳到 "调试总结" 章节。


原厂驱动

GC2145是格科微公司的一款CMOS摄像头芯片,从资料上看,输出格式是YUV的。

百度走起,https://www.ccm99.com/resource-cat-71-1.html 能看到格科微GC2145的驱动,但是没有对应msm8909平台的。

找格科微原厂要,据说也没有,不过根据其他平台改了一份对应msm8909平台的驱动给我。 拿到手的代码如下所示:

https://uploader.shimo.im/f/zStVOK53zRIU6XGL.zip?attname=MSM8909_GC2145(1LANE)_Driver.zip&download

其中包含两个文件:

问格科微原厂,两个文件要如何移植,摆放在高通代码哪个路径下,没得到靠谱的答复。

反复通读高通文档,按自己的理解:

gc2145.c 是 kernel驱动部分

gc2145_lib.c 是 vendor驱动部分

相关高通文档:

《80-nu323-2sc_h_multimedia_driver_development_and_bringup_guide_-_camera_(simplified_chinese).pdf》

根据高通架构,在老基线版本上,也就是正在调试的这份源码,YUV摄像头实质上的驱动代码是放在 kernel部分,也就是 gc2145.c里面,包括上电时序、摄像头初始化设置等等。

修改设备树DTS文件

默认的 msm8909-camera-sensor-mtp.dtsi 里面有关camera的定义如下图所示:

qcom,camera@0 表示后摄, qcom,camera@1 表示前摄。

但是,重点来了,作为YUV摄像头,不能套用上面任何一个配置。需要新建一个:

78 和 0x78 表示是gc2145 I2C从器件地址。 qcom,camera@78,这里的78有些资料会提到只要唯一就行,不需要对应实际地址。保险起见,这里还是和从器件地址保持一致。

compatible = "qcom,gc2145";

qcom,sensor-name = "gc2145";

上面两个属性,需增加gc2145的器件名称,不能仅仅只写 "camera"

cell-index 属性不再需要,可删除。

0xf0 表示是寄存器地址,对应camera的sensor_id。

查看GC2145的手册,见下图:

接下来需要逐项核对 vdig / vana / vio / reset / pwdn 管脚的设置,这些管脚和摄像头上电时序相关。

先来看一下SC806模块和摄像头模组之间的连接:

对应关系:


上述原理图 DOVDD和DVDD是短接在一起的,因此 cam_vio-supply 和 cam_vdig-supply设置为同一路电压。

PWDN没有管脚,qcom,gpio-standby随便指定一个,即使设置错了暂时也没发现有什么问题。

gpios = <&msm_gpio n m>的gpio编号,查看SC806模块内部的原理图。

最后设置如下:

不理解的地方慢慢理解, 每个设置项具体含义可以查看:

kernel/Documentation/devicetree/bindings/media/video/msm-cci.txt

新增kernel部分驱动

把格科微给的gc2145.c放在以下路径,不做任何修改:

kernel/drivers/media/platform/msm/camera_v2/sensor/gc2145.c

修改相应的makefile文件

make bootimage -j8

打开kernel部分调试信息

新增vendor部分驱动

把格科微给的gc2145_lib.c放在以下路径,需要新建一个目录:

vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/gc2145

并新建一个Android.mk文件,可以参考源码里面自带的gc0310文件夹。

修改 vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/module/sensor_init.c,我们这里写死为 "gc2145"

gc2145_lib.c代码里面,最重要的两个属性,需要根据实际硬件连接进行设置:

static struct csi_lane_params_t csi_lane_params = {
  .csi_lane_assign = 0x0004,
  .csi_lane_mask = 0x18,
  .csi_if = 1,
  .csid_core = {0},
  .csi_phy_sel = 0,
};

  .csiphy_params = {
    .lane_cnt = 1,
    .settle_cnt = 0x18,// 100ns 0x14
    .combo_mode = 1,

csi_lane_assign 这个值的理解不太清楚,按照高通文档的说法,需要PHY通道号和sensor的数据通道对应。

SC806模块内部的原理图接法如下:

实践证明,以上连接对应关系,应设置 .csi_lane_assign = 0x0004。 理解不太透彻,以后再补充。

手上拿到的各种GC2145的代码,csi_lane_assign 的值一般有如下值: 0x4320 / 0xe4 / 0x0004,遇到问题都试一下吧。

csi_lane_mask 这个 8 位字段用于指示有效和要启用的 MIPI 通道。

SC806是一个PHY硬件连接两个摄像头,高通文档有如下描述:

我们这里使用的是Cam1,那么 csi_lane_mask 应设置为 0x18

其他值的说法如下:

特别要注意的是,SC806是属于两个摄像头共享一个PHY接口,因此 combo_mode 一定要设置为1,否则摄像头无法点亮。

vendor部分以上设置修改完成后,把 msm8909-camera-sensor-mtp.dtsi里面的设置改成一致。

qcom,csi-lane-assign = <0x0004>;

qcom,csi-lane-mask = <0x18>;

vendor编译方法:

vendor/qcom/proprietary/mm-camera/mm

编译生成两个so文件

out\target\product\la0920\system\vendor\lib\libmmcamera2_sensor_modules.so

out\target\product\la0920\system\vendor\lib\libmmcamera_gc2145.so

把这两个文件拷贝到电脑上。

更新gc2145库文件:

adb root

adb remount

adb push d:\libmmcamera2_sensor_modules.so /system/vendor/lib

adb push d:\libmmcamera_gc2145.so /system/vendor/lib

修改显示角度

点亮之后,角度和镜像不太正确,需要修改上下翻转和镜像设置。

修改 gc2145.c:

{0x17 , 0x14}, // mirror

改成

{0x17 , 0x14}, // mirror

修改红蓝反色

刚点亮摄像头时,怀着激动的心情打开一看,好像哪里不对劲,如下所示:

色调似乎偏蓝,一通搜索,这应该算是红蓝反色,修改下寄存器,把输出格式的Cb和Cr交换下。

修改 gc2145.c

{0x84 , 0x03}, //01

改成

{0x84 , 0x02}, //01

再次打开摄像头,色调正常了。

调试总结

  1. 找原厂要一份对应的YUV Camera驱动代码,*.c放在kernel部分,*_lib.c放在vendor部分
  2. 修改DTS,需要根据SOC模块和Camera之间连接的原理图 / SOC模块内部的原理图来确定。
  3. kernel部分驱动代码一般不用做任何修改,点亮之后看效果再做调整。
  4. vendor部分核对 csi_lane_params 和 csiphy_params ,这里也需要根据SOC模块和Camera之间连接的原理图 / SOC模块内部的原理图来确定。


patch代码

https://uploader.shimo.im/f/5Usl4YEtKZI7sdS4.rar?attname=gc2145_patch.rar&download

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表