MXC-A36-Demo/MCU/components/drivers/bsp/display/driver_nv3047_rgb.c

202 lines
6.6 KiB
C
Raw Permalink Normal View History

/*
******************************************************************************
* @file RGB_demo.c
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2023
* @brief RGB interface module Demo.
******************************************************************************
* @attention
*
* Copyright (c) 2023 FreqChip.
* All rights reserved.
******************************************************************************
*/
#include "driver_nv3047_rgb.h"
#if (BOARD_SEL == BOARD_EVB_FR3092E_RGB)
static GPIO_InitTypeDef GPIO_Handle;
PARALLEL_HandTypeDef hparallel;
SPI_HandleTypeDef spi_handle;
DMA_HandleTypeDef dma_handle;
DMA_HandleTypeDef dma1_handle;
struct_RGB_TypeDef_t rgb_handle;
unsigned char *coply = NULL;
void timer0_irq(void);
/************************************************************************************
* @fn rgb_display_controller_init
*
* @brief rgb_display_controller_init
*
*/
void rgb_display_controller_init(void)
{
/* init parallel CLOCK */
__SYSTEM_PARALLEL_CLK_ENABLE();
__SYSTEM_PARALLEL_CLK_SELECT_SPLL();
__SYSTEM_GPIOA_CLK_ENABLE();
__SYSTEM_GPIOB_CLK_ENABLE();
__SYSTEM_GPIOC_CLK_ENABLE();
__SYSTEM_GPIOD_CLK_ENABLE();
__SYSTEM_DMA0_CLK_ENABLE();
__SYSTEM_DMA1_CLK_ENABLE();
__SYSTEM_TIMER0_CLK_ENABLE();
//__SYSTEM_SPI_MASTER1_X8_CLK_ENABLE();
__SYSTEM_SPI_MASTER0_X8_CLK_ENABLE();
printf("parallel clock:%d\r\n", system_get_peripheral_clock( PER_CLK_PARALLEL));
/* RGB io init */
/*
D0~D15 PC0~15
DCLK PB13
*/
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pin = RGB565_LCD_DATA_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_DATA_PORT, &GPIO_Handle);
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pin = RGB565_LCD_DCLK_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_DCLK_PORT, &GPIO_Handle);
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_VSYNC_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_VSYNC_PORT, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_HSYNC_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_HSYNC_PORT, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_DE_EN_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_DE_EN_PORT, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_RESET_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_RESET_PORT, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = GPIO_PIN_13;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(GPIOD, &GPIO_Handle);
rgb_lcd_reset_release();
/* backlight */
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_BACKLIGHT_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_BACKLIGHT_PORT, &GPIO_Handle);
rgb_lcd_backlight_set();
rgb_lcd_disp_set();//Display control / standby mode selection. Internal pull low.DISP = “Low” : Standby.DISP = “High” : Normal display.
system_delay_us(1000 * 20);
#ifdef RGB56_LCD_INIT_CONFIG
/* SPI CS */
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_SPI_CS_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_SPI_CS_PORT, &GPIO_Handle);
/* SPI io init */
// B0,B2 B3
GPIO_Handle.Alternate = GPIO_FUNCTION_7;
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pin = RGB565_LCD_SPI_CLK_GPIO|RGB565_LCD_SPI_MOSI_GPIO|RGB565_LCD_SPI_MISO_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_SPI_CLK_PORT, &GPIO_Handle);
/* SPI init */
spi_handle.SPIx = SPIMX8_0;
spi_handle.Init.Work_Mode = SPI_WORK_MODE_3;
spi_handle.Init.Frame_Size = SPI_FRAME_SIZE_9BIT;
spi_handle.Init.BaudRate_Prescaler = 100;
spi_handle.Init.TxFIFOEmpty_Threshold = 0;
spi_handle.Init.RxFIFOFull_Threshold = 0;
spi_master_init(&spi_handle);
#endif
/* PARALLEL Init */
hparallel.PARALLELx = PARALLEL0;
hparallel.Init.DataBusSelect = DATA_BUS_16_BIT;
hparallel.Init.ParallelMode = MODE_6800;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_0 = 0;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_1 = 1;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_2 = 2;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_3 = 3;
hparallel.Init.ReadClock = WDCLK_DIV_4;
hparallel.Init.WriteClock = WDCLK_DIV_2;
parallel_init(&hparallel);
hparallel.PARALLELx->CRM.WR_L_LEN = 2;
hparallel.PARALLELx->CRM.WR_H_LEN = 2;
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* DMA Init */
system_dmac_request_id_config(PARALLEL_INTERFACE,DMA0_REQUEST_ID_3);
dma_handle.DMAx = DMA0;
dma_handle.Channel = DMA_Channel2;
dma_handle.Init.Data_Flow = DMA_M2P_DMAC;
dma_handle.Init.Request_ID = DMA0_REQUEST_ID_3;
dma_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3;
dma_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_1;
dma_handle.Init.Source_Inc = DMA_ADDR_INC_INC;
dma_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE;
dma_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
dma_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
dma_handle.Init.Source_Burst_Len = DMA_BURST_LEN_16;
dma_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_16;
dma_init(&dma_handle);
}
/************************************************************************************
* @fn rgb_display_init
*
* @brief rgb_display_init
*
*/
void rgb_display_init(void* buffer)
{
coply = buffer;
/* rgb init */
rgb_init();
NVIC_ClearPendingIRQ(TIMER0_IRQn);
NVIC_EnableIRQ(TIMER0_IRQn);
NVIC_ClearPendingIRQ(DMA0_IRQn);
NVIC_EnableIRQ(DMA0_IRQn);
rgb_display_start(Timer0, &rgb_handle, 2, coply);
printf("%s:%d\r\n", __func__, __LINE__);
}
void timer0_irq(void)
{
rgb_timer_IRQHandler(Timer0, &rgb_handle);
}
__RAM_CODE void rgb_display_dma_irq(void)
{
if (dma_get_tfr_Status(&dma_handle))
{
rgb_dma_IRQHandler(&rgb_handle);
dma_clear_tfr_Status(&dma_handle);
}
}
#endif