添加一个camera
分析完了camera HAL的实现流程,我们就开始尝试着添加这么一个camera,具体的是在目录vendor/nvidia/tegra/odm/ventana/下,现在添加一个camera及其驱动,主要步骤如下:
vendor/nvidia/tegra/odm/ventana/odm_kit/query/include/nvodm_query_discovery_imager.h
定义一个标识序列,例如:
- #define SENSOR_YUV_GUID NV_ODM_GUID('s', '_', 'S', 'M', 'P', 'Y', 'U', 'V')
- #define SENSOR_YUV5_GUID NV_ODM_GUID('s', '_', 'S', 'M', 'P', 'Y', 'U', '5')
odm_kit/query/subboards/ nvodm_query_discovery_pm275_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)配置;
- };
- #define OV5650_PINS (NVODM_CAMERA_SERIAL_CSI_D1A | \
- NVODM_CAMERA_DEVICE_IS_DEFAULT)
- static const NvOdmIoAddress s_ffaImagerOV5650Addresses[] =
- {
- { NvOdmIoModule_I2c, 0x0, 0x6C },
- { NvOdmIoModule_VideoInput, 0x00, OV5650_PINS },
- { NvOdmIoModule_ExternalClock, 2, 0 } // CSUS
- };
本文中:
- static const NvOdmIoAddress s_ffaImagerSensorYUVAddresses[] =
- {
- { NvOdmIoModule_ExternalClock, 2, 0 } // CSUS
- };
- //END_END
- //COMPXX_START Sandow
- static const NvOdmIoAddress s_ffaImagerSensorYUV5Addresses[] =
- {
- { NvOdmIoModule_ExternalClock, 2, 0 } // CSUS
- };
odm_kit/query/subboards/ nvodm_query_discovery_pm275_peripherals.h
camera设备入口地址同GUID关联:
- //Sandow Imager Primary
- #if CONFIG_I_LOVE_XX
- {
- SENSOR_YUV5_GUID,
- s_ffaImagerSensorYUV5Addresses,
- NV_ARRAY_SIZE(s_ffaImagerSensorYUV5Addresses),
- NvOdmPeripheralClass_Imager
- },
- // Imager - Secondary
- {
- SENSOR_YUV_GUID,
- s_ffaImagerSensorYUVAddresses,
- NV_ARRAY_SIZE(s_ffaImagerSensorYUVAddresses),
- NvOdmPeripheralClass_Imager
- },
vendor/nvidia/tegra/odm/template/odm_kit/adaptations/imager/Android.mk
- LOCAL_SRC_FILES += sensor_yuv.c
- LOCAL_SRC_FILES += sensor_yuv5.c
vendor/nvidia/tegra/odm/template/odm_kit/adaptations/imager/imager_hal.c
添加Hal层会枚举的camera类型如下:
- #include "sensor_yuv.h"
- #include "sensor_yuv5.h"
- DeviceHalTable g_SensorHalTable[] ={
- ....
- {SENSOR_YUV_GUID, SensorYuv_GetHal},
- {SENSOR_YUV5_GUID, SensorYuv5_GetHal},
- ....
- };
vendor/nvidia/tegra/odm/template/odm_kit/adaptations/imager/ sensor_yuv.c
vendor/nvidia/tegra/odm/template/odm_kit/adaptations/imager/ sensor_yuv5.c
NvBool SensorYuv_GetHal(NvOdmImagerHandle hImager);
这是对camera设备的配置和功能的具体实现的文件。硬件校准之类的工作主要就是修改sensor_yuv.c(front camera)和sensor_yuv5.c(back camera)
- NvBool SensorYuv_GetHal(NvOdmImagerHandle hImager)
- {
- if (!hImager || !hImager->pSensor)
- return NV_FALSE;
- hImager->pSensor->pfnOpen = SensorYuv_Open;
- hImager->pSensor->pfnClose = SensorYuv_Close;
- hImager->pSensor->pfnGetCapabilities = SensorYuv_GetCapabilities;
- hImager->pSensor->pfnListModes = SensorYuv_ListModes;
- hImager->pSensor->pfnSetMode = SensorYuv_SetMode;
- hImager->pSensor->pfnSetPowerLevel = SensorYuv_SetPowerLevel;
- hImager->pSensor->pfnGetPowerLevel = SensorYuv_GetPowerLevel;
- hImager->pSensor->pfnSetParameter = SensorYuv_SetParameter;
- hImager->pSensor->pfnGetParameter = SensorYuv_GetParameter;
- return NV_TRUE;
- }