/*******************************************************************************
*
*
* File:         hal_dsi_tx_ctrl.h
* Description:  hal mipi dsi tx 头文件
* Version:      V0.1
* Date:         2021-04-23
* Author:       wuc
 *******************************************************************************/
#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 "tau_common.h"
#include "hal_gpio.h"
#include "stdint.h"
#include "stdbool.h"

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

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/

/**
* @brief  客制化MIPI TX参数结构体
*/
typedef struct
{
    bool                          used;                      /* handle使用标志位 */
    uint8_t                       lane_num;
    dsi_virtual_channel_e         channel_id;
    dsi_video_mode_type_e         vid_mode;
    dsi_tx_cmd_tx_type_e          cmd_tx_type;               /* 初始化模式传输命令方式，0:HS; 1:LP */
    uint8_t                       pclk_offset;               /* 增加lane byte clk以增大HFP，适配LONG H的TP */
    uint32_t                      dpi_vsa;
    uint32_t                      dpi_vbp;
    uint32_t                      dpi_vfp;
    uint32_t                      dpi_hsa;
    uint32_t                      dpi_hbp;
    uint32_t                      dpi_hfp;
    dsi_base_trans_info_t         base_info;                 /* mipi video 转换基本信息 */
    uint32_t                      tx_line_delay;             /* tx 发送至屏端显示的延迟行数,由屏端决定,用于分辨率切换时确认切换时间点 */
    float                         tx_frame_rate;             /* 默认60Hz输出,不建议配置为其他,仅作为debug使用 */
    bool                          tx_clkawayshs;             /* 默认为false, 配置为true时video mode消隐行期间clk不进入LP */
    uint8_t                       blank_rows;                /* 默认为0, 针对特殊屏使用，大于0时生效表示向下补黑blank_rows行 */
    uint8_t                       blank_columns;             /* 默认为0, 针对特殊屏使用，大于0时生效表示向右补黑blank_columns列 */
    bool                          lp_exit_lpdt;              /* 每一条LP CMD都退出LPDT */
    bool                          tx_cmd_mode_sync;          /* TX command mode 输出同步 */
} hal_dsi_tx_ctrl_handle_t;

/**
* @brief  crop parameters
*/
typedef struct
{
    uint16_t    crop_top;
    uint16_t    crop_bottom;
    uint16_t    crop_left;
    uint16_t    crop_right;
} hal_dsi_tx_crop_t;

/**
* @brief  MIPI TX初始化
* @param  tx_ctrl_handle: MIPI TX实例
* @retval 成功:0 失败:-1
*/
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 成功:0 失败:-1
*/
bool hal_dsi_tx_ctrl_deinit(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);

/**
* @brief  MIPI TX创建实例
* @param  无
* @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 成功:0 失败:-1
*/
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 成功:0 失败:-1
*/
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 成功:0 失败:-1
*/
bool hal_dsi_tx_ctrl_stop(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);

/**
* @brief  进入初始化panel
* @param  无
* @retval 无
*/
void hal_dsi_tx_ctrl_enter_init_panel_mode(void);

/**
* @brief  退出初始化panel
* @param  无
* @retval 无
*/
void hal_dsi_tx_ctrl_exit_init_panel_mode(void);

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

/**
* @brief  设置TX溢出时钟分频系统
* @param  esc_div: TX溢出时钟分频系数
* @retval 无
*/
void hal_dsi_tx_ctrl_set_escape_clock_div(uint8_t esc_div);

/**
* @brief  屏端复位脚操作
* @param  state: Reset脚拉高、拉低
* @retval 无
*/
void hal_dsi_tx_ctrl_panel_reset_pin(gpio_level_e state);

/**
* @brief  设置部分显示的区域
* @param  st_line: 起始行
* @param  st_col: 起始列
* @param  end_line: 结束行
* @param  end_col: 结束列
* @retval 无
*/
void hal_dsi_tx_ctrl_set_partial_disp_area(uint32_t st_line, uint32_t st_col, uint32_t end_line, uint32_t end_col);

/**
* @brief  部分显示功能开关
* @param  pd_en: 开关部分显示功能
* @retval 无
*/
void hal_dsi_tx_ctrl_set_partial_disp(function_state_e pd_en);

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

/**
* @brief  全屏复写开关
* @param  ow_en: 开关全屏复写功能
* @retval 无
*/
void hal_dsi_tx_ctrl_set_overwrite(function_state_e ow_en);

/**
* @brief  设置RGB或BGR
* @param  endianness: 选择RGB或BGR显示
* @retval 无
*/
void hal_dsi_tx_ctrl_set_endianness(dpi_endianness_type_e endianness);

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

/**
* @brief  控制TX VPG的输出
* @param  vpg_en: 使能VPG
* @param  style: VPG的样式
* @retval 无
*/
void hal_dsi_tx_ctrl_set_vpg(function_state_e vpg_en, dsi_tx_vpg_style_e style);

/**
* @brief  在video mode下使能LP CMD
* @param  lp_en:使能LP CMD
* @retval 无
*/
void hal_dsi_tx_ctrl_set_lp_cmd(function_state_e lp_en);

/**
* @brief  裁剪tx输出的图像
* @param  tx_ctrl_handle: dsi tx handle
* @param  crop: 裁剪参数
* @retval 无
*/
void hal_dsi_tx_crop_pic(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle, hal_dsi_tx_crop_t *crop);

#if !defined(ISP_568) && !defined(ISP_368)
    /* ISP_518/ISP_308 接口 */
    /**
    * @brief  设置水平翻转
    * @param  flip_en: 开关水平翻转功能
    * @retval 无
    */
    void hal_dsi_tx_ctrl_set_horizon_flip(function_state_e flip_en);

    /**
    * @brief  设置tx 画质filter
    * @param  tx_ctrl_handle: dsi tx handle
    * @param  filter_h: 水平方向filter
    * @param  filter_v: 垂直方向filter
    * @retval true/false
    */
    bool hal_dsi_tx_ctrl_set_cus_pq_filter(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle, uint32_t filter_h[32][2], uint32_t filter_v[32][2]);

    /**
    * @brief  设置tx边缘参数,只在
    * @param  tx_ctrl_handle: dsi tx handle
    * @param  threshold: 边缘增强强度
    * @param  slope: 边缘增强范围
    * @retval true/false
    */
    bool hal_dsi_tx_ctrl_set_cus_pq_edge(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle, uint8_t threshold, uint16_t slope);
#else
    /* ISP_568/ISP_368 接口 */
    /**
    * @brief  设置tx 画质filter
    * @param  tx_ctrl_handle: dsi tx handle
    * @param  filter: tx filter
    * @retval true/false
    */
    bool hal_dsi_tx_ctrl_set_cus_pq_filter(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle, uint32_t filter[32]);

    /**
    * @brief  TX command mode 同步接口,在收到屏端TE信号后调用，防止撕裂
    * @param  tx_ctrl_handle: dsi tx handle
    * @retval true/false
    */
    bool hal_dsi_tx_ctrl_cmd_mode_rcv_te(hal_dsi_tx_ctrl_handle_t *tx_ctrl_handle);
#endif

#endif //__HAL_DSI_TX_CTRL_H__
