/*******************************************************************************
*
*
* File:         hal_dsi_tx_ctrl.h
* Description:  hal mipi dsi tx 头文件
* Version:      V0.1
* Date:         2021-04-23
* Author:       jaya
 *******************************************************************************/
#ifndef __HAL_DSI_TX_CTRL_H__
#define __HAL_DSI_TX_CTRL_H__

/*******************************************************************************
* 1.Included files
*******************************************************************************/
#include "tau_dsi_datatype.h"
#include "tau_device_datatype.h"
#include "hal_gpio.h"

/*******************************************************************************
* 2.Global constant and macro definitions using #define
*******************************************************************************/

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/
/**
* @brief  blank display configure type
*/
typedef struct
{
    uint16_t     st_col;           /* 补黑区域起始坐标，RGBG格式以子像素计数*/
    uint16_t     width;            /* 补黑区域宽度，RGBG格式以子像素计数*/
    uint8_t      remap_en;         /* 补黑区域是否参与子像素重排*/
    uint8_t      blank_en;         /* 补黑区域开关*/
} blank_disp_t;

/**
* @brief  pentile remap rule configuration type in rom code
*/
typedef uint8_t (remap_rule_t)[24];

/**
* @brief  客制化MIPI TX参数结构体
*/
typedef struct
{
    bool             pentile_enable;                    /* 是否pentile输出*/
    bool             pentile_reverse_en;                /* 是否打开芯片本身行翻转功能*/
    bool             pentile_24b;                       /* 是否以RGB IC搭配RGBG玻璃*/
    uint32_t         rgb_hact;                          /* RGB IC搭配RGBG玻璃使用时IC水平方向分辨率*/
    remap_rule_t     *remapl_rule;                      /* RGB IC搭配RGBG玻璃使用时remap规则1*/
    remap_rule_t     *remapr_rule;                      /* RGB IC搭配RGBG玻璃使用时remap规则2*/
    blank_disp_t     blank_info0;                       /* 补黑参数配置信息*/
    blank_disp_t     blank_info1;                       /* 补黑参数配置信息*/
} dsi_tx_pent_info_t;

/**
* @brief  MIPI TX clk/data lane是否自动进LP控制枚举类型
*         不同driver IC spec不同,对Lane rate范围要求也不同
*         无法点亮时可尝试替换不同的模式
*/
typedef enum
{
    ALWAYS_HS = 0,                     // vid输出默认此模式，仅VSA自动进LP; cmd输出暂不支持此模式
    ONLY_DATA_LANE_AUTO_LP = 1,        // cmd输出默认此模式，data lane行间自动进LP， clk保持HS
    CLK_DATA_LANE_AUTO_LP = 2,         // data/clk lane行间自动进LP
} dsi_tx_lane_lp_e;

/**
* @brief tx pq filter index
* 默认使用OPT
*/
typedef enum
{
    TX_FLT_OPT    = 0,
    TX_FLT_LINEAR = 1,
    TX_FLT_MAX
} hal_dsi_tx_pq_filter_e;

/**
* @brief  客制化MIPI TX参数结构体
*/
typedef struct
{
    dsi_base_trans_info_t     base_info;                 /* mipi video 转换基本信息 */
    uint32_t                  dpi_vsa;                   /* DPI VSA*/
    uint32_t                  dpi_vbp;                   /* DPI VBP*/
    uint32_t                  dpi_vfp;                   /* DPI VFP*/
    uint32_t                  dpi_hsa;                   /* DPI HSA*/
    uint32_t                  dpi_hbp;                   /* DPI HBP*/
    uint32_t                  dpi_hfp;                   /* DPI HFP*/
    float                     tx_frame_rate;             /* 默认60Hz输出,不建议配置为其他,仅作为debug使用 */
    uint8_t                   lane_num;                  /* TX 使用的 lane 数量*/
    bool                      used;                      /* handle使用标志位 内部自动更新状态，不需要操作*/
    bool                      lp_exit_lpdt;              /* 每一条LP CMD都退出LPDT */
    dsi_tx_lane_lp_e          tx_lane_lp;                /* clk/data lane是否自动进LP模式配置 */
    dsi_virtual_channel_e     channel_id;                /* 虚拟通道ID，默认为0*/
    dsi_video_mode_type_e     vid_mode;                  /* video输出时选择输出的vid模式种类 */
    dsi_tx_cmd_tx_type_e      cmd_tx_type;               /* 初始化模式传输命令方式，0:HS; 1:LP */
    dsi_tx_pent_info_t        pentile_info;              /* pentile屏基本信息 */
    hal_dsi_tx_pq_filter_e    tx_pq_index;               /* 画质调整滤波器,默认为OPT最优效果 */
} hal_dsi_tx_ctrl_handle_t;

/**
* @brief TE 信号产生模式
*/
typedef enum
{
    TE_60HZ_MODE   = 0,
    TE_USER_MODE   = 1, /* 底层不产生TE, 由hal_dsi_tx_ctrl_gen_a_tear_signal 接口产生 */
    TE_STOP_MODE   = 1,
    TE_90HZ_MODE   = 2,
    TE_120HZ_MODE  = 3,
    TE_144HZ_MODE  = 4,
    TE_160HZ_MODE  = 5,
    TE_MODE_MAX
} te_mode_e;

/**
* @brief  dpi tx vpg style
*/
typedef enum
{
    TX_VPG_V_COLOR     = 0,
    TX_VPG_H_COLOR     = 1,
    TX_VPG_V_BER       = 2,
    TX_VPG_FLICKER     = 3,
    TX_VPG_MAX
} dsi_tx_vpg_style_e;

/**
* @brief  MIPI TX初始化
* @param  tx_ctrl_handle: MIPI TX实例
* @retval true/false
*/
bool hal_dsi_tx_ctrl_init(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);

/**
* @brief  MIPI TX反初始化
* @param  tx_ctrl_handle: MIPI TX实例
* @retval true/false
*/
bool hal_dsi_tx_ctrl_deinit(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);

/**
* @brief  MIPI TX创建实例
* @param  None
* @retval tx_ctrl_handle: MIPI TX实例
*/
hal_dsi_tx_ctrl_handle_t *hal_dsi_tx_ctrl_create_handle(void);

/**
* @brief  MIPI TX释放实例
* @param  tx_ctrl_handle: MIPI TX实例
* @retval true/false
*/
bool hal_dsi_tx_ctrl_release_handle(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);

/**
* @brief  MIPI TX开始运行
* @param  tx_ctrl_handle: MIPI TX实例
* @retval true/false
*/
bool hal_dsi_tx_ctrl_start(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);

/**
* @brief  MIPI TX停止运行
* @param  tx_ctrl_handle: MIPI TX实例
* @retval true/false
*/
bool hal_dsi_tx_ctrl_stop(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);

/**
* @brief  MIPI TX接收命令
* @param  data_type: 数据类型，参考枚举类型dsi_data_type_e
* @param  vc: 虚拟通道编号，参考枚举类型dsi_virtual_channel_e
* @param  cmd: DCS指令
* @param  size: 读取数据长度
* @param  data: 数据存放地址
* @retval None
*/
void hal_dsi_tx_ctrl_read_cmd(uint8_t data_type, uint8_t vc, uint8_t cmd, uint8_t size, uint8_t *data);

/**
* @brief  video高速数据传输时V porch阶段进行bta回读接口
* @param  data_type: 数据类型，参考枚举类型dsi_data_type_e
* @param  cmd: DCS指令
* @param  size: 读取数据长度
* @param  data: 数据存放地址
* @retval true-BTA回复获取有效，false-BTA回复未获得
* @attention 需要考虑V porch时长是否足够size长度的寄存器回读，否则造成TX数据通路出错
*/
bool hal_dsi_tx_ctrl_vporch_bta_opera(uint8_t data_type, uint8_t cmd, uint8_t size, uint8_t *data);

/**
* @brief  MIPI TX发送命令
* @param  data_type: 数据类型，参考枚举类型dsi_data_type_e
* @param  vc: 虚拟通道编号，参考枚举类型dsi_virtual_channel_e
* @param  cmd_count: 可变参数个数
* @param  ...: 可变参数
* @retval true-command发送正常；false-TX当前状态不能发送command
*/
bool hal_dsi_tx_ctrl_write_cmd(uint8_t data_type, uint8_t vc, uint8_t cmd_count, ...);

/**
* @brief  MIPI TX发送命令
* @param  data_type: 数据类型，参考枚举类型dsi_data_type_e
* @param  vc: 虚拟通道编号，参考枚举类型dsi_virtual_channel_e
* @param  size: data个数
* @param  data: data数组
* @retval true-command发送正常；false-TX当前状态不能发送command
*/
bool hal_dsi_tx_ctrl_write_array_cmd(uint8_t data_type, uint8_t vc, uint8_t size, const uint8_t *data);

/**
* @brief  切换至 LP cmd发送模式
* @param  enable: true-进行cmd发送；false-结束LP cmd发送
* @retval None
* @attention 应用场景：AP enter sleep后传输发送LP cmd
*/
void hal_dsi_tx_ctrl_cmd_mode(bool enable);

/**
* @brief  设置TX escape mode时钟
* @param  esc_clk: escape clk 单位Hz,10000000时CMD为10Mhz
* @retval None
*/
void hal_dsi_tx_ctrl_set_escape_clock_div(uint32_t esc_clk);

/**
* @brief  设置RGB或BGR
* @param  endianness: 选择RGB或BGR显示，参考dsi_endianness_e
* @attention 接口需要在初始化接口hal_dsi_tx_ctrl_init调用前才能生效
* @retval None
*/
void hal_dsi_tx_ctrl_set_endianness(dsi_endianness_e endianness);

/**
* @brief  设置CCM参数
* @param  coef: 客制化参数，参考结构体ccm_coef_t
* @retval None
*/
void hal_dsi_tx_ctrl_set_ccm(ccm_coef_t *ccm);

/**
* @brief  设置边缘检测算法参数
* @param  edge_dect_para: 边缘检测算法参数，参考 dsi_tx_edge_dect_t;关闭模块时可以传参NULL
* @param  edge_dect_en: 是否开启边缘检测模块
* @retval None
*/
void hal_dsi_tx_ctrl_set_edge_dect(dsi_tx_edge_dect_t *edge_dect_para, bool edge_dect_en);

/**
* @brief  设置边缘增强效果算法参数
* @param  edge_enh_para: 边缘增强算法参数，参考 dsi_tx_edge_enh_t;关闭模块时可以传参NULL
* @param  edge_enh_en: 是否开启边缘增强模块
* @retval None
*/
void hal_dsi_tx_ctrl_set_edge_enhance(dsi_tx_edge_enh_t *edge_enh_para, bool edge_enh_en);

/**
* @brief  设置False Color remove算法参数
* @param  fc_para: false color参数，参考 dsi_tx_fc_t;关闭模块时可以传参NULL
* @param  fc_en: 是否开启false color配置模块
* @retval None
*/
void hal_dsi_tx_ctrl_set_fc(dsi_tx_fc_t *fc_para, bool fc_en);

/**
* @brief  设置bcs参数
* @param  bcs_para: 明亮度/对比度/饱和度，参考 dsi_tx_bcs_t;关闭模块时可以传参NULL
* @param  bcs_en: 是否开启bcs配置模块
* @retval None
*/
void hal_dsi_tx_ctrl_set_bcs(dsi_tx_bcs_t *bcs_para, bool bcs_en);

/**
* @brief  设置复写颜色
* @param  R: RGB的R分量
* @param  G: RGB的G分量
* @param  B: RGB的B分量
* @retval None
*/
void hal_dsi_tx_ctrl_set_overwrite_rgb(uint8_t R, uint8_t G, uint8_t B);

/**
* @brief  打开overwrite功能
* @param  enable: true-打开overwrite； false-关闭overwrite
* @retval None
*/
void hal_dsi_tx_ctrl_overwrite_enable(bool enable);

/**
* @brief  设置部分显示
* @param  enable: true-打开partial显示； false-关闭partial显示
* @param  par_disp_cfg display区域和背景色设置，参考 dsi_tx_par_dis_t; 关闭模块功能时可以传参NULL
* @retval None
*/
void hal_dsi_tx_ctrl_partial_disp_enable(bool enable, dsi_tx_par_dis_t *par_disp_cfg);

/**
* @brief  控制TX VPG的输出
* @param  vpg_en: 使能VPG
* @param  style: VPG的样式
* @param  vpg_hline_adj: false-正常情况使用，true-VPG显示滚动情况下使用
* @attention vpg_hline_adj此参数只能解决带宽余量相差不大的情况，如果带宽需求超出过多，依然无法解决带宽不足引起的VPG显示滚动问题
* @retval None
*/
void hal_dsi_tx_ctrl_set_vpg(bool vpg_en, dsi_tx_vpg_style_e style, bool vpg_hline_adj);

/**
* @brief  配置TE模式
* @param  tx_ctrl_handle: dsi tx handle
* @param  te: te mode
* @retval None
*/
void hal_dsi_tx_ctrl_set_tear_mode(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle, te_mode_e te);

/**
* @brief  生成一个TE信号
* @param  None
* @retval None
*/
void hal_dsi_tx_ctrl_gen_a_tear_signal(void);

/**
* @brief  command mode输出模式下产生一帧数据
* @param  None
* @retval None
*/
bool hal_dsi_tx_ctrl_gen_a_frame(void);

/**
* @brief  配置输入输出同步行数,用于调整图像撕裂问题
* @param  tx_ctrl_handle: dsi tx handle
* @param  line_num:  同步行号,范围1 ~ output height
* @retval true/false
*/
bool hal_dsi_tx_ctrl_set_cus_sync_line(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle, uint32_t line_num);

/**
* @brief  获取TX当前显示行号
* @param  tx_ctrl_handle: dsi tx handle
* @retval 当前显示行号,包括vsa + vbp + vactive + vfp
*/
uint32_t hal_dsi_tx_ctrl_get_disp_line(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);

#endif //__HAL_DSI_TX_CTRL_H__
