MXC-A36_2024.04.18/fr3092_mcu/components/drivers/peripheral/Inc/driver_yuv2rgb.h

272 lines
10 KiB
C

/*
******************************************************************************
* @file driver_yuv2rgb.h
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2022
* @brief Header file of YUV2RGB HAL module.
******************************************************************************
* @attention
*
* Copyright (c) 2022 FreqChip.
* All rights reserved.
******************************************************************************
*/
#ifndef __DRIVER_YUV2RGB_H__
#define __DRIVER_YUV2RGB_H__
#include "fr30xx.h"
/** @addtogroup YUV2RGB_Registers_Section
* @{
*/
/* ################################ Register Section Start ################################ */
/* YUV2RGB Config Register */
typedef struct
{
uint32_t YUV_MODE : 1;
uint32_t YUV_FORMAT : 1;
uint32_t RGB_FORMAT : 2;
uint32_t rsv_0 : 28;
}REG_YUV2RGB_CFG_t;
/* YUV FIFO control */
typedef struct
{
uint32_t YUV_FIFO_ALMOST_EMPTY_LEVEL : 5;
uint32_t rsv_0 : 3;
uint32_t YUV_FIFO_ALMOST_FULL_LEVEL : 5;
uint32_t rsv_1 : 19;
}REG_YUV_FIFO_CTRL_t;
/* RGB FIFO control */
typedef struct
{
uint32_t RGB_FIFO_ALMOST_EMPTY_LEVEL : 5;
uint32_t rsv_0 : 3;
uint32_t RGB_FIFO_ALMOST_FULL_LEVEL : 5;
uint32_t rsv_1 : 19;
}REG_RGB_FIFO_CTRL_t;
/* FIFO status control */
typedef struct
{
uint32_t rsv_0 : 8;
uint32_t YUV_FIFO_COUNT : 6;
uint32_t rsv_1 : 2;
uint32_t RGB_FIFO_COUNT : 6;
uint32_t rsv_2 : 10;
}REG_FIFO_STATUS_t;
/* DMA control */
typedef struct
{
uint32_t DMA_EN : 1;
uint32_t rsv_0 : 7;
uint32_t YUV_DMA_LEVEL : 5;
uint32_t rsv_1 : 3;
uint32_t RGB_DMA_LEVEL : 5;
uint32_t rsv_2 : 11;
}REG_DMA_CTRL_t;
/* DMA control */
typedef struct
{
uint32_t YUV_FLOW_LEVEL : 6;
uint32_t rsv_0 : 2;
uint32_t RGB_FLOW_LEVEL : 6;
uint32_t rsv_1 : 18;
}REG_FLOW_CTRL_t;
/* Result auto Incremen threshold control */
typedef struct
{
uint32_t RGB565_B_THR : 3;
uint32_t RGB565_G_THR : 2;
uint32_t RGB565_R_THR : 3;
uint32_t rsv_0 : 8;
uint32_t RGB322_B_THR : 6;
uint32_t RGB322_G_THR : 5;
uint32_t RGB322_R_THR : 5;
}REG_OPTIMIZE_CTRL_t;
/* ------------------------------------------------*/
/* YUV2RGB Register */
/* ------------------------------------------------*/
typedef struct
{
volatile uint32_t YUV2RGB_CTL; /* Offset 0x00 */
volatile REG_YUV2RGB_CFG_t YUV2RGB_CFG; /* Offset 0x04 */
volatile uint32_t YUV_DATA; /* Offset 0x08 */
volatile uint32_t RGB_DATA; /* Offset 0x0C */
volatile REG_YUV_FIFO_CTRL_t YUV_FIFO_CTRL; /* Offset 0x10 */
volatile REG_RGB_FIFO_CTRL_t RGB_FIFO_CTRL; /* Offset 0x14 */
volatile REG_FIFO_STATUS_t FIFO_STATUS; /* Offset 0x18 */
volatile uint32_t INT_CTRL; /* Offset 0x1C */
volatile uint32_t INT_STATUS; /* Offset 0x20 */
volatile uint32_t INT_RAW; /* Offset 0x24 */
volatile REG_DMA_CTRL_t DMA_CTRL; /* Offset 0x28 */
volatile REG_FLOW_CTRL_t FLOW_CTRL; /* Offset 0x2C */
volatile REG_OPTIMIZE_CTRL_t OPTIMIZE_CTRL; /* Offset 0x30 */
}struct_YUV2RGB_t;
#define YUV2RGB ((struct_YUV2RGB_t *)YUV2RGB_BASE)
/* ################################ Register Section END ################################## */
/**
* @}
*/
/** @addtogroup YUV2RGB_Initialization_Config_Section
* @{
*/
/* ################################ Initialization, Config Section Start ################################ */
/* YUV2RGB status index */
typedef enum
{
YUV_FIFO_EMPTY = 0x01, /*!< YUV FIFO empty */
YUV_FIFO_ALMOST_EMPTY = 0x02, /*!< YUV FIFO almost empty */
YUV_FIFO_FULL = 0x04, /*!< YUV FIFO full */
YUV_FIFO_ALMOST_FULL = 0x08, /*!< YUV FIFO almost full */
RGB_FIFO_EMPTY = 0x10, /*!< RGB FIFO empty */
RGB_FIFO_ALMOST_EMPTY = 0x20, /*!< RGB FIFO almost empty */
RGB_FIFO_FULL = 0x40, /*!< RGB FIFO full */
RGB_FIFO_ALMOST_FULL = 0x80, /*!< RGB FIFO almost full */
}enum_YUV2RGB_STATUS_t;
/* YUV2RGB calculate mode */
typedef enum
{
YUV2RGB_CALCULATE_MODE_A,
YUV2RGB_CALCULATE_MODE_B,
}enum_YUV2RGB_CALCULATE_MODE_t;
/* RGB FORMAT */
typedef enum
{
RGB_FORMAT_888,
RGB_FORMAT_565,
RGB_FORMAT_332,
}enum_RGB_FORMAT_t;
/* YUV FORMAT */
typedef enum
{
YUV_FORMAT_444,
YUV_FORMAT_422,
}enum_YUV_FORMAT_t;
/**
* @brief YUV2RGB Init Structure definition
*/
typedef struct
{
uint32_t YUV_Format; /*!< Specifies the number of YUV format.
This parameter can be a value of @ref enum_YUV_FORMAT_t. */
uint32_t RGB_Format; /*!< Specifies the number of RGB format.
This parameter can be a value of @ref enum_RGB_FORMAT_t. */
uint32_t YUV_CalculateMode; /*!< Specifies the number of YUV2RGB calculate mode.
This parameter can be a value of @ref enum_YUV2RGB_CALCULATE_MODE_t. */
}struct_YUV2RGBInit_t;
/**
* @brief YUV2RGB handle Structure definition
*/
typedef struct
{
struct_YUV2RGB_t *YUV2RGBx; /*!< YUV2RGB registers base address */
struct_YUV2RGBInit_t Init; /*!< YUV2RGB Init parameters */
union {
volatile void *p_data;
volatile uint16_t *p_u16;
volatile uint32_t *p_u32;
}u_YUVData;
union {
volatile void *p_data;
volatile uint8_t *p_u8;
volatile uint16_t *p_u16;
volatile uint32_t *p_u32;
}u_RGBData;
volatile bool b_CovertBusy;
volatile uint32_t u32_Pixels;
volatile uint32_t u32_RGBCount;
volatile uint32_t u32_YUVCount;
}YUV2RGB_HandleTypeDef;
/* ################################ Initialization, Config Section END ################################## */
/**
* @}
*/
/* Exported macro ------------------------------------------------------------*/
/* YUV2RGB enable */
#define __YUV2RGB_ENABLE(__YUV2RGB__) (__YUV2RGB__->YUV2RGB_CTL = 1)
#define __YUV2RGB_DISABLE(__YUV2RGB__) (__YUV2RGB__->YUV2RGB_CTL = 0)
/* YUV FIFO almost full threshold */
/* YUV FIFO almost empty threshold */
#define __YUV2RGB_YUV_FIFO_ALMOST_FULL_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->YUV_FIFO_CTRL.YUV_FIFO_ALMOST_FULL_LEVEL = __LEVEL__)
#define __YUV2RGB_YUV_FIFO_ALMOST_EMPTY_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->YUV_FIFO_CTRL.YUV_FIFO_ALMOST_EMPTY_LEVEL = __LEVEL__)
/* RGB FIFO almost full threshold */
/* RGB FIFO almost empty threshold */
#define __YUV2RGB_RGB_FIFO_ALMOST_FULL_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->RGB_FIFO_CTRL.RGB_FIFO_ALMOST_FULL_LEVEL = __LEVEL__)
#define __YUV2RGB_RGB_FIFO_ALMOST_EMPTY_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->RGB_FIFO_CTRL.RGB_FIFO_ALMOST_EMPTY_LEVEL = __LEVEL__)
/* Get RGB FIFO data count */
/* Get YUV FIFO data count */
#define __YUV2RGB_GET_RGB_FIFO_COUNT(__YUV2RGB__) (__YUV2RGB__->FIFO_STATUS.RGB_FIFO_COUNT)
#define __YUV2RGB_GET_YUV_FIFO_COUNT(__YUV2RGB__) (__YUV2RGB__->FIFO_STATUS.YUV_FIFO_COUNT)
/* YUV2RGB DMA enable */
#define __YUV2RGB_DMA_ENABLE(__YUV2RGB__) (__YUV2RGB__->DMA_CTRL.DMA_EN = 1)
#define __YUV2RGB_DMA_DISABLE(__YUV2RGB__) (__YUV2RGB__->DMA_CTRL.DMA_EN = 0)
#define __YUV2RGB_DMA_YUV_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->DMA_CTRL.YUV_DMA_LEVEL = __LEVEL__)
#define __YUC2RGB_DMA_RGB_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->DMA_CTRL.RGB_DMA_LEVEL = __LEVEL__)
/* YUV flow threshold */
/* RGB flow threshold */
#define __YUV2RGB_YUV_FLOW_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->FLOW_CTRL.YUV_FLOW_LEVEL = __LEVEL__)
#define __YUV2RGB_RGB_FLOW_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->FLOW_CTRL.RGB_FLOW_LEVEL = __LEVEL__)
/* RGB565 RGB optimize threshold */
/* RGB322 RGB optimize threshold */
#define __YUV2RGB_RGB322_R_OPTIMIZE_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->OPTIMIZE_CTRL.RGB322_R_THR = __LEVEL__)
#define __YUV2RGB_RGB322_G_OPTIMIZE_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->OPTIMIZE_CTRL.RGB322_G_THR = __LEVEL__)
#define __YUV2RGB_RGB322_B_OPTIMIZE_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->OPTIMIZE_CTRL.RGB322_B_THR = __LEVEL__)
#define __YUV2RGB_RGB565_R_OPTIMIZE_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->OPTIMIZE_CTRL.RGB565_R_THR = __LEVEL__)
#define __YUV2RGB_RGB565_G_OPTIMIZE_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->OPTIMIZE_CTRL.RGB565_G_THR = __LEVEL__)
#define __YUV2RGB_RGB565_B_OPTIMIZE_LEVEL(__YUV2RGB__, __LEVEL__) (__YUV2RGB__->OPTIMIZE_CTRL.RGB565_B_THR = __LEVEL__)
/* YUV2RGB get interrupt raw status */
#define __YUV2RGB_GET_INT_RAW_STATUS(__YUV2RGB__) (__YUV2RGB__->INT_RAW)
/* YUV2RGB get interrupt status */
#define __YUV2RGB_GET_INT_STATUS(__YUV2RGB__) (__YUV2RGB__->INT_STATUS)
/* YUV2RGB set interrupt enable */
/* YUV2RGB set interrupt disable */
#define __YUV2RGB_INT_ENABLE(__YUV2RGB__, __INDEX__) (__YUV2RGB__->INT_CTRL |= (__INDEX__))
#define __YUV2RGB_INT_DISABLE(__YUV2RGB__, __INDEX__) (__YUV2RGB__->INT_CTRL &= ~(__INDEX__))
/* Exported functions --------------------------------------------------------*/
/* yuv2rgb_IRQHandler */
void yuv2rgb_IRQHandler(YUV2RGB_HandleTypeDef *hyuv2rgb);
/* yuv2rgb_init */
void yuv2rgb_init(YUV2RGB_HandleTypeDef *hyuv2rgb);
/* yuv2rgb_convert */
/* yuv2rgb_convert_IT */
void yuv2rgb_convert(YUV2RGB_HandleTypeDef *hyuv2rgb, void *YUV_Buffer, void *RGB_Buffer, uint32_t fu32_Pixels);
void yuv2rgb_convert_IT(YUV2RGB_HandleTypeDef *hyuv2rgb, void *YUV_Buffer, void *RGB_Buffer, uint32_t fu32_Pixels);
#endif