Android NVidia Tegra2平台Camera架构浅析

    技术2025-03-29  11

    Android Camera相关code分布如下:

    1、Camera上层app的架构就不分析了,大家应该都很清楚。

    2、以下是Android多媒体常用c/s结构中的client部分

    frameworks/base/core/java/android/hardware/Camera.java, android.hardware.Camera

    frameworks/base/core/jni/android_hardware_Camera.cpp, 生成库libandroid_runtime.so

    frameworks/base/libs/camera,生成库libcamera_client.so;实现了Camera类,该类继承了BnCameraClient,DeathRecipient。

    以下是server部分:

    frameworks/base/camera/libcameraservice,生成libcameraservice.so

    实现了CameraService类,该类继承了BnCameraService(ICameraService),并实现了instantiate(),其内部包含一内部类class Client : public BnCamera ,ICamera类的实现主要靠BnCamera. openCameraHardware()在该类中调用。

    3、以下是Tegra2平台特有的部分:

    hardware/tegra/hal/libnvomxcamera,libcamera.so,实现CameraHardwareInterface接口,openCameraHardware()在该库中实现。

    hardware/tegra/core/drivers/openmax/ilclient,libnvomxilclient.so

    该库动态加载libnvomx.so库,并给包含9个OMX core 函数的结构体NvxFramework赋值,通过这种方法绕过了PVMF。PMVF对于OMX来说其实也就是一个omx client.

    hardware/tegra/core/drivers/openmax/il,libnvomx.so:OMX core 库

    libnvodm_imager.so:odm image 的hal库,这部分默认情况下NV只提供了binary,在full build时会将此库copy到system目录下,继而集成到system.img中去。

    libnvodm_query.so:odm 的查询库,对GPIO,供电,i2c等其他相关硬件配置在本库完成。

    对于一个手机支持两个或多个camera的问题,个人看法是上层告诉底层使用哪一个camera,然后每次OMX会重新构建OMX Graph,并在最后enable port的时候使用不同的camera硬件。上层处理基本保持一致。

    在android tegra2中添加一个camera

    Tegra芯片目前还没有和android系统很好地整合,毕竟nvidia做作支持android的决定时间也不算太长,听说已经在做了,会在android3.0上整合好吧,这个会不会实现只是猜测。

    在这种情况下,camera的驱动当然也就不会放在kernel下了,目前她被放在hardware/tegra/odm/product/***/下,要具体地添加一个camera及其驱动,主要步骤如下:

    1)odm_kit/query/include/nvodm_query_discovery_imager.h

    定义一个标识序列,例如

    #define QQ1234_GUID NV_ODM_GUID('s','_','Q','Q','1','2','3','4')

    2)odm_kit/query/subboards/nvodm_query_discovery_e***_addresses.h

    配置camera的硬件连接参数

    #define QQ1234_PINS (NVODM_CAMERA_DEVICE_IS_DEFAULT)

    static const NvOdmIoAddress s_ffaImagerQQ1234Addresses[] =

    {

    I2C配置;

    Reset GPIO 配置;

    powerdown GPIO 配置;

    Camera VDD 配置;

    VCSI 配置;

    Video input 配置;

    external Clock (CSUS)配置;

    };

    3)odm_kit/query/subboards/nvodm_query_discovery_e***_peripherals.h

    camera设备入口地址同GUID关联

    // QQ1234

    {

    QQ1234_GUID,

    s_ffaImagerQQ1234Addresses,

    NV_ARRAY_SIZE(s_ffaImagerQQ1234Addresses),

    NvOdmPeripheralClass_Imager

    },

    4)odm_kit/adaptations/imager/Android.mk

    LOCAL_SRC_FILES += sensor_yuv_qq1234.c

    5)odm_kit/adaptations/imager/imager_hal.c

    添加Hal层会枚举的camera类型

    #include "sensor_yuv_qq1234.h"

    DeviceHalTable g_SensorHalTable[] ={

    ....

    {QQ1234_GUID, SensorYuvQQ1234_GetHal},

    ....

    };

    5)odm_kit/adaptations/imager/sensor_yuv_qq1234.c

    odm_kit/adaptations/imager/sensor_yuv_qq1234.h

    NvBool SensorYuvxQQ1234_GetHal(NvOdmImagerHandle hImager);

    这是对camera设备的配置和功能的具体实现的文件。硬件校准之类的工作主要就是修改sensor_yuv_qq1234.c

    1: NvBool SensorYuvQQ1234_GetHal(NvOdmImagerHandle hImager) 2:   3: { 4:   5: if (!hImager || !hImager->pSensor) 6:   7: return NV_FALSE; 8:   9: hImager->pSensor->pfnOpen = SensorYuv_Open; 10:   11: hImager->pSensor->pfnClose = SensorYuv_Close; 12:   13: hImager->pSensor->pfnGetCapabilities = SensorYuv_GetCapabilities; 14:   15: hImager->pSensor->pfnListModes = SensorYuv_ListModes; 16:   17: hImager->pSensor->pfnSetMode = SensorYuv_SetMode; 18:   19: hImager->pSensor->pfnSetPowerLevel = SensorYuv_SetPowerLevel; 20:   21: hImager->pSensor->pfnGetPowerLevel = SensorYuv_GetPowerLevel; 22:   23: hImager->pSensor->pfnSetParameter = SensorYuv_SetParameter; 24:   25: hImager->pSensor->pfnGetParameter = SensorYuv_GetParameter; 26:   27: return NV_TRUE; 28:   29: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

    转自:http://qiuzhenqing.blog.edu.cn/2010/581021.html

    http://qiuzhenqing.blog.edu.cn/2010/591863.html

    最新回复(0)