高通msm8953平台摄像头移植

硬件平台:msm8953

系统版本:android9

摄像头sensor:gc2385

由于项目需要,在高通msm8953上使用GC2385摄像头,移植成功,记录下移植过程碰到的问题。首先要向摄像头供应商要sensor的驱动,驱动的获取很重要,要拿到正确硬件平台及安卓版本的驱动,否则会走不少弯路咯。

1、添加驱动文件

在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs 路径下新建gc2385文件夹,拷贝gc2385.c、gc2385.h、Android.mk三个文件,Android.mk文件需要做修改,否则有可能会编译出错,可以把其他sensor驱动的Android.mk文件拷贝过来,修改LOCAL_C_INCLUDES 、LOCAL_SRC_FILES、LOCAL_MODULE三个地方即可

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../../../../../mm-camerasdk/sensor/includes/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../sensors/module/
LOCAL_C_INCLUDES += gc2385_lib.h

LOCAL_SRC_FILES:= gc2385_lib.c
LOCAL_MODULE           := libmmcamera_gc2385
LOCAL_SHARED_LIBRARIES := libcutils

ifeq ($(MM_DEBUG),true)
LOCAL_SHARED_LIBRARIES += liblog
endif

LOCAL_MODULE_OWNER := qti
LOCAL_PROPRIETARY_MODULE := true

ifeq ($(32_BIT_FLAG), true)
LOCAL_32_BIT_ONLY := true
endif

include $(BUILD_SHARED_LIBRARY)

2、配置电源

注意kernel/msm-4.9/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi文件AVDD、DVDD、IOVDD的配置,由于一般按照默认配置,不需要修改,调试的时候,注意这几个电压是否有输出。

3、上电时序

上电时序在文件gc2385_lib.h,根据sensor的时序图,注意对应引脚电平变化顺序,如果有增加或删减,需要.size,此处由于电路板的画图的时候引脚化的有问题,RESET和STANDBY时序做了下修改。

 

4、 msm8953_camera.xm配置添加sensor

修改vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs\msm8953_camera.xml文件,添加GC2385配置,其中CameraId与msm8953-camera-sensor-mtp.dtsi中的qcom,camera@0, qcom,camera@1 and qcom,camera@2一致,CSIDCore与qcom,csid-sd-index一致

<CameraModuleConfig>
    <CameraId>0</CameraId>
    <SensorName>gc2385</SensorName>
    <FlashName>pmic</FlashName>
    <EepromName>gc2385_otp</EepromName>
    <ChromatixName>gc2385_chromatix</ChromatixName>
    <ModesSupported>1</ModesSupported>
    <Position>FRONT</Position>
    <MountAngle>270</MountAngle>
    <CSIInfo>
      <CSIDCore>0</CSIDCore>
      <LaneMask>0x3</LaneMask>
      <LaneAssign>0x4320</LaneAssign>
      <ComboMode>0</ComboMode>
    </CSIInfo>
    <LensInfo>
      <FocalLength>3.83</FocalLength>
      <FNumber>2.0</FNumber>
      <TotalFocusDistance>1.97</TotalFocusDistance>
      <HorizontalViewAngle>63.2</HorizontalViewAngle>
      <VerticalViewAngle>49.0</VerticalViewAngle>
      <MinFocusDistance>0.1</MinFocusDistance>
    </LensInfo>
  </CameraModuleConfig>

5、添加Chromatix代码

在vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/chromatix/0310下添加chromatix_gc2385文件夹

6、添加gc2385_chromatix.xml

vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/configs 下添加 gc2385_chromatix.xml,修改Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE:= gc2385_chromatix.xml
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := gc2385_chromatix.xml
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/camera
LOCAL_MODULE_OWNER := qti
include $(BUILD_PREBUILT)

7、 添加.so文件

vendor/qcom/proprietary/common/config/device-vendor.mk下添加相关编译目标so文件

#GC2385 add start
MM_CAMERA += gc2385_chromatix.xml
MM_CAMERA += libmmcamera_gc2385
MM_CAMERA += libchromatix_gc2385_common
MM_CAMERA += libchromatix_gc2385_postproc
MM_CAMERA += libchromatix_gc2385_snapshot
MM_CAMERA += libchromatix_gc2385_cpp_preview
MM_CAMERA += libchromatix_gc2385_cpp_snapshot
MM_CAMERA += libchromatix_gc2385_cpp_liveshot
MM_CAMERA += libchromatix_gc2385_zsl_preview
#GC2385 add end

8、编译

编译后查看out/target/product/msm8953_64/vendor/lib下是否生成如下so文件

9、调试

首先调试驱动,查看日志,是否有提示 gc2385 probe succeeded 的提示,如果提示 gc2385 read id fail,排查电源及上电时序,在调试驱动时,可直接push libmmcamera_gc2385.so库。

probe成功后,下载system.img、vendor.img、userdata.img,开启相机软件闪退,折腾了一段时间,查不出什么原因,直接全编全刷了一下,图像出来了,后面有空再查找原因。

10、镜像和180°旋转

摄像头图像左右镜像直接修改sensor驱动文件

#define GC2385_MIRROR_FLIP_ENABLE 1 

摄像头图像旋转180°,修改msm8953_camera.xml

   <MountAngle>270</MountAngle>

只能旋转180°,不能旋转90°,如果确实需要旋转90°,只能旋转摄像头了。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是高通 MSM8953 SoC 上使用 DTS(Device Tree Source)描述的 GPIO 驱动实例: ``` &tlmm { gpio_keys: gpio-keys { compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&button_pins>; status = "okay"; button@4 { label = "power"; gpios = <&tlmm 4 GPIO_ACTIVE_LOW>; linux,code = <KEY_POWER>; debounce-interval = <50>; gpio-key,wakeup; gpio-key,wakeup-source; }; button@3 { label = "volume_up"; gpios = <&tlmm 3 GPIO_ACTIVE_LOW>; linux,code = <KEY_VOLUMEUP>; debounce-interval = <50>; }; button@2 { label = "volume_down"; gpios = <&tlmm 2 GPIO_ACTIVE_LOW>; linux,code = <KEY_VOLUMEDOWN>; debounce-interval = <50>; }; }; button_pins: button_pins { pins = "gpio4", "gpio3", "gpio2"; function = "gpio_in"; drive-strength = <2>; bias-disable; }; }; ``` 在上面的示例,我们定义了一个名为“gpio_keys”的节点,它表示一个 GPIO 按键设备。在该节点下,我们定义了三个名为“button@*”(*表示数字)的子节点,它们分别表示三个按键。每个按键节点都指定了其使用的 GPIO 引脚编号,所以我们需要在该文件定义一个名为“button_pins”的节点,它表示我们将使用哪些 GPIO 引脚。在“button_pins”节点,我们指定了使用 GPIO 引脚 2、3 和 4,它们的功能为“gpio_in”,表示我们将使用它们作为输入引脚,而不是输出引脚。最后,我们指定了每个按键的 Linux 按键代码(即在 Linux 内核定义的按键码)、抖动时间和唤醒源等属性。 当系统启动时,内核根据设备树的 GPIO 配置自动加载相应的 GPIO 驱动程序。在本例,内核将加载“gpio-keys”驱动程序,并将其绑定到我们定义的“gpio_keys”节点上。这样,我们就可以在 Linux 系统使用这三个按键了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值