/**
  ******************************************************************************
  * @file    clcd_hal.h
  * @author  Product application department
  * @version V1.0
  * @date    2020.07.13
  * @brief   Header file of CLCD HAL module.
  * 
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CLCD_HAL_H
#define __CLCD_HAL_H

#ifdef __cplusplus
extern "C"
{
#endif

/* Includes ------------------------------------------------------------------*/
#include "clcd_drv.h"
#include "hal_def.h"

  /**@defgroup HAL HAL driver
  *
  *@{
  */

  /** @defgroup HAL_CLCD CLCD
  *
  *@{
  */

  /*** 宏定义 *******************************************************************/
  /** @defgroup CLCD_Exported_Macros Exported Macros
  *
  * @{
  */

  /**
  *@brief  回调函数类型定义
  *
  */
  typedef void (*clcd_callback_t)(void *);

  /**
  * @}
  */

  /*** 结构体、枚举变量定义 *****************************************************/
  /** @defgroup CLCD_Exported_Types Exported Types
  *
  * @{
  */

  /**
* @brief CLCD 初始化时序结构体定义
*
*/
  typedef struct
  {
    volatile uint16_t flags;  /**< 使能标志位       */
    volatile uint16_t width;  /**< 每行像素点       */
    volatile uint16_t height; /**< 垂直像素点       */
    volatile uint16_t hbp;    /**< 水平前沿周期     */
    volatile uint16_t hfp;    /**< 水平后沿周期     */
    volatile uint16_t hsync;  /**< 水平同步脉冲宽度 */
    volatile uint8_t vbp;     /**< 垂直前沿周期     */
    volatile uint8_t vfp;     /**< 垂直后沿周期     */
    volatile uint8_t vsync;   /**< 垂直同步脉冲宽度 */

  } CLCDTiming_InitTypeDef;

  /**
* @brief CLCD 初始化配置结构体定义
*
*/
  typedef struct
  {
    volatile uint32_t control;  //.
    volatile uint32_t fb0_addr; /**< frame0 memory address */
    volatile uint32_t fb1_addr; /**< frame1 memory address, only used when double buffer is enabled. */
    volatile float fps;         /**< lcd panel actual frame rate.*/

  } CLCDCfg_InitTypeDef;

  /**
* @brief CLCD 初始化结构体定义
*
*/
  typedef struct
  {
    CLCDTiming_InitTypeDef clcd_timeing; /**< 时序      */
    FunctionalStateTypeDef enableIE;     /**< 中断使能  */
    uint32_t clcd_clkdiv;                /**< CLCD时钟分频  */
    CLCDCfg_InitTypeDef clcd_cfg;        /**< 配置          */

  } CLCD_InitTypeDef;

  /**
* @brief CLCD  句柄结构体定义
*
*/
  typedef struct
  {
    CLCD_TypeDef *instance; /**< CLCD实例寄存器 */
    CLCD_InitTypeDef init;  /**< CLCD初始化结构体 */

    clcd_callback_t callback; /**< 回调函数*/
  } CLCD_HandleTypeDef;

  /**
  * @}
  */

  /*** 全局变量声明 **************************************************************/
  /** @defgroup CLCD_Exported_Variables Exported Variables
  *
  * @{
  */

  /**
  * @}
  */

  /*** 函数声明 ******************************************************************/
  /** @defgroup CLCD_Exported_Functions Exported Functions
  * @{
  */

  extern HAL_StatusTypeDef HAL_CLCD_DeInit(CLCD_HandleTypeDef *hclcd);

  extern HAL_StatusTypeDef HAL_CLCD_Init(CLCD_HandleTypeDef *hclcd);

  extern void HLA_CLCD_Cmd(CLCD_HandleTypeDef *hclcd, FunctionalStateTypeDef NewState);
  
  extern void HLA_CLCD_UpuerPannelBaseAddr(CLCD_HandleTypeDef *hclcd, uint32_t addr);
	extern void HAL_CLCD_CheckState(void);

  /**
  * @}
  */

  /**
  *@}
  */

  /**
  *@}
  */

#ifdef __cplusplus
}
#endif

#endif /* __CLCD_HAL_H */

