From 518ae94bb440055f5f1591f3117fcce964d531b2 Mon Sep 17 00:00:00 2001 From: Praveen AC Date: Thu, 8 Feb 2024 07:32:04 +0000 Subject: [PATCH] media: i2c: update ar0234 EEPROM data structure - Integrate calibration data structure from Leopard Imaging hawk driver into NVIDIA hawk driver - Rearrange EEPROM calibration data structure to maintain backward compatibility with HAWK, OWL modules with EEPROMs programmed using earlier calibration data structure - Use separate structures for tracking imu noise parameters and place it after the module serial number. - Change module serial number length used for reading the serial number from EEPROM data L4T-4649 Change-Id: I17613905e63fef3fc690dca42a0a10bd1f4fc24d Signed-off-by: Praveen AC Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3072846 Tested-by: mobile promotions Reviewed-by: mobile promotions --- drivers/media/i2c/nv_ar0234.c | 39 +++++++++++++++++++++++----- drivers/media/i2c/nv_hawk_owl.c | 45 ++++++++++++++++++++++++++++----- 2 files changed, 70 insertions(+), 14 deletions(-) diff --git a/drivers/media/i2c/nv_ar0234.c b/drivers/media/i2c/nv_ar0234.c index f29392ec..aef88392 100644 --- a/drivers/media/i2c/nv_ar0234.c +++ b/drivers/media/i2c/nv_ar0234.c @@ -28,6 +28,7 @@ #define MAX_TANGENTIAL_COEFFICIENTS 2 #define MAX_FISHEYE_COEFFICIENTS 6 #define CAMERA_MAX_SN_LENGTH 32 +#define LEOP_CAMERA_MAX_SN_LENGTH 10 #define MAX_RLS_COLOR_CHANNELS 4 #define MAX_RLS_BREAKPOINTS 6 @@ -126,7 +127,13 @@ struct camera_extrinsics { float tx, ty, tz; }; -struct imu_params { +/* + * IMU parameters used by HAWK 1.0. HAWK 1.0 did not have IMU noise model parameters + * in EEPROM. To preserve backward compatibility with HAWK 1.0, the EEPROM data is arranged + * in a certain way which requires tracking the imu noise model parameters in a + * separate structure. + */ +struct imu_params_v1 { // 3D vector to add to accelerometer readings float linear_acceleration_bias[3]; // 3D vector to add to gyroscope readings @@ -135,7 +142,12 @@ struct imu_params { float gravity_acceleration[3]; // Extrinsic structure for IMU device struct camera_extrinsics extr; - // Noise model parameters +}; + +struct imu_params_noise_m { + /* + * Noise model parameters + */ float update_rate; float linear_acceleration_noise_density; float linear_acceleration_random_walk; @@ -143,6 +155,14 @@ struct imu_params { float angular_velocity_random_walk; }; +/* + * Combined IMU calibration data structure + */ +struct imu_params_v2 { + struct imu_params_v1 imu_data_v1; + struct imu_params_noise_m nm; +}; + struct radial_lsc_params { // Image height u16 image_height; @@ -185,7 +205,7 @@ struct NvCamSyncSensorCalibData { u8 imu_present; // Intrinsic structure for IMU - struct imu_params imu; + struct imu_params_v2 imu; // HAWK module serial number u8 serial_number[CAMERA_MAX_SN_LENGTH]; @@ -220,10 +240,14 @@ struct LiEeprom_Content_Struct { /** * Intrinsic structure for IMU */ - struct imu_params imu; + struct imu_params_v1 imu; + + u8 tmp[16]; // HAWK module serial number - u8 serial_number[CAMERA_MAX_SN_LENGTH]; + u8 serial_number[LEOP_CAMERA_MAX_SN_LENGTH]; + + struct imu_params_noise_m nm; // Radial Lens Shading Correction parameters struct radial_lsc_params left_rls; @@ -677,9 +701,10 @@ static int ar0234_fill_eeprom(struct tegracam_device *tc_dev, priv->EepromCalib.cam_extr = tmp->cam_extr; priv->EepromCalib.imu_present = tmp->imu_present; - priv->EepromCalib.imu = tmp->imu; + priv->EepromCalib.imu.imu_data_v1 = tmp->imu; + priv->EepromCalib.imu.nm = tmp->nm; memcpy(priv->EepromCalib.serial_number, tmp->serial_number, - CAMERA_MAX_SN_LENGTH); + 8); if (priv->sync_sensor_index == 1) priv->EepromCalib.rls = tmp->left_rls; diff --git a/drivers/media/i2c/nv_hawk_owl.c b/drivers/media/i2c/nv_hawk_owl.c index 60cfc4ad..5e875e4e 100644 --- a/drivers/media/i2c/nv_hawk_owl.c +++ b/drivers/media/i2c/nv_hawk_owl.c @@ -26,6 +26,7 @@ #define MAX_TANGENTIAL_COEFFICIENTS 2 #define MAX_FISHEYE_COEFFICIENTS 6 #define CAMERA_MAX_SN_LENGTH 32 +#define LEOP_CAMERA_MAX_SN_LENGTH 10 #define MAX_RLS_COLOR_CHANNELS 4 #define MAX_RLS_BREAKPOINTS 6 #define OWL_CHANNEL 1 @@ -128,6 +129,13 @@ typedef struct // Translation parameter from one camera to another parameter float tx, ty, tz; } camera_extrinsics; + +/* + * IMU parameters used by HAWK 1.0. HAWK 1.0 did not have IMU noise model parameters + * in EEPROM. To preserve backward compatibility with HAWK 1.0, the EEPROM data is arranged + * in a certain way which requires tracking the imu noise model parameters in a + * separate structure. + */ typedef struct { // 3D vector to add to accelerometer readings @@ -138,13 +146,26 @@ typedef struct float gravity_acceleration[3]; // Extrinsic structure for IMU device camera_extrinsics extr; - // Noise model parameters +} imu_params_v1; + +typedef struct { + /* + * Noise model parameters + */ float update_rate; float linear_acceleration_noise_density; float linear_acceleration_random_walk; float angular_velocity_noise_density; float angular_velocity_random_walk; -} imu_params; +} imu_params_noise_m; + +/* + * Combined IMU calibration data structure + */ +typedef struct { + imu_params_v1 imu_data_v1; + imu_params_noise_m nm; +} imu_params_v2; typedef struct { // Image height @@ -188,7 +209,7 @@ typedef struct u8 imu_present; // Intrinsic structure for IMU - imu_params imu; + imu_params_v2 imu; // HAWK module serial number u8 serial_number[CAMERA_MAX_SN_LENGTH]; @@ -196,6 +217,7 @@ typedef struct // Radial Lens Shading Correction parameters radial_lsc_params rls; } NvCamSyncSensorCalibData; + typedef struct { /** @@ -223,15 +245,20 @@ typedef struct /** * Intrinsic structure for IMU */ - imu_params imu; + imu_params_v1 imu; + + u8 tmp[16]; // HAWK module serial number - u8 serial_number[CAMERA_MAX_SN_LENGTH]; + u8 serial_number[LEOP_CAMERA_MAX_SN_LENGTH]; + + imu_params_noise_m nm; // Radial Lens Shading Correction parameters radial_lsc_params left_rls; radial_lsc_params right_rls; } LiEeprom_Content_Struct; + struct ar0234 { struct camera_common_eeprom_data eeprom[AR0234_EEPROM_NUM_BLOCKS]; u8 eeprom_buf[AR0234_EEPROM_SIZE]; @@ -246,17 +273,20 @@ struct ar0234 { const char *sensor_name; NvCamSyncSensorCalibData EepromCalib; }; + static const struct regmap_config sensor_regmap_config = { .reg_bits = 16, .val_bits = 16, .cache_type = REGCACHE_RBTREE, }; + static inline void ar0234_get_coarse_time_regs_shs1(ar0234_reg *regs, u16 coarse_time) { regs->addr = AR0234_COARSE_TIME_SHS1_ADDR; regs->val = (coarse_time) & 0xffff; } + static inline void ar0234_get_gain_reg(ar0234_reg *regs, u16 gain) { @@ -762,9 +792,10 @@ static int ar0234_fill_eeprom(struct tegracam_device *tc_dev, } priv->EepromCalib.cam_extr = tmp->cam_extr; priv->EepromCalib.imu_present = tmp->imu_present; - priv->EepromCalib.imu = tmp->imu; + priv->EepromCalib.imu.imu_data_v1 = tmp->imu; + priv->EepromCalib.imu.nm = tmp->nm; memcpy(priv->EepromCalib.serial_number, tmp->serial_number, - CAMERA_MAX_SN_LENGTH); + 8); if (priv->sync_sensor_index == 1) priv->EepromCalib.rls = tmp->left_rls;