zoukankan      html  css  js  c++  java
  • Camera 涉及的文件70

    点击打开链接

    Camera 涉及的文件

    1、上电时序

    Mediate/custom/$PROJECT/Camera/Camera/kd_camera_hw.c

    Mediate/custom/$PROJECT/Camera/Camera/kd_camera_hw.h

    2、

    模块驱动:

    Mediate/custom/common/kernel/imgsensor/src/kdsensorlist.c

    Mediate/custom/common/kernel/imgsensor/src/kdsensorlist.h

    IO控制的定义,ID以及sensor名称定义等:

    Mediate/custom/common/kernel/imgsensor/inc/kd_imgsensor.h

    提供给用户空间条用的接口:

    Mediate/custom/common/kernel/imgsensor/inc/kd_imgsensor_define.h

    3、驱动文件

    YUV的模组定义使用xxx_yuv:

    Mediate/custom/common/kernel/imgsensor/hi253_yuv/

    Mediate/custom/common/kernel/imgsensor/hi253_mipi_yuv/

    RAW的模组定义使用xxx_raw或者XXX_mipi_raw文件夹命名,其中xxx_raw一般使用的数据接口为并口,XXX_mipi_raw使用MIPI接口

    Mediate/custom/common/kernel/imgsensor/xxx_raw/

    Mediate/custom/common/kernel/imgsensor/xxx_mipi_raw/

    该驱动文件实现Mediate/custom/common/kernel/imgsensor/src/kdsensorlist.c

    文件中模块驱动的接口,如下:

    MULTI_SENSOR_FUNCTION_STRUCT kd_MultiSensorFunc =

    {

    kd_MultiSensorOpen, ?------------------? SensorOpen

    kd_MultiSensorGetInfo, ?----------------?SensorGetInfo

    kd_MultiSensorGetResolution,?------------? SensorGetResolution

    kd_MultiSensorFeatureControl,?----------? SensorFeatureControl

    kd_MultiSensorControl, ?-----------------? SensorControl

    kd_MultiSensorClose ?--------------------?iSensorClose

    };

    而通过该接口中的函数可以看出,调用该接口实际调用到

    4、HAL

    Mediate/custom/common/kernel/hal/xxx_raw/

    Mediate/custom/common/kernel/hal/xxx_mipi_raw/

    Mediate/custom/common/kernel/hal/xxx_yuv/

    Mediate/custom/common/kernel/hal/xxx_mipi_yuv/

    Mediate/custom/common/kernel/hal/src/

    注意两个文件(以后会讲到):

    Mediate/custom/common/kernel/hal/src/sensorlist.cpp

    Mediate/custom/common/kernel/hal/xxx_yuv/cfg.ftbl.XXX_yuv.h或者

    Mediate/custom/common/kernel/hal/xxx_yuv/cfg.ftbl.XXX_raw.h

    5、Camera驱动和HAL优先级调用顺序:

    (1)kernel优先级:

    Mediate/custom/$PROJECT/kernel/imgsensor/

    Mediate/custom/$PLATFORM/kernel/imgsensor/

    Mediate/custom/common/kernel/imgsensor/

    (2)HAL层优先级:

    Mediate/custom/$PROJECT/hal/imgsensor/

    Mediate/custom/$PLATFORM/hal/imgsensor/

    Mediate/custom/common/hal/imgsensor/

    从上到下优先级逐步递减

    6、系统配置

    Mediate/config/$PROJECT/ProjectConfig.mk

    Mediate/config/$PROJECT/init.rc

    重点:

    5、怎么样添加一个新的驱动

    以下以hi253为例子:

    1、需要向供应商或者MTK要资料有哪些

    (1)芯片原厂的sensor芯片手册

    (2)向芯片原厂要驱动程序或者超找目前平台上MTK是否已经支持该sensor,如果支持,直接可以提E-Service向MTK要驱动。

    一般情况MTK或者Sensor原厂提供的驱动:

    (2)将驱动添加到代码中,有以下几个步骤:

    1)将驱动放到Mediate/custom/common/kernel/imgsensor/ 下面,命名为hi253_yuv文件夹。

    2)在Mediate/custom/common/kernel/imgsensor/inc/kd_imgsensor.h中定义ID和sensor名称,如下:

    #define HI253_SENSOR_ID 0x0092

    #define SENSOR_DRVNAME_HI253_YUV "hi253yuv"

    3)在Mediate/custom/common/kernel/imgsensor/src/kdsensorlist.h 中定义初始化函数声明,在Kdsensorlist数组中加入hi253的定义,如下:

    UINT32 HI253_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);

    ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] =

    { ………….

    …………

    ………….

    #if defined(HI253_YUV)

    {HI253_SENSOR_ID, SENSOR_DRVNAME_HI253_YUV, HI253_YUV_SensorInit},

    #endif

    ………………..

    ………………..

    }

    4、将原厂或者MTK给的驱动文件中HAL部分放到

    Mediate/custom/common/hal/imgsensor/hi253_yuv/

    5、在Mediate/custom/common/kernel/hal/src/sensorlist.cpp中sensorlist数组中添加hi253的

    接口,如下:

    MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =

    {

    ……………………….

    ……………………..

    #if defined(HI253_YUV)

    YUV_INFO(HI253_SENSOR_ID, SENSOR_DRVNAME_HI253_YUV,NULL),

    #endif

    ……………………………

    …………………………….

    }

    6、camera的系统配置,将新添加的模组添加到系统配置文件中,如下:

    1)Mediate/config/$PROJECT/ProjectConfig.mk

    CUSTOM_HAL_IMGSENSOR =hi253_yuv siv121d_yuv hi257_yuv sp0a19_yuv

    CUSTOM_HAL_MAIN_BACKUP_IMGSENSOR=hi257_yuv

    CUSTOM_HAL_MAIN_IMGSENSOR = hi253_yuv

    CUSTOM_HAL_SUB_IMGSENSOR =siv121d_yuv

    CUSTOM_HAL_SUB_BACKUP_IMGSENSOR=sp0a19_yuv

    CUSTOM_KERNEL_IMGSENSOR = hi253_yuv siv121d_yuv hi257_yuv sp0a19_yuv

    CUSTOM_ KERNEL _MAIN_BACKUP_IMGSENSOR=hi257_yuv

    CUSTOM_ KERNEL _MAIN_IMGSENSOR = hi253_yuv

    CUSTOM_ KERNEL _SUB_IMGSENSOR =siv121d_yuv

    CUSTOM_ KERNEL _SUB_BACKUP_IMGSENSOR=sp0a19_yuv

    2)Mediate/config/$PROJECT/init.rc

    添加如下:

    #Camera

    chmod 0664 /dev/camera-sysram

    chmod 0664 /dev/camera-isp

    chmod 0664 /dev/camera-pipemgr

    chmod 0660 /dev/kd_camera_hw

    chmod 0660 /dev/kd_camera_flashlight

    chmod 0660 /dev/kd_camera_hw_bus2

    chmod 0660 /dev/FM50AF

    chmod 0660 /dev/CAM_CAL_DRV

    chown system camera /dev/camera-sysram

    chown system camera /dev/camera-isp

    chown system camera /dev/camera-pipemgr

    chown system camera /dev/kd_camera_hw

    chown system camera /dev/kd_camera_flashlight

    chown system camera /dev/kd_camera_hw_bus2

    chown system camera /dev/FM50AF

    chown system camera /dev/CAM_CAL_DRV

    注意:上面两个步骤优先级顺序如下(从上到下逐步降低):

    Mediate/config/$PROJECT/

    Mediate/config/$PPLATFORM/

    Mediate/config/common/

    7、打开sensor原厂给的Camera上电时序和下电时序部分,按照sensor的上电和下电时序以及MTK上电时序文件编写模组上电和下电时序。

    Mediate/custom/$PROJECT/Camera/Camera/kd_camera_hw.c

    Mediate/custom/$PROJECT/Camera/Camera/kd_camera_hw.h

    注意有时需要查看模组说明书。并且每个模组一个上下电一个函数,以方便移植或出问题好查找。

    6、调试过程中常遇到的问题:

    (1)读不到ID,这种情况,首先排除硬件部分,如模组没焊接好(有时是数据总线或者I2C或者其它控制线)。其次就是上电时序没上正确。

    (2)前后置摄像头切换有问题:

    这种情况一般是在上前置camera时没将后置camera的PDN设成不工作引起的。同样上后置camera时没将前置摄像头PDN设成不工作。这样会引起在切换到前置或后置时另外一个sensor仍然有数据输出,到ISP报ANR错误。

    (3)camera漏电:

    这种情况一般多时下电时PDN处理不当引起的,一般情况是在下电的时候将PDN拉高之后在拉低,然后在下电。而如果是有前后置camera,那么不管当前是哪个camera,下电时对PDN统一处理。

    (4)模组的方向,前后置模组之间的夹角是90度,如果不配置成90度,会引起显示图像的方向不正确,调整下边的驱动是达不到目的的。这个配置在如下路径:

    Mediate/custom/MT6572/hal/camera/camera/cfg_setting_imgsensor.h中的

    SensorOrientation_T const&

    getSensorOrientation()

    {

    static SensorOrientation_T const inst = {

    u4Degree_0 : 90, // main sensor in degree (0, 90, 180, 270)

    u4Degree_1 : 0, // sub sensor in degree (0, 90, 180, 270)

    u4Degree_2 : 90, // main2 sensor in degree (0, 90, 180, 270)

    };

    return inst;

    }

    这个配置好了之后,如果方向不正确,可以通过驱动中的方向调整函数进行调整,如下: static void XXXXXSetMirror(kal_uint16 ImageMirror)

    (5)功能配置和sensor插值,这个部分主要是由sensor的hal层的

    Mediate/custom/common/kernel/hal/xxx_yuv/cfg.ftbl.XXX_yuv.h 文件的配置来实现。

    在这个配置文件中如果添加了相应的配置之后,在camera APP打开之后,点击菜单项功能不起作用,一般情况下是驱动中没有添加相应的接口引起的,在驱动中的XXXXControl()或者XXXXFeatureControl()函数中添加相应的接口。大都是在XXXXFeatureControl()函数中添加相应的接口。

    (6)拍照图片的制造商信息,这个部分在如下文件中配置,

    Mediate/custom/MT6572/hal/camera/camera/camera_custom_if.cpp中,如下:

    #ifdef EN_CUSTOM_EXIF_INFO //打开这个部分

    #define CUSTOM_EXIF_STRING_MAKE "custom make" //修改字符串

    #define CUSTOM_EXIF_STRING_MODEL "custom model"

    #define CUSTOM_EXIF_STRING_SOFTWARE "custom software"

    (7)工程模式查看当前使用的摄像头,这个部分在Camera模块进行注册时添加相应的注册接口,将当前使用的摄像头的驱动名称给返回到用户空间给用户使用,参考

    Mediate/custom/common/kernel/imgsensor/src/kdsensorlist.c

    文件中的

    #ifdef LCT_MTK_CAM_INFO_SUPPORT

    #ednif

    部分。在该文件中,向系统注册时添加了

    /proc/driver/camsensor_info的接口,用户空间直接读取这个接口即可得到当前系统中使用的camera模组。

    (8)预览图像时,物体快速移动,图像撕裂现象,这种情况一般是由于LCD帧速率不够,或者LCD刷新频率不够引起的。

    (9)色彩饱和度的调试

    针对YUV sensor模组,主要由sensor或者模组厂家来调试。

    针对raw sensor模组,主要由MTK来调试。

  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298342.html
Copyright © 2011-2022 走看看