Android NVidia Tegra2平台Camera架构浅析
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
總結
以上是生活随笔為你收集整理的Android NVidia Tegra2平台Camera架构浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: glassfish linux,使用gl
- 下一篇: Linux版本查看及PS1配置