📄 lcd.c
字号:
/*********************************************************************************************************
*
*
*
* ********************************************************************************************************
*/
#include "lcd.h"
#define DMA_ADDR 0xc0000000
#if 1
struct fb_info lcd={
panel_name: "LQ035 AD-TFT",
pixclock:55,
/* bpp set based on DIP switches on LCD board */
xres: 240, yres: 320,
hsync_len: 13, /* hsw */ vsync_len: 2, /* vsw */
left_margin: 21, /* hbp */ upper_margin: 5, /* vbp */
right_margin: 11, /* hfp */ lower_margin: 5, /* vfp */
// sync: FB_SYNC_VERT_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
LCDtiming2: LCD_TIMING2_IPC,
LCDtiming3: 0,
LCDcontrol: LCD_CTRL_TFT | LCD_CTRL_BW_COLOR | LCD_CTRL_WATERMARK,
LCDICPcontrol: LCDICP_CONTROL_CLSEN | LCDICP_CONTROL_SPSEN,
LCDICPsetup: LCDICP_SETUP_MODE_HRTFT | LCDICP_SETUP_VERT_NORMAL | LCDICP_SETUP_HORIZ_NORMAL,
LCDICPtiming1: LCDICP_TIMING1_PSDEL(9) | LCDICP_TIMING1_REVDEL(3) | LCDICP_TIMING1_LPDEL(14),
LCDICPtiming2: LCDICP_TIMING2_PSDEL2(209) | LCDICP_TIMING2_SPLVALUE(34),
};
/*#else
*/
#endif
void lcd_paint(char * pic);
static int fclkfreq_get( void)
{
u32 mainDiv1, mainDiv2, preDiv, ps;
u32 clkset = (u32*)(0x80000400+32);
//clkset = clksc->clkset;
mainDiv1 = (clkset >> 7) & 0x0f;
mainDiv2 = (clkset >> 11) & 0x1f;
preDiv = (clkset >> 2) & 0x1f;
ps = (clkset >> 18) & 0x03;
return 14745600 / ((preDiv + 2) * ( 1 << ps)) * (mainDiv1 +2) * (mainDiv2 + 2) ;
}
static int get_pcd(unsigned int pixclock)
{
unsigned int pcd=0;
if (pixclock) {
pcd = fclkfreq_get() / 100;
pcd =pcd/1000;
pcd *= pixclock;
pcd /= 10000000;
pcd += 1; /* make up for integer math truncations */
}
return pcd;
}
void lcd_enable()
{
u32 pcd ;
lcdRegs_t *LCD = (lcdRegs_t *)(0x80003000);
lcdicpRegs_t *LCDICP = (lcdicpRegs_t *)(0x80001000);
u32 *i;
struct tmp_lcd_reg {
u32 LCDtiming0;
u32 LCDtiming1;
u32 LCDtiming2;
u32 LCDtiming3;
u32 LCDcontrol;
u32 LCDICPsetup;
u32 LCDICPcontrol;
u32 LCDICPtiming1;
u32 LCDICPtiming2;
} tmpreg;
/*
* step 1:
*/
tmpreg.LCDcontrol = LCD_CTRL_BPP16 | LCD_CTRL_BGR|LCD_CTRL_PWR;
pcd= get_pcd(lcd.pixclock);
tmpreg.LCDtiming0 =
LCD_TIMING0_HFP(lcd.right_margin) +
LCD_TIMING0_HBP(lcd.left_margin) +
LCD_TIMING0_HSW(lcd.hsync_len) +
LCD_TIMING0_PPL(lcd.xres);
tmpreg.LCDtiming1 =
LCD_TIMING1_VBP(lcd.upper_margin) +
LCD_TIMING1_VFP(lcd.lower_margin) +
LCD_TIMING1_VSW(lcd.vsync_len) +
LCD_TIMING1_LPP(lcd.yres);
tmpreg.LCDtiming2 = lcd.LCDtiming2 ;
//tmpreg.LCDtiming2 = lcd.LCDtiming2 |
// LCD_TIMING2_CPL(lcd.xres) |
// LCD_TIMING2_PCD(pcd)|
// (lcd.sync & FB_SYNC_HOR_HIGH_ACT ? 0 : LCD_TIMING2_IHS) |
// (lcd.sync & FB_SYNC_VERT_HIGH_ACT ? 0 : LCD_TIMING2_IVS);
tmpreg.LCDtiming3 = lcd.LCDtiming3;
tmpreg.LCDICPsetup = lcd.LCDICPsetup | LCDICP_SETUP_PPL(lcd.xres);
tmpreg.LCDICPsetup |= LCDICP_SETUP_POWER;
tmpreg.LCDICPcontrol = lcd.LCDICPcontrol;
tmpreg.LCDICPtiming1 = lcd.LCDICPtiming1;
tmpreg.LCDICPtiming2 = lcd.LCDICPtiming2;
//set gpio
i=(u32)(0x80000e00+0x2c);
*i=3;
//set reg
LCD->control=LCD_CTRL_ENABLE;
LCDICP->control = tmpreg.LCDICPcontrol;
LCDICP->setup = tmpreg.LCDICPsetup;
LCDICP->timing1 = tmpreg.LCDICPtiming1;
LCDICP->timing2 = tmpreg.LCDICPtiming2;
LCD->timing0 = tmpreg.LCDtiming0;
LCD->timing1 = tmpreg.LCDtiming1;
LCD->timing2 = tmpreg.LCDtiming2;
LCD->timing3 = tmpreg.LCDtiming3;
LCD->upbase = DMA_ADDR;
LCD->lpoverflow = DMA_ADDR;
LCD->intrEnable = 0;
LCD->control = tmpreg.LCDcontrol;
}
void lcd_paint(char *pic)
{
int i;
// u32 *tmp=(u32*)DMA_ADDR;
u8 *tmp=(u8*)0x80000E0c;
for(i=0;i<(320*240);i++)
*tmp=0xf0f0f0f0;
}
void v_start()
{
int i;
lcd_enable();
while(1)
{
lcd_paint(0);
for (i=0;i<100;i++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -