feat(mipi_dsi): update low level functions to include underrun interrupt

This commit is contained in:
morris
2024-07-01 17:11:33 +08:00
parent e91c5e33ca
commit 28a3227b2f
5 changed files with 78 additions and 23 deletions

View File

@@ -14,6 +14,7 @@
#include "hal/lcd_types.h"
#define MIPI_DSI_LL_GET_BRG(bus_id) (bus_id == 0 ? &MIPI_DSI_BRIDGE : NULL)
#define MIPI_DSI_LL_EVENT_UNDERRUN (1 << 0)
#ifdef __cplusplus
extern "C" {
@@ -35,6 +36,46 @@ static inline void mipi_dsi_brg_ll_enable(dsi_brg_dev_t *dev, bool en)
dev->en.dsi_en = en;
}
/**
* @brief Enable DSI bridge interrupt for specific event mask
*
* @param dev Pointer to the DSI bridge controller register base address
* @param mask Event mask
* @param enable True to enable, False to disable
*/
static inline void mipi_dsi_brg_ll_enable_interrupt(dsi_brg_dev_t *dev, uint32_t mask, bool enable)
{
if (enable) {
dev->int_ena.val |= mask;
} else {
dev->int_ena.val &= ~mask;
}
}
/**
* @brief Clear DSI bridge interrupt for specific event mask
*
* @param dev Pointer to the DSI bridge controller register base address
* @param mask Event mask
*/
__attribute__((always_inline))
static inline void mipi_dsi_brg_ll_clear_interrupt_status(dsi_brg_dev_t *dev, uint32_t mask)
{
dev->int_clr.val = mask;
}
/**
* @brief Get interrupt status for DSI bridge
*
* @param dev Pointer to the DSI bridge controller register base address
* @return Interrupt status
*/
__attribute__((always_inline))
static inline uint32_t mipi_dsi_brg_ll_get_interrupt_status(dsi_brg_dev_t *dev)
{
return dev->int_st.val;
}
/**
* @brief Set the number of 64-bit words in one dma burst transfer
*
@@ -242,7 +283,7 @@ static inline void mipi_dsi_brg_ll_enable_ref_clock(dsi_brg_dev_t *dev, bool en)
* @param dev Pointer to the DSI bridge controller register base address
* @param controller Flow controller
*/
static inline void mipi_dsi_brg_ll_set_flow_controller(dsi_brg_dev_t* dev, mipi_dsi_ll_flow_controller_t controller)
static inline void mipi_dsi_brg_ll_set_flow_controller(dsi_brg_dev_t *dev, mipi_dsi_ll_flow_controller_t controller)
{
dev->dma_flow_ctrl.dsi_dma_flow_controller = controller;
}
@@ -255,9 +296,21 @@ static inline void mipi_dsi_brg_ll_set_flow_controller(dsi_brg_dev_t* dev, mipi_
* @param dev Pointer to the DSI bridge controller register base address
* @param number Number of blocks
*/
static inline void mipi_dsi_brg_ll_set_multi_block_number(dsi_brg_dev_t* dev, uint32_t number)
static inline void mipi_dsi_brg_ll_set_multi_block_number(dsi_brg_dev_t *dev, uint32_t number)
{
dev->dma_flow_ctrl.dma_flow_multiblk_num = number;
dev->dma_frame_interval.dma_multiblk_en = number > 1;
}
/**
* @brief Get the FIFO depth of the DSI bridge
*
* @param dev Pointer to the DSI bridge controller register base address
* @return FIFO depth
*/
static inline uint32_t mipi_dsi_brg_ll_get_fifo_depth(dsi_brg_dev_t *dev)
{
return dev->fifo_flow_status.raw_buf_depth;
}
/**
@@ -266,7 +319,7 @@ static inline void mipi_dsi_brg_ll_set_multi_block_number(dsi_brg_dev_t* dev, ui
* @param dev Pointer to the DSI bridge controller register base address
* @param std YUV-RGB conversion standard
*/
static inline void mipi_dsi_brg_ll_set_yuv_convert_std(dsi_brg_dev_t* dev, lcd_yuv_conv_std_t std)
static inline void mipi_dsi_brg_ll_set_yuv_convert_std(dsi_brg_dev_t *dev, lcd_yuv_conv_std_t std)
{
switch (std) {
case LCD_YUV_CONV_STD_BT601: