📄 bsp_lcd.c
字号:
*
* LCD_DualPanelEn DEF_ENABLED
* DEF_DISABLED
*
* LCD_EndianByteType BSP_LCD_ENDIAN_BYTE_TYPE_BIG
* BSP_LCD_ENDIAN_BYTE_TYPE_LITTLE
*
* LCD_EndianPixelType BSP_LCD_ENDIAN_PIXEL_TYPE_BIG
* BSP_LCD_ENDIAN_PIXEL_TYPE_LITTLE
*
* LCD_HBP Any positive integer value
* LCD_HFP " " " "
* LCD_HSW " " " "
* LCD_PPL " " " "
* LCD_LinEndDly " " " "
* LCD_VBP " " " "
* LCD_VFP " " " "
* LCD_VSW " " " "
* LCD_LPP " " " "
* LCD_PixelClkFreq " " " "
*
* LCD_PolFlags OR value with the folowing Masks
* BSP_LCD_FLAG_IOE_EN
* BSP_LCD_FLAG_IPC_EN
* BSP_LCD_FLAG_IHS_EN
* BSP_LCD_FLAG_IVS_EN
*
* LCD_UpperPanelAddr Any positive integer value that represents a valid position in memory
*
* LCD_LowerPanelAddr Any positive integer value that represents a valid position in memory
*
* LCD_SwapRB_En DEF_ENABLED
* DEF_DISABLED
*
* Return(s) : none.
*
* Caller(s) : BSP_LCD_Init()
*
* Note(s) : none.
*********************************************************************************************************
*/
static void BSP_LCD_CtrlInit (BSP_LCD_PARAM *LCDInit)
{
CPU_INT32U reg_val;
CPU_INT32U lcd_clk;
CPU_INT16U lcd_clk_div;
PCONP |= (1 << BSP_PCLK_PCLCD); /* Enable LCD controller in the Power Control register */
reg_val = 0;
/* Configure the I/O based on the display mode and type */
switch (LCDInit->LCD_DispMode) {
case BSP_LCD_DISP_MODE_TFT_SINGLE_16_565:
case BSP_LCD_DISP_MODE_STN_SINGLE_8_MONO:
case BSP_LCD_DISP_MODE_STN_SINGLE_COLOR:
PINSEL2 &= 0xFFFFFFCF;
PINSEL2 |= 0x00000010;
PINMODE2 &= 0xFFFFFFCF;
PINMODE2 |= 0x00000020;
PINSEL3 &= 0xFFC000FF;
PINSEL3 |= 0x00155500;
PINMODE3 &= 0xFFC000FF;
PINMODE3 |= 0x002AAA00;
PINSEL4 &= 0xF0F00000;
PINSEL4 |= 0x050FFFFF;
PINMODE4 &= 0xF0F00000;
PINMODE4 |= 0x0A0AAAAA;
PINSEL11 &= 0xFFFFFFF0;
PINSEL11 |= 0x0000000B;
break;
case BSP_LCD_DISP_MODE_TFT_SINGLE_16_1555:
case BSP_LCD_DISP_MODE_STN_DUAL_4_MONO:
/* $$$$ Insert code for I/O initialization in this mode */
break;
case BSP_LCD_DISP_MODE_TFT_SINGLE_24:
case BSP_LCD_DISP_MODE_STN_DUAL_8_MONO:
case BSP_LCD_DISP_MODE_STN_DUAL_COLOR:
/*
PINSEL0 &= 0xFFF000FF;
PINSEL0 |= 0x00005500;
PINMODE0 &= 0xFFFC00FF;
PINMODE0 |= 0x0002AA00;
PINSEL3 &= 0xF00000FF;
PINSEL3 |= 0x05555500;
PINMODE3 &= 0xF00000FF;
PINMODE3 |= 0x0AAAAA00;
PINSEL4 &= 0xF0300000;
PINSEL4 |= 0x054FFFFF;
PINMODE4 &= 0xF0300000;
PINMODE4 |= 0x0A8AAAAA;
PINSEL9 &= 0xF0FFFFFF;
PINSEL9 |= 0x0A000000;
PINMODE9 &= 0xF0FFFFFF;
PINMODE9 |= 0x0A000000;
PINSEL11 &= 0xFFFFFFF0;
PINSEL11 |= 0x0000000F;
*/
break;
default:
case BSP_LCD_DISP_MODE_TFT_SINGLE_12_444:
case BSP_LCD_DISP_MODE_STN_SINGLE_4_MONO:
/* $$$$ Insert code for I/O initialization in this mode */
break;
}
/* Set the Horizoantal Timing values */
LCD_TIMH = (((((LCDInit->LCD_PPL / 16) - 1) & 0x3F) << 2 )
| ((((LCDInit->LCD_HSW ) - 1) & 0xFF) << 8 )
| ((((LCDInit->LCD_HFP ) - 1) & 0xFF) << 16)
| ((((LCDInit->LCD_HBP ) - 1) & 0xFF) << 24));
/* Set the Vertical Timing values */
LCD_TIMV = ((((LCDInit->LCD_LPP - 1) & 0x3FF) << 0)
| (((LCDInit->LCD_VSW - 1) & 0x03F) << 10)
| (((LCDInit->LCD_VFP - 1) & 0x0FF) << 16)
| (((LCDInit->LCD_VBP - 1) & 0x0FF) << 24));
/* Configure the Clock and siganl polarity register with ... */
/* ... following formula LCDCLK = LCDCLKIN / (clk_div + 2) */
reg_val = 0;
lcd_clk = BSP_LCD_GetClkFreq();
lcd_clk_div = (lcd_clk / (LCDInit->LCD_PixelClkFreq));
lcd_clk_div &= 0x3FF; /* LCD Clk divisor is only 10 bits */
if (lcd_clk_div >= 2) { /* If the divisor is >= 2 */
lcd_clk_div -= 2;
reg_val |= ((lcd_clk_div >> 5) << 27); /* LCDPOL[31:27] = Upper five bits of clk_div */
reg_val |= ((lcd_clk_div & 0x1F) << 0); /* LCDPOL[4:0] = Lower five bits of clk_div */
} else { /* If the divisor is < 2 */
reg_val |= BSP_LCD_POL_BCD_EN; /* Bypass clk divider */
}
if (LCDInit->LCD_DispType == BSP_LCD_DISP_TYPE_TFT) { /* Set the clocks per line value */
reg_val |= (((LCDInit->LCD_PPL - 1) & 0x3FF) << 16);
} else {
switch (LCDInit->LCD_DispType) {
case BSP_LCD_DISP_MODE_STN_SINGLE_4_MONO:
case BSP_LCD_DISP_MODE_STN_DUAL_4_MONO:
reg_val |= ((((LCDInit->LCD_PPL / 4) - 1) & 0x3FF) << 16);
break;
case BSP_LCD_DISP_MODE_STN_DUAL_8_MONO:
case BSP_LCD_DISP_MODE_STN_SINGLE_8_MONO:
reg_val |= ((((LCDInit->LCD_PPL / 8) - 1) & 0x3FF) << 16);
break;
case BSP_LCD_DISP_MODE_STN_SINGLE_COLOR:
case BSP_LCD_DISP_MODE_STN_DUAL_COLOR:
reg_val |= (((((LCDInit->LCD_PPL * 3) / 8) - 1) & 0x3FF) << 16);
default:
break;
}
}
if (LCDInit->LCD_ACB != 0) { /* Set the AC bias pin frequency */
reg_val |= (((LCDInit->LCD_ACB - 1) & 0x1F) << 6);
}
if (DEF_BIT_IS_SET(LCDInit->LCD_PolFlags, BSP_LCD_FLAG_IOE_EN)) {
reg_val |= BSP_LCD_POL_IOE;
}
if (DEF_BIT_IS_SET(LCDInit->LCD_PolFlags, BSP_LCD_FLAG_IPC_EN)) {
reg_val |= BSP_LCD_POL_IPC;
}
if (DEF_BIT_IS_SET(LCDInit->LCD_PolFlags, BSP_LCD_FLAG_IHS_EN)) {
reg_val |= BSP_LCD_POL_IHS;
}
if (DEF_BIT_IS_SET(LCDInit->LCD_PolFlags, BSP_LCD_FLAG_IVS_EN)) {
reg_val |= BSP_LCD_POL_IVS;
}
LCD_POL = reg_val;
if (LCDInit->LCD_LinEndDly != 0) { /* Configure the Line End Control Register */
LCD_LE = BSP_LCD_LE_LEE_EN
| (LCDInit->LCD_LinEndDly & 0x7F);
}
/* Configure LCD Panel Address */
if(LCDInit->LCD_DualPanelEn == DEF_ENABLED) {
LCD_LPBASE = (CPU_INT64U)(LCDInit->LCD_LowerPanelAddr & 0xFFFFFFFC);
}
LCD_UPBASE = (CPU_INT64U)(LCDInit->LCD_UpperPanelAddr & 0xFFFFFFFC);
reg_val = 0;
/* Configure the LCD Control Register */
if (LCDInit->LCD_EndianByteType == BSP_LCD_ENDIAN_BYTE_TYPE_BIG) {
reg_val |= BSP_LCD_CTRL_BEBO_EN; /* Big Endian byte order */
}
if (LCDInit->LCD_EndianPixelType == BSP_LCD_ENDIAN_PIXEL_TYPE_BIG) {
reg_val |= BSP_LCD_CTRL_BEPO_EN; /* Big endian Pixel order */
}
if(LCDInit->LCD_SwapRB_En == DEF_ENABLED) {
reg_val |= BSP_LCD_CTRL_BGR; /* Swap Read and Blue values = BGR */
}
if(LCDInit->LCD_DualPanelEn == DEF_ENABLED) {
reg_val |= BSP_LCD_CTRL_DUAL_PANEL_EN; /* Enable Dual panel feature */
}
if ((LCDInit->LCD_DispType == BSP_LCD_DISP_TYPE_STN ) &&
(LCDInit->LCD_DispMode != BSP_LCD_DISP_MODE_STN_SINGLE_COLOR) &&
(LCDInit->LCD_DispMode != BSP_LCD_DISP_MODE_STN_DUAL_COLOR )) {
if ((LCDInit->LCD_DispMode == BSP_LCD_DISP_MODE_STN_DUAL_8_MONO) ||
(LCDInit->LCD_DispMode == BSP_LCD_DISP_MODE_STN_SINGLE_8_MONO)) {
reg_val |= BSP_LCD_CTRL_MONO_8_EN;
}
}
if (LCDInit->LCD_DispType == BSP_LCD_DISP_TYPE_TFT) {
reg_val |= BSP_LCD_CTRL_LCD_TFT_EN; /* Enable TFT display type */
}
if ((LCDInit->LCD_DispType == BSP_LCD_DISP_TYPE_STN ) &&
(LCDInit->LCD_DispMode != BSP_LCD_DISP_MODE_STN_SINGLE_COLOR) &&
(LCDInit->LCD_DispMode != BSP_LCD_DISP_MODE_STN_DUAL_COLOR )) {
reg_val |= BSP_LCD_CTRL_BW_EN; /* Enable Black and White support for monochome STN disp */
}
switch (LCDInit->LCD_BPP) { /* Set the bits per pixel value */
case BSP_LCD_BPP_1:
reg_val |= BSP_LCD_CTRL_BPP1;
break;
case BSP_LCD_BPP_2:
reg_val |= BSP_LCD_CTRL_BPP2;
break;
case BSP_LCD_BPP_4:
reg_val |= BSP_LCD_CTRL_BPP8;
break;
case BSP_LCD_BPP_24:
reg_val |= BSP_LCD_CTRL_BPP24;
break;
case BSP_LCD_BPP_16_565:
reg_val |= BSP_LCD_CTRL_BPP16_565;
break;
case BSP_LCD_BPP_12_444:
reg_val |= BSP_LCD_CTRL_BPP12_444;
default:
break;
}
LCD_CTRL = reg_val;
}
/*
*********************************************************************************************************
* BSP_LCD_GetClkFreq()
*
* Description : Returns the Frequency of the LCD Controller Clk
*
* Argument(s) : none
*
* Return(s) : The frequency in Hertz of the LCD Controller Clk
*
* Caller(s) : BSP_LCD_CtrlInit().
*
* Note(s) : none.
*********************************************************************************************************
*/
static CPU_INT32U BSP_LCD_GetClkFreq (void)
{
CPU_INT08U lcd_clk_div;
CPU_INT32U lcd_clk_src_freq;
lcd_clk_div = (LCD_CFG & 0x1F) + 1;
if (DEF_BIT_IS_CLR(LCD_POL, DEF_BIT_05)) {
lcd_clk_src_freq = BSP_CPU_ClkFreq();
} else {
lcd_clk_src_freq = BSP_LCD_CLK_IN_FREQ;
}
return (lcd_clk_src_freq / lcd_clk_div);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -