/*
* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup MIPI DSI
* @{
*
* @brief Defines standard MIPI DSI APIs for display driver development.
*
* This MIPI DSI module abstracts MIPI DSI capabilities of different system platforms to provide stable APIs
* for display driver development. You can use this module to obtain/release the MIPI DSI device handle,
* initialize the MIPI DSI device, and send/receive commands that interact with display peripherals.
*
* @since 1.0
*/
/**
* @file mipi_dsi_if.h
*
* @brief Declares standard MIPI DSI APIs for display driver development.
*
*
*
* @since 1.0
*/
#ifndef MIPI_DSI_IF_H
#define MIPI_DSI_IF_H
#include "platform_if.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
/**
* @brief Enumerates the supported DSI operation modes.
*
* You can specify the operation mode via {@link MipiDsiSetCfg}.
*
* @since 1.0
*/
enum DsiMode {
/** Invalid mode */
DSI_NONE = 0,
/** Video mode */
DSI_VIDEO_MODE,
/** Command mode */
DSI_CMD_MODE,
};
/**
* @brief Enumerates the number of data lanes connected to the DSI device.
*
* You can specify the number of data lanes via {@link MipiDsiSetCfg}.
*
* @since 1.0
*/
enum DsiLane {
/** One data lane is connected to the display device. */
DSI_1_LANES = 1,
/** Two data lanes are connected to the display device. */
DSI_2_LANES,
/** Three data lanes are connected to the display device */
DSI_3_LANES,
/** Four data lanes are connected to the display device. */
DSI_4_LANES,
};
/**
* @brief Enumerates the synchronization modes used for data transmission in Video mode.
* This enumeration is invalid in Command mode.
*
* You can specify the synchronization mode via {@link MipiDsiSetCfg}.
*
* @since 1.0
*/
enum DsiBurstMode {
/** Pixel data is transferred efficiently using a time-compressed burst format,
leaving more time during a scan line for low power (LP) mode and reducing the DSI power consumption. */
VIDEO_BURST_MODE = 0x0,
/** Peripherals can accurately reproduce original video timing, including synchronization pulse widths. */
VIDEO_NON_BURST_MODE_SYNC_PULSES = 0x1,
/** Peripherals can accurately reproduce original video timing,
but accurate synchronization pulse widths are not required. */
VIDEO_NON_BURST_MODE_SYNC_EVENTS = 0x2,
};
/**
* @brief Enumerates the output DSI image data formats.
*
* You can specify the image data format via {@link MipiDsiSetCfg}.
*
* @since 1.0
*/
enum DsiOutFormat {
/** 16-bit RGB */
FORMAT_RGB_16_BIT = 0x0,
/** 18-bit RGB */
FORMAT_RGB_18_BIT = 0x1,
/** 24-bit RGB */
FORMAT_RGB_24_BIT = 0x2,
/** 8-bit YUV420 */
FORMAT_YUV420_8_BIT_NORMAL = 0x3,
/** Legacy-version 8-bit YUV420 */
FORMAT_YUV420_8_BIT_LEGACY = 0x4,
/** 8-bit YUV422 */
FORMAT_YUV422_8_BIT = 0x5,
/** Invalid value */
FORMAT_BUTT
};
/**
* @brief Defines the MIPI DSI timing information.
*
* Before image data transmission, you must specify the timing parameters
* to ensure that images can be correctly displayed on the screen.
*
* @since 1.0
*/
struct DsiTimingInfo {
/** Effective pixels in the X direction, that is, resolution of the peer screen in the X direction */
uint16_t xPixels;
/** Horizontal sync active (HSA) pixels in the X direction, which is specified based on the peer screen */
uint16_t hsaPixels;
/** Horizontal back porch (HBP) pixels in the X direction, which is specified based on the peer screen */
uint16_t hbpPixels;
/** Total number of pixels in the X direction. The value is equal to
the sum value of xResPixels, hsaPixels, hbpPixels, and hfpPixels. */
uint16_t hlinePixels;
/** Vertical sync active (VSA) lines in the Y direction, which is specified based on the peer screen */
uint16_t vsaLines;
/** Vertical back porch (VBP) lines in the Y direction, which is specified based on the peer screen */
uint16_t vbpLines;
/** Vertical front porch (VFP) lines in the Y direction, which is specified based on the peer screen */
uint16_t vfpLines;
/** Effective lines in the Y direction, that is, resolution of the peer screen in the Y direction */
uint16_t ylines;
/** Number of bytes of the command for writing memory.
This parameter is invalid in Video mode and is set to xPixels in Command mode. */
uint16_t edpiCmdSize;
};
/**
* @brief Defines MIPI DSI configuration parameters.
*
* Before image data transmission, you must set MIPI DSI configuration parameters to ensure
* that images can be correctly displayed on the screen.
*
* @since 1.0
*/
struct MipiCfg {
/** Number of MIPI DSI lanes connected to the display device */
enum DsiLane lane;
/** Refresh mode (Video mode or Command mode) supported by the display device */
enum DsiMode mode;
/** Synchronous mode of the display device, which is valid only in Video mode */
enum DsiBurstMode burstMode;
/** Format of the output DSI image data. For details, see {@link DsiOutFormat}. */
enum DsiOutFormat format;
/** MIPI DSI timing information, which is set based on the display device requirements */
struct DsiTimingInfo timing;
/** MIPI DSI clock (unit: Mbit/s) */
uint32_t phyDataRate;
/** Pixel clock output by the MIPI DSI (unit: kHz) */
uint32_t pixelClk;
};
/**
* @brief Defines a MIPI DSI command.
*
*
*
* @since 1.0
*/
struct DsiCmdDesc {
/** MIPI data type. For details about available values, see the MIPI protocol. */
uint16_t dataType;
/** Delay required after the command is sent, in ms */
uint16_t delay;
/** Length of the transferred data */
uint16_t dataLen;
/** Pointer to the data to be transferred */
uint8_t *payload;
};
/**
* @brief Obtains the MIPI DSI device handle with a specified channel ID.
*
* @param id Indicates the MIPI DSI channel ID.
*
* @return Returns the MIPI DSI device handle if the operation is successful; returns NULL otherwise.
*
* @since 1.0
*/
DevHandle MipiDsiOpen(uint8_t id);
/**
* @brief Releases the MIPI DSI device handle.
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
*
* @since 1.0
*/
void MipiDsiClose(DevHandle handle);
/**
* @brief Sets configuration parameters for a MIPI DSI device.
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
* @param cfg Indicates the pointer to the configuration parameters.
*
* @return Returns 0 if the operation is successful; returns a negative value otherwise.
*
* @since 1.0
*/
int32_t MipiDsiSetCfg(DevHandle handle, struct MipiCfg *cfg);
/**
* @brief Obtains the configuration parameters of a MIPI DSI device.
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
* @param cfg Indicates the pointer to the configuration parameters.
*
* @return Returns 0 if the operation is successful; returns a negative value otherwise.
*
* @since 1.0
*/
int32_t MipiDsiGetCfg(DevHandle handle, struct MipiCfg *cfg);
/**
* @brief Sets LP mode for a MIPI DSI device.
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
*
* @since 1.0
*/
void MipiDsiSetLpMode(DevHandle handle);
/**
* @brief Sets the high-speed (HS) mode for a MIPI DSI device.
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
*
* @since 1.0
*/
void MipiDsiSetHsMode(DevHandle handle);
/**
* @brief Sends a display command set (DCS) command used for sending the initial parameters of a peripheral.
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
* @param cmd Indicates the pointer to the command to be sent.
*
* @return Returns 0 if the operation is successful; returns a negative value otherwise.
*
* @since 1.0
*/
int32_t MipiDsiTx(DevHandle handle, struct DsiCmdDesc *cmd);
/**
* @brief Receives a DCS command used for reading data, such as the status and parameters of a peripheral
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
* @param cmd Indicates the pointer to the command to be received.
* @param readLen Indicates the length of the data to read, in bytes.
* @param out Indicates the pointer to the read data.
*
* @return Returns 0 if the operation is successful; returns a negative value otherwise.
*
* @since 1.0
*/
int32_t MipiDsiRx(DevHandle handle, struct DsiCmdDesc *cmd, int32_t readLen, uint8_t *out);
/**
* @brief attach a DSI device to its DSI host
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
* @param name Indicates the name of a peripheral.
*
* @return Returns 0 if the operation is successful; returns a negative value otherwise.
*
* @since 1.0
*/
int32_t MipiDsiAttach(DevHandle handle, uint8_t *name);
/**
* @brief Sets additional parameters for a MIPI DSI device.
*
* @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}.
* @param panelData Indicates the pointer to the additional parameters.
*
* @return Returns 0 if the operation is successful; returns a negative value otherwise.
*
* @since 1.0
*/
int32_t MipiDsiSetDrvData(DevHandle handle, void *panelData);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* MIPI_DSI_IF_H */