From fc5aed10d54ce3f2277a0b55c4d9046c0dd8ddb3 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 22 Oct 2024 15:14:39 -0700 Subject: [PATCH] Enable IFE linearization (#33852) * enable linearization * fixup * gate that --------- Co-authored-by: Comma Device --- system/camerad/cameras/ife.h | 56 ++++--------------------------- system/camerad/cameras/spectra.cc | 29 +++++++++++----- system/camerad/cameras/spectra.h | 1 + system/camerad/sensors/ox03c10.cc | 3 ++ system/camerad/sensors/sensor.h | 3 +- 5 files changed, 34 insertions(+), 58 deletions(-) diff --git a/system/camerad/cameras/ife.h b/system/camerad/cameras/ife.h index 18fbfb0067..b30c0a7d2a 100644 --- a/system/camerad/cameras/ife.h +++ b/system/camerad/cameras/ife.h @@ -5,6 +5,7 @@ int build_initial_config(uint8_t *dst, const SensorInfo *s, std::vector &patches) { + uint64_t addr; uint8_t *start = dst; dst += write_random(dst, { @@ -70,6 +71,9 @@ int build_initial_config(uint8_t *dst, const SensorInfo *s, std::vectornum_patches = patches.size(); pkt->patch_offset = sizeof(struct cam_cmd_buf_desc)*pkt->num_cmd_buf + sizeof(struct cam_buf_io_cfg)*pkt->num_io_configs; if (pkt->num_patches > 0) { + // linearization LUT + struct cam_patch_desc *patch = (struct cam_patch_desc *)((char*)&pkt->payload + pkt->patch_offset); + patch->dst_buf_hdl = ife_cmd.handle; + patch->src_buf_hdl = ife_linearization_lut.handle; + patch->dst_offset = patches[0]; + patch->src_offset = 0; + // gamma LUT for (int i = 0; i < 3; i++) { - struct cam_patch_desc *patch = (struct cam_patch_desc *)((char*)&pkt->payload + pkt->patch_offset + sizeof(cam_patch_desc)*i); + patch = (struct cam_patch_desc *)((char*)&pkt->payload + pkt->patch_offset + sizeof(cam_patch_desc)*(i+1)); patch->dst_buf_hdl = ife_cmd.handle; patch->src_buf_hdl = ife_gamma_lut.handle; - patch->dst_offset = patches[i]; + patch->dst_offset = patches[i+1]; patch->src_offset = ife_gamma_lut.size*i; } } @@ -857,11 +864,17 @@ void SpectraCamera::configISP() { ife_cmd.init(m, 67984, 0x20, CAM_MEM_FLAG_HW_READ_WRITE | CAM_MEM_FLAG_KMD_ACCESS | CAM_MEM_FLAG_UMD_ACCESS | CAM_MEM_FLAG_CMD_BUF_TYPE, m->device_iommu, m->cdm_iommu, FRAME_BUF_COUNT); - ife_gamma_lut.init(m, 64*sizeof(uint32_t), 0x20, - CAM_MEM_FLAG_HW_READ_WRITE | CAM_MEM_FLAG_KMD_ACCESS | CAM_MEM_FLAG_UMD_ACCESS | CAM_MEM_FLAG_CMD_BUF_TYPE, - m->device_iommu, m->cdm_iommu, 3); // 3 for RGB - for (int i = 0; i < 3; i++) { - memcpy(ife_gamma_lut.ptr + ife_gamma_lut.size*i, sensor->gamma_lut_rgb.data(), ife_gamma_lut.size); + if (!is_raw) { + ife_gamma_lut.init(m, 64*sizeof(uint32_t), 0x20, + CAM_MEM_FLAG_HW_READ_WRITE | CAM_MEM_FLAG_KMD_ACCESS | CAM_MEM_FLAG_UMD_ACCESS | CAM_MEM_FLAG_CMD_BUF_TYPE, + m->device_iommu, m->cdm_iommu, 3); // 3 for RGB + for (int i = 0; i < 3; i++) { + memcpy(ife_gamma_lut.ptr + ife_gamma_lut.size*i, sensor->gamma_lut_rgb.data(), ife_gamma_lut.size); + } + ife_linearization_lut.init(m, sensor->linearization_lut.size(), 0x20, + CAM_MEM_FLAG_HW_READ_WRITE | CAM_MEM_FLAG_KMD_ACCESS | CAM_MEM_FLAG_UMD_ACCESS | CAM_MEM_FLAG_CMD_BUF_TYPE, + m->device_iommu, m->cdm_iommu); + memcpy(ife_linearization_lut.ptr, sensor->linearization_lut.data(), ife_linearization_lut.size); } config_ife(0, 1, true); diff --git a/system/camerad/cameras/spectra.h b/system/camerad/cameras/spectra.h index fd2843b39e..9da66a0900 100644 --- a/system/camerad/cameras/spectra.h +++ b/system/camerad/cameras/spectra.h @@ -141,6 +141,7 @@ public: SpectraBuf ife_cmd; SpectraBuf ife_gamma_lut; + SpectraBuf ife_linearization_lut; SpectraBuf bps_cmd; SpectraBuf bps_cdm_buffer; diff --git a/system/camerad/sensors/ox03c10.cc b/system/camerad/sensors/ox03c10.cc index 04184cc99b..b39b496bfa 100644 --- a/system/camerad/sensors/ox03c10.cc +++ b/system/camerad/sensors/ox03c10.cc @@ -73,6 +73,9 @@ OX03C10::OX03C10() { fx = -0.507089*exp(-12.54124638*fx) + 0.9655*pow(fx, 0.5) - 0.472597*fx + 0.507089; gamma_lut_rgb.push_back((uint32_t)(fx*1023.0 + 0.5)); } + for (int i = 0; i < 288; i++) { + linearization_lut.push_back(0xff); + } } std::vector OX03C10::getExposureRegisters(int exposure_time, int new_exp_g, bool dc_gain_enabled) const { diff --git a/system/camerad/sensors/sensor.h b/system/camerad/sensors/sensor.h index 2dfb4d647b..5cb7b686d4 100644 --- a/system/camerad/sensors/sensor.h +++ b/system/camerad/sensors/sensor.h @@ -69,7 +69,8 @@ public: // ISP image processing params uint32_t black_level; std::vector color_correct_matrix; // 3x3 - std::vector gamma_lut_rgb; // gamma LUTs are length 64 * sizeof(uint32_t); same for r/g/b here + std::vector gamma_lut_rgb; // gamma LUTs are length 64 * sizeof(uint32_t); same for r/g/b here + std::vector linearization_lut; // length 288 }; class AR0231 : public SensorInfo {