1 /*
2  * Copyright (c) 2019-2020, NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef _FSL_DC_FB_DSI_CMD_H_
9 #define _FSL_DC_FB_DSI_CMD_H_
10 
11 #include "fsl_dc_fb.h"
12 #include "fsl_mipi_dsi_cmd.h"
13 #include "fsl_display.h"
14 
15 /*!
16  * @addtogroup dc_fb_dsi_cmd
17  * @{
18  */
19 
20 /*
21  * Change log:
22  *
23  * - 1.1.1
24  *   - Bug Fixes
25  *     - Fixed MISRA 2012 issues.
26  *
27  * - 1.1.0
28  *   - Improvements
29  *     - Supported using TE pin to handle smart panel tearing effect.
30  *
31  * - 1.0.0
32  *   - Initial version
33  */
34 
35 /*******************************************************************************
36  * Definitions
37  ******************************************************************************/
38 
39 /* Only support one layer. To support multiple layers, the DSI transfer should
40  * be protected. If writing to a layer is in progress, the writing to another layer
41  * should be blocked until previous layer operation finished.
42  */
43 #define DC_FB_DSI_CMD_MAX_LAYER 1U
44 #if (DC_FB_DSI_CMD_MAX_LAYER != 1U)
45 #error Current driver only supports one layer
46 #endif
47 
48 /*! @brief DSI_CMD display configuration. */
49 typedef struct _dc_fb_dsi_cmd_config
50 {
51     display_config_t commonConfig; /*!< Common display configuration. */
52     bool useTEPin;                 /*!< Use TE pin to handle tearing effect or not. */
53 } dc_fb_dsi_cmd_config_t;
54 
55 /*! @brief Data for DSI_CMD display controller layer. */
56 typedef struct _dc_fb_dsi_cmd_layer
57 {
58     bool enabled;              /*!< The layer is enabled. */
59     dc_fb_info_t fbInfo;       /*!< Frame buffer info. */
60     void *frameBuffer;         /*!< Frame buffer sent currently. */
61     dc_fb_callback_t callback; /*!< Callback for buffer switch off. */
62     void *cbParam;             /*!< Callback parameter. */
63     void *volatile fbWaitTE;   /*!< New frame buffer wait to send at next TE. */
64 } dc_fb_dsi_cmd_layer_t;
65 
66 /*! @brief Data for DSI_CMD display controller driver handle. */
67 typedef struct _dc_fb_dsi_cmd_handle
68 {
69     mipi_dsi_device_t *dsiDevice;                          /*!< The MIPI DSI device that controls the panel. */
70     display_handle_t *panelHandle;                         /*!< Handle of the panel. */
71     uint8_t initTimes;                                     /*!< How many times the DC is initialized. */
72     uint8_t enabledLayerCount;                             /*!< How many times layers are enabled. */
73     dc_fb_dsi_cmd_layer_t layers[DC_FB_DSI_CMD_MAX_LAYER]; /*!< Information of the layer. */
74     bool useTEPin;                                         /*!< Use TE pin to handle tearing effect or not. */
75 } dc_fb_dsi_cmd_handle_t;
76 
77 extern const dc_fb_ops_t g_dcFbOpsDsiCmd;
78 
79 /*******************************************************************************
80  * API
81  ******************************************************************************/
82 
83 #if defined(__cplusplus)
84 extern "C" {
85 #endif
86 
87 status_t DC_FB_DSI_CMD_Init(const dc_fb_t *dc);
88 status_t DC_FB_DSI_CMD_Deinit(const dc_fb_t *dc);
89 status_t DC_FB_DSI_CMD_EnableLayer(const dc_fb_t *dc, uint8_t layer);
90 status_t DC_FB_DSI_CMD_DisableLayer(const dc_fb_t *dc, uint8_t layer);
91 status_t DC_FB_DSI_CMD_SetLayerConfig(const dc_fb_t *dc, uint8_t layer, dc_fb_info_t *fbInfo);
92 status_t DC_FB_DSI_CMD_GetLayerDefaultConfig(const dc_fb_t *dc, uint8_t layer, dc_fb_info_t *fbInfo);
93 status_t DC_FB_DSI_CMD_SetFrameBuffer(const dc_fb_t *dc, uint8_t layer, void *frameBuffer);
94 uint32_t DC_FB_DSI_CMD_GetProperty(const dc_fb_t *dc);
95 void DC_FB_DSI_CMD_SetCallback(const dc_fb_t *dc, uint8_t layer, dc_fb_callback_t callback, void *param);
96 
97 /* This function should be called in panel TE pin ISR. */
98 void DC_FB_DSI_CMD_TE_IRQHandler(const dc_fb_t *dc);
99 
100 #if defined(__cplusplus)
101 }
102 #endif
103 
104 /*! @} */
105 
106 #endif /* _FSL_DC_FB_DSI_CMD_H_ */
107