• 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来调试。

  • 相关阅读:
    CRM
    eclipse 全局替换
    ps 泡泡
    SSH重新登录的问题
    又说oracle spatial 将Geometry转为gml
    其实你可以这样折腾java enum
    Sqlite 多线程入库
    Oracle spatial 将Geometry转换为gml字符串
    Oracle 关于WKT构造SDO_GEOMETRY的问题。
    Lucene之拉框查询
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298342.html
Copyright © 2020-2023  润新知