camera: ois: update aw86006 driver to v0.5.0.4

[detail]
update aw86006 driver to v0.5.0.4

Change-Id: Id31babd182095932606ddfec1a4ed1e45c6be32b
Signed-off-by: liuwang2 <liuwang2@lenovo.com>
Reviewed-on: https://gerrit.mot.com/2238334
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: <zhaoxy41@motorola.com>
Reviewed-by: XiaoFeng Wang <wangxf32@lenovo.com>
Reviewed-by: Shuo Wang <wangsh18@motorola.com>
Reviewed-by: Zhichao Chen <chenzc2@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
liuwang2 2022-04-11 14:31:01 +08:00 • committed by zhaoji1
commit bf34dbc973
5 changed files with 918 additions and 682 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,14 @@
#ifndef AW86006_OIS_H
#define AW86006_OIS_H
/* Log Format */
#define AW_LOGI(format, ...) \
CAM_INFO(CAM_OIS, format, ##__VA_ARGS__)
#define AW_LOGD(format, ...) \
CAM_DBG(CAM_OIS, format, ##__VA_ARGS__)
#define AW_LOGE(format, ...) \
CAM_ERR(CAM_OIS, format, ##__VA_ARGS__)
/* I2c address */
#define AW_SHUTDOWN_I2C_ADDR (0xC2 >> 1) /* 0x61 */
#define AW_WAKEUP_I2C_ADDR (0xD2 >> 1) /* 0x69 */
@ -30,6 +38,7 @@
#define OIS_SUCCESS (0)
#define AW_IC_STANDBY (1)
#define AW_FLASH_WRITE_CONNECT
/* #define AW_SOC_FLASH_READ_FLAG */
/* Loop */
#define AW_STAY_ON_MOVE_LOOP (20)
@ -40,9 +49,16 @@
#define AW_FLASH_ERASE_ERROR_LOOP (2)
#define AW_JUMP_BOOT_LOOP (6)
#define AW_JUMP_MOVE_LOOP (6)
#define AW_STOP_CMD_LOOP (10)
/* Addr or data size */
#define AW_SIZE_BYTE_0 (0)
#define AW_SIZE_BYTE_1 (1)
#define AW_SIZE_BYTE_2 (2)
#define AW_SIZE_BYTE_3 (3)
#define AW_SIZE_BYTE_4 (4)
#define AW_SIZE_BYTE_12 (12)
#define AW_SIZE_BYTE_20 (20)
#define AW_PROTOCOL_SIZE (14)
#define AW_DATA_SHIFT_0_BIT (0)
#define AW_DATA_SHIFT_8_BIT (8)
#define AW_DATA_SHIFT_16_BIT (16)
@ -80,7 +96,6 @@
#define AW_FW_SHIFT_UPDATE_FLAG (AW_FW_SHIFT_MOVE_LENGTH + 8)
#define AW_ARRAY_SHIFT_UPDATE_FLAG (AW_FW_SHIFT_UPDATE_FLAG - AW_FLASH_MOVE_LENGTH)
/* SOC */
enum soc_status {
SOC_OK = 0,
@ -93,65 +108,77 @@ enum soc_status {
};
enum soc_module {
SOC_HANK = 0x01,
SOC_SRAM = 0x02,
SOC_FLASH = 0x03,
SOC_END = 0x04,
SOC_HANK = 0x01,
SOC_SRAM = 0x02,
SOC_FLASH = 0x03,
SOC_END = 0x04,
};
enum soc_enum {
SOC_VERSION = 0x01,
SOC_CTL = 0x00,
SOC_ACK = 0x01,
SOC_ADDR = 0x84,
SOC_READ_ADDR = 0x48,
SOC_ERASE_STRUCT_LEN = 6,
SOC_READ_STRUCT_LEN = 6,
SOC_PROTOCAL_HEAD = 9,
SOC_CONNECT_WRITE_LEN = 9,
SOC_ERASE_WRITE_LEN = 15,
SOC_READ_WRITE_LEN = 15,
SOC_ERASE_BLOCK_DELAY = 8,
SOC_WRITE_BLOCK_HEAD = 13,
SOC_WRITE_BLOCK_DELAY = 1000, /* us */
SOC_READ_BLOCK_DELAY = 2000, /* us */
SOC_CONNECT_DELAY = 2000, /* us */
SOC_VERSION = 0x01,
SOC_CTL = 0x00,
SOC_ACK = 0x01,
SOC_ADDR = 0x84,
SOC_READ_ADDR = 0x48,
SOC_ERASE_STRUCT_LEN = 6,
SOC_READ_STRUCT_LEN = 6,
SOC_PROTOCAL_HEAD = 9,
SOC_CONNECT_WRITE_LEN = 9,
SOC_ERASE_WRITE_LEN = 15,
SOC_READ_WRITE_LEN = 15,
SOC_ERASE_BLOCK_DELAY = 8,
SOC_WRITE_BLOCK_HEAD = 13,
SOC_WRITE_BLOCK_DELAY = 1000, /* us */
SOC_READ_BLOCK_DELAY = 2000, /* us */
SOC_CONNECT_DELAY = 2000, /* us */
};
enum soc_flash_event {
SOC_FLASH_WRITE = 0x01,
SOC_FLASH_WRITE_ACK = 0x02,
SOC_FLASH_READ = 0x11,
SOC_FLASH_READ_ACK = 0x12,
SOC_FLASH_ERASE_BLOCK = 0x21,
SOC_FLASH_ERASE_BLOCK_ACK = 0x22,
SOC_FLASH_ERASE_CHIP = 0x23,
SOC_FLASH_ERASE_CHIP_ACK = 0x24,
SOC_FLASH_WRITE = 0x01,
SOC_FLASH_WRITE_ACK = 0x02,
SOC_FLASH_READ = 0x11,
SOC_FLASH_READ_ACK = 0x12,
SOC_FLASH_ERASE_BLOCK = 0x21,
SOC_FLASH_ERASE_BLOCK_ACK = 0x22,
SOC_FLASH_ERASE_CHIP = 0x23,
SOC_FLASH_ERASE_CHIP_ACK = 0x24,
};
enum soc_hank_event {
SOC_HANK_CONNECT = 0x01,
SOC_HANK_CONNECT_ACK = 0x02,
SOC_HANK_PROTICOL = 0x11,
SOC_HANK_PROTICOL_ACK = 0x12,
SOC_HANK_VERSION = 0x21,
SOC_HANK_VERSION_ACK = 0x22,
SOC_HANK_ID = 0x31,
SOC_HANK_ID_ACK = 0x32,
SOC_HANK_DATE = 0x33,
SOC_HANK_DATA_ACK = 0x34,
SOC_HANK_CONNECT = 0x01,
SOC_HANK_CONNECT_ACK = 0x02,
SOC_HANK_PROTICOL = 0x11,
SOC_HANK_PROTICOL_ACK = 0x12,
SOC_HANK_VERSION = 0x21,
SOC_HANK_VERSION_ACK = 0x22,
SOC_HANK_ID = 0x31,
SOC_HANK_ID_ACK = 0x32,
SOC_HANK_DATE = 0x33,
SOC_HANK_DATA_ACK = 0x34,
};
/* ISP */
enum isp_enum {
ISP_READ_VERSION_DELAY = 500, /* us */
ISP_VERS_CONNECT_ACK = 0x01,
ISP_VERSION_ACK_LEN = 5,
ISP_EVENT_OK = 0x01,
ISP_READ_VERSION_DELAY = 500, /* us */
ISP_VERS_CONNECT_ACK = 0x01,
ISP_VERSION_ACK_LEN = 5,
ISP_EVENT_OK = 0x01,
};
enum awrw_flag {
AW_SEQ_WRITE = 0,
AW_SEQ_READ = 1,
AW_SEQ_WRITE = 0,
AW_SEQ_READ = 1,
};
enum axis_info {
AXIS_X,
AXIS_Y,
AXIS_Z,
};
struct accelgyro_dift {
int16_t gyro_dift[3];
int16_t accel_dift[3];
};
/* Struct */

View file

@ -17,7 +17,7 @@
extern int dw9781c_check_fw_download(struct camera_io_master * io_master_info, const uint8_t *fwData, uint32_t fwSize);
extern void dw9781_post_firmware_download(struct camera_io_master * io_master_info, const uint8_t *fwData, uint32_t fwSize);
extern int aw_firmware_update(struct cam_ois_ctrl_t *o_ctrl, const struct firmware *fw);
extern int aw86006_firmware_update(struct cam_ois_ctrl_t *o_ctrl, const struct firmware *fw);
int32_t cam_ois_construct_default_power_setting(
struct cam_sensor_power_ctrl_t *power_info)
@ -415,9 +415,9 @@ static int cam_ois_fw_prog_download(struct cam_ois_ctrl_t *o_ctrl)
CAM_INFO(CAM_OIS, "Firmware download started.");
}
else if (strstr(o_ctrl->ois_name, "aw86006")) {
mutex_lock(&o_ctrl->ois_mutex_aw);
rc = aw_firmware_update(o_ctrl, fw);
mutex_unlock(&o_ctrl->ois_mutex_aw);
mutex_lock(&o_ctrl->aw_ois_mutex);
rc = aw86006_firmware_update(o_ctrl, fw);
mutex_unlock(&o_ctrl->aw_ois_mutex);
return rc;
}

View file

@ -10,8 +10,8 @@
#include "cam_debug_util.h"
#include "camera_main.h"
extern int aw_ois_init(struct cam_ois_ctrl_t *o_ctrl); /* awinic add */
extern int aw_ois_exit(struct cam_ois_ctrl_t *o_ctrl); /* awinic add */
extern int aw86006_ois_init(struct cam_ois_ctrl_t *o_ctrl); /* awinic add */
extern int aw86006_ois_exit(struct cam_ois_ctrl_t *o_ctrl); /* awinic add */
static int cam_ois_clear_data_ready(struct cam_ois_ctrl_t *o_ctrl)
{
@ -515,7 +515,7 @@ static int cam_ois_component_bind(struct device *dev,
init_completion(&o_ctrl->ois_data_complete);
if (o_ctrl->ic_name != NULL && strstr(o_ctrl->ic_name, "aw86006"))
aw_ois_init(o_ctrl);
aw86006_ois_init(o_ctrl);
if (o_ctrl->is_ois_vsync_irq_supported) {
o_ctrl->vsync_irq = platform_get_irq_optional(pdev, 0);
@ -571,7 +571,7 @@ static void cam_ois_component_unbind(struct device *dev,
CAM_INFO(CAM_OIS, "platform driver remove invoked");
if (o_ctrl->ic_name != NULL && strstr(o_ctrl->ic_name, "aw86006"))
aw_ois_exit(o_ctrl);
aw86006_ois_exit(o_ctrl);
soc_info = &o_ctrl->soc_info;
for (i = 0; i < soc_info->num_clk; i++)

View file

@ -94,6 +94,13 @@ struct cam_ois_intf_params {
struct cam_req_mgr_crm_cb *crm_cb;
};
struct awrw_ctrl {
uint32_t addr[4];
uint16_t reg_num;
uint8_t flag;
uint8_t *reg_data;
};
/**
* struct cam_ois_ctrl_t - OIS ctrl private data
* @device_name : ois device_name
@ -168,11 +175,9 @@ struct cam_ois_ctrl_t {
uint64_t mono_timestamp;
/* awinic_add */
const char *ic_name;
struct work_struct fw_update_work;
uint32_t awrw_flag;
uint32_t reg_num;
uint8_t *reg_data;
struct mutex ois_mutex_aw;
struct work_struct aw_fw_update_work;
struct mutex aw_ois_mutex;
struct awrw_ctrl *awrw_ctrl;
};
/**