| /* |
| * File: miniisp.h |
| * Description: Mini ISP sample codes |
| * |
| * Copyright 2019-2030 Altek Semiconductor Corporation |
| * |
| * 2013/11/01; Bruce Chung; Initial version |
| * 2017/03/30; LouisWang; 2rd version |
| */ |
| |
| /* |
| * This file is part of al6100. |
| * |
| * al6100 is free software: you can redistribute it and/or modify it under |
| * the terms of the GNU General Public License version 2, as published by |
| * the Free Software Foundation. |
| * |
| * al6100 is distributed in the hope that it will be useful, but WITHOUT ANY |
| * WARRANTY; without even the implied warranty of MERCHANTIBILITY or FITNESS |
| * FOR A PARTICULAR PURPOSE. See the GNU General Public License version 2 for |
| * more details. |
| * |
| * You should have received a copy of the General Public License version 2 |
| * along with al6100. If not, see https://www.gnu.org/licenses/gpl-2.0.html. |
| */ |
| |
| |
| #ifndef _MINI_ISP_H_ |
| #define _MINI_ISP_H_ |
| |
| /******Include File******/ |
| #include <linux/mutex.h> |
| #include <linux/semaphore.h> |
| #include <linux/spi/spi.h> |
| #include <linux/types.h> |
| #include <linux/clk.h> |
| #include <linux/interrupt.h> |
| #include <linux/i2c.h> |
| |
| #include "mtype.h" |
| /******Public Constant Definition******/ |
| |
| #define MINIISP_DRIVER_VERSION "v1.48.A4" |
| |
| /* SPI_E_AND_I2C_SLAVE_RELATED */ |
| #define CTRL_BYTE_REGRD (0x19) |
| #define CTRL_BYTE_REGWR (0x09) |
| #define CTRL_BYTE_MEMRD (0x15) |
| #define CTRL_BYTE_MEMWR (0x05) |
| /* SPI_E CMD */ |
| #define CTRL_BYTE_REGRD_W (0x81) |
| #define CTRL_BYTE_MEMRD_W (0x82) |
| #define CTRL_BYTE_GETDATA_W (0x83) |
| |
| #define EMODE_TXCMD_LEN (5) /*1byte ctrl byte + 4 bytes address*/ |
| |
| #define EN_SPIE_REG_DUMMY_BYTE 1 |
| #if EN_SPIE_REG_DUMMY_BYTE |
| #define SPIE_RX_REG_DUMMY_LEN (16) |
| #define SPIE_RX_MEM_DUMMY_LEN (70) |
| #else |
| #define SPIE_RX_DUMMY_LEN (32) |
| #endif |
| |
| /*SPI_A_MODE_RELATED*/ |
| #define CTRL_BYTE_A2E 0x20 |
| #define SPI_TX_BULK_SIZE (64 * 1024) |
| #define SPI_TX_BULK_SIZE_BOOT (8 * 1024) |
| |
| /*I2C_TOP_RELATED*/ |
| /*#define I2C_BULK_SIZE (4 * 1024) *//* AQ360 can work */ |
| #define I2C_TX_BULK_SIZE (1024) /*AL6100 can work*/ |
| #define I2C_RX_DUMMY_LEN (0) |
| |
| #define TX_BUF_SIZE 64 |
| #define RX_BUF_SIZE 64 |
| |
| #define MINIISP_I2C_SLAVE 0 |
| #define MINIISP_I2C_TOP 1 |
| |
| #define INTF_SPI_READY (1 << 0) |
| #define INTF_I2C_READY (1 << 1) |
| #define INTF_CCI_READY (1 << 2) |
| |
| #define DEBUG_ALERT 1 |
| #define DEBUG_TURNON 1 |
| |
| /* Enable for use Linux Firmware API "request_firmware" to load fw or bin file |
| * The file search path is be defined at below array |
| * drivers/base/firmware_class.c: const fw_path[] |
| * User need to add required search path into this array |
| */ |
| #define ENABLE_LINUX_FW_LOADER 1 |
| |
| /* Enable below function |
| * 1. mast_bulk_data_cmd_read_calibration_data |
| * 2. mast_bulk_data_cmd_read_memory_data |
| */ |
| |
| #define ENABLE_FILP_OPEN_API 0 |
| |
| #define ENABLE_FSM 0 |
| |
| /*#define ALTEK_TEST*/ |
| |
| #ifdef DEBUG_TURNON |
| |
| #ifdef DEBUG_ALERT |
| #define misp_info(fmt, ...) \ |
| pr_err(MINI_ISP_LOG_TAG ": " fmt "\n",\ |
| ##__VA_ARGS__) |
| |
| #define misp_warn(fmt, ...) \ |
| pr_warn(MINI_ISP_LOG_TAG ": " fmt "\n",\ |
| ##__VA_ARGS__) |
| |
| #define misp_err(fmt, ...) \ |
| pr_err(MINI_ISP_LOG_TAG ": " fmt "\n",\ |
| ##__VA_ARGS__) |
| #else |
| #define misp_info(fmt, ...) \ |
| pr_err(MINI_ISP_LOG_TAG ": " fmt "\n",\ |
| ##__VA_ARGS__) |
| |
| #define misp_warn(fmt, ...) \ |
| pr_debug(MINI_ISP_LOG_TAG ": " fmt "\n",\ |
| ##__VA_ARGS__) |
| |
| #define misp_err(fmt, ...) \ |
| pr_debug(MINI_ISP_LOG_TAG ": " fmt "\n",\ |
| ##__VA_ARGS__) |
| #endif |
| |
| #else |
| #define misp_info(fmt, ...) |
| #define misp_err(fmt, ...) |
| #define misp_warn(fmt, ...) |
| |
| #endif |
| |
| /*ALTEK SPI MODE*/ |
| /*define Altek SPI mode*/ |
| enum ALTEK_SPI_MODE { |
| ALTEK_SPI_MODE_E = 0, |
| ALTEK_SPI_MODE_A, |
| }; |
| |
| /* |
| *@typedef USPICTRL_MS_CB_ID |
| *@brief USPI control byte definition (for master control) |
| */ |
| enum { |
| /*!< Ctrl-Byte, original command */ |
| USPICTRL_MS_CB_ORG = (0x00<<6), |
| /*!< Ctrl-Byte, polling status */ |
| USPICTRL_MS_CB_STS = (0x01<<6), |
| /*!< Ctrl-Byte, get response */ |
| USPICTRL_MS_CB_RSP = (0x02<<6), |
| /*!< Ctrl-Byte, disable Ctrl-Byte mode */ |
| USPICTRL_MS_CB_DIS = (0x03<<6), |
| }; |
| |
| /*Event Bit define*/ |
| /*define ISP control Master event Bit*/ |
| enum MINI_ISP_EVENT { |
| MINI_ISP_RCV_WAITING = 0, /* 0x00000000*/ |
| MINI_ISP_RCV_CMD_READY = (1L << 0), /* 0x00000001*/ |
| MINI_ISP_RCV_BULKDATA = (1L << 1), /* 0x00000002*/ |
| MINI_ISP_RCV_CPCHANGE = (1L << 2), /* 0x00000004*/ |
| MINI_ISP_RCV_SETSENSORMODE = (1L << 3),/* 0x00000008*/ |
| MINI_ISP_RCV_ERROR = (1L << 4),/* 0x00000010*/ |
| MINI_ISP_RCV_ERROR2 = (1L << 5),/* 0x00000020*/ |
| MINI_ISP_RCV_STRMOFF = (1L << 6),/* 0x00000040*/ |
| }; |
| |
| /* Definition for IRQ status*/ |
| #define COMMAND_COMPLETE 0x0001/*cmd deal complete by altek chip*/ |
| #define BULK_DATA_COMPLETE 0x0002/*bulk data deal complete by altek chip*/ |
| #define CP_STATUS_CHANGE_DONE 0x0004/*code persistence mode change finish*/ |
| #define SET_SENSOR_MODE_READY 0x0008 |
| #define SYSTEM_ERROR_LEVEL1 0x0010/*(Get Report)*/ |
| #define SYSTEM_ERROR_LEVEL2 0x0020/*(Dump Register)*/ |
| #define STRMOFF_READY 0x0040/*default not use*/ |
| |
| enum MINI_ISP_STATE { |
| MINI_ISP_POWER_OFF = 0, |
| MINI_ISP_POWER_ON = 1, |
| MINI_ISP_STANDBY = 3, |
| MINI_ISP_SENSOR_MODE = 4, |
| MINI_ISP_CP_MODE = 5, |
| }; |
| |
| enum MINI_CALIB_ID { |
| CALIBRATION_ID_OTP = 0, |
| CALIBRATION_ID_DEPTH = 1, |
| CALIBRATION_ID_SCID = 2, |
| CALIBRATION_ID_HDR = 3, |
| CALIBRATION_ID_IRP0 = 4, |
| CALIBRATION_ID_IRP1 = 5, |
| CALIBRATION_ID_PPMAP = 6, |
| CALIBRATION_ID_BLENDINGTABLE = 7, |
| CALIBRATION_ID_QMERGE = 8, |
| CALIBRATION_ID_EEPROM = 9, |
| CALIBRATION_ID_ALTEK = 10, |
| CALIBRATION_ID_MAX, |
| }; |
| /******Public Type Declaration******/ |
| struct misp_intf_fn_t { |
| int (*send)(void *devdata, u32 len); |
| int (*recv)(void *devdata, u32 len, bool waitINT); |
| int (*read)(void *devdata, u8 *tx_buf, u32 tx_len, u8 *rx_buf, |
| u32 rx_len); |
| int (*write)(void *devdata, u8 *tx_buf, u8 *rx_buf, u32 len); |
| #if ENABLE_LINUX_FW_LOADER |
| int (*send_bulk)(void *devdata, u32 total_size, u32 block_size, |
| bool is_raw, const u8 *Sendbulkbuffer); |
| #else |
| int (*send_bulk)(void *devdata, struct file *filp, u32 total_size, |
| u32 block_size, bool is_raw, u8 *Sendbulkbuffer); |
| #endif |
| }; |
| |
| struct misp_data { |
| union { |
| struct spi_device *spi; |
| struct i2c_client *i2c; |
| /*struct msm_camera_i2c_client *cci;*/ |
| } __packed cfg; |
| |
| struct misp_intf_fn_t *intf_fn; |
| int bulk_cmd_blocksize; |
| u8 tx_buf[TX_BUF_SIZE]; |
| u8 rx_buf[RX_BUF_SIZE]; |
| }; |
| |
| struct misp_global_variable { |
| int vcc1_gpio; |
| int vcc2_gpio; |
| int vcc3_gpio; |
| int irq_gpio; |
| int wp_gpio; |
| int irq_num; |
| int reset_gpio; |
| int intf_status; |
| int before_booting; |
| int i2c_enable; |
| int altek_spi_mode; |
| int be_set_to_bypass; |
| int now_state; |
| int spi_low_speed_mode; |
| bool en_cmd_send; |
| struct clk *isp_clk; |
| struct mutex busy_lock; |
| }; |
| |
| |
| struct irp_and_depth_information { |
| u32 irp_image_address; |
| u32 irp_width; |
| u32 irp_height; |
| u8 irp_format;/*Y_only:0 YUV:1*/ |
| u32 depth_image_address; |
| u32 depth_width; |
| u32 depth_height; |
| u8 fov_mode; |
| } __packed; |
| |
| /******Public Function Prototype******/ |
| extern irqreturn_t mini_isp_irq(int irq, void *handle); |
| |
| /*miniisp_spi.c*/ |
| extern struct misp_data *get_mini_isp_data(void); |
| extern void set_mini_isp_data(struct misp_data *data, int intf_type); |
| extern struct misp_data *get_mini_isp_intf(int i2c_type); |
| extern struct misp_global_variable *get_mini_isp_global_variable(void); |
| extern int mini_isp_get_bulk(struct misp_data *devdata, u8 *response_buf, |
| u32 total_size, u32 block_size); |
| /*extern u16 mini_isp_get_status(void); //currently not use*/ |
| |
| /*miniisp_top.c*/ |
| extern void mini_isp_e_to_a(void); |
| extern void mini_isp_a_to_e(void); |
| extern void mini_isp_chip_init(void); |
| extern void mini_isp_cp_mode_suspend_flow(void); |
| extern void mini_isp_cp_mode_resume_flow(void); |
| extern void mini_isp_check_and_leave_bypass_mode(void); |
| extern int mini_isp_pure_bypass(u16 mini_isp_mode); |
| extern void mini_isp_pure_bypass_debug(u16 mini_isp_mode); |
| extern int mini_isp_get_chip_id(void); |
| extern u32 mini_isp_register_read_then_write_file(u32 start_reg_addr, |
| u32 end_reg_addr, char *dest_path, char *module_name); |
| extern u32 mini_isp_register_read(u32 reg_addr, u32 *reg_value); |
| extern errcode mini_isp_debug_dump(void); |
| extern errcode mini_isp_memory_read_then_write_file(u32 start_addr, u32 len, |
| char *dest_path, char *file_name); |
| extern u32 mini_isp_woi_memory_read_then_write_file( |
| u32 start_addr, u32 lineoffset, |
| u32 width, u32 height, char *dest_path, char *file_name); |
| extern u32 mini_isp_memory_read_shortlen(u32 start_addr, u32 *read_buffer); |
| extern u32 mini_isp_memory_read(u32 start_addr, u8 *read_buffer, u32 len); |
| extern int mini_isp_get_altek_status(void *devdata, u32 *altek_status); |
| extern int mini_isp_wait_for_event(u32 MINI_ISP_EVENT); |
| extern u32 mini_isp_get_currentevent(void); |
| extern void mini_isp_register_write(u32 reg_addr, u32 reg_new_value); |
| extern void mini_isp_memory_write(u32 memory_addr, u8 *write_buffer, |
| u32 write_len); |
| |
| /*miniisp_utility.c*/ |
| extern int mini_isp_debug_dump_img(void); |
| extern int mini_isp_debug_depth_rect_combo_dump(u8 is_ground_mode); |
| extern errcode mini_isp_debug_packdata_dump(void); |
| extern errcode mini_isp_debug_IQCalib_dump(void); |
| extern errcode mini_isp_debug_metadata_dump(void); |
| extern errcode mini_isp_utility_read_reg_e_mode_for_bypass_use(void); |
| extern errcode mini_isp_utility_read_reg_e_mode(void); |
| |
| |
| extern errcode mini_isp_debug_depth_info(void); |
| extern errcode mini_isp_debug_metadata_info(void); |
| extern errcode mini_isp_debug_sensor_info(bool a_IsLog2File); |
| extern errcode mini_isp_debug_led_info(bool a_IsLog2File); |
| extern int mini_isp_debug_mipi_rx_fps_start(bool a_IsLog2File); |
| extern void mini_isp_debug_mipi_rx_fps_stop(void); |
| extern errcode mini_isp_debug_GPIO_Status(bool a_IsLog2File); |
| extern errcode mini_isp_utility_get_irp_and_depth_information( |
| struct irp_and_depth_information *info); |
| extern u32 mini_isp_check_rx_dummy(u8 **recv_buffer, u32 rx_dummy_len); |
| extern errcode mini_isp_create_directory(char *dir_name); |
| extern u32 mini_isp_get_rx_dummy_byte(u8 spie_rx_mode); |
| extern void mini_isp_set_spie_dummy_byte(u32 dummy_lens); |
| |
| /*miniisp_customer_define.c*/ |
| extern void mini_isp_poweron(void); |
| extern void mini_isp_poweroff(void); |
| extern void mini_isp_eeprom_wpon(void); |
| extern void mini_isp_eeprom_wpoff(void); |
| extern int mini_isp_gpio_init(struct device *spi, |
| struct misp_data *drv_data, |
| struct misp_global_variable *drv_global_variable); |
| /* AL6100 debug tool */ |
| extern int mini_isp_setup_resource(struct device *dev, |
| struct misp_data *drv_data); |
| extern struct device *miniisp_chdev_create(struct class *mini_isp_class); |
| extern struct device *mini_isp_getdev(void); |
| extern struct misp_data *get_mini_isp_intf_spi(void); |
| extern struct misp_data *get_mini_isp_intf_i2c(int i2c_type); |
| #endif |
| |