网站建设最便宜,在线小游戏,设计师常用网站,网页美工软件TQ210 —— LCD一、LCD控制器1、S5PV210 LCD控制器要使一块LCD正常的显示文字或图像#xff0c;不仅需要LCD驱动器#xff0c;而且还需要相应的LCD控制器。在通常情况下#xff0c;生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起#xff0c;而LCD控制器则是…TQ210 —— LCD一、LCD控制器1、S5PV210 LCD控制器要使一块LCD正常的显示文字或图像不仅需要LCD驱动器而且还需要相应的LCD控制器。在通常情况下生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起而LCD控制器则是由外部的电路来实现现在很多的MCU内部都集成了LCD控制器如S5PV210等。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。LCD控制器可以通过编程支持不同LCD屏的要求例如行和列像素数数据总线宽度接口时序和刷新频率等。LCD控制器的主要作用是将定位在系统存储器中的显示缓冲区中的LCD图像数据传送到外部LCD驱动器并产生必要的控制信号例如RGB_VSYNC, RGB_HSYNC, RGB_VCLK等。2、主要特性1支持4种接口类型RGB/i80/ITU 601(656)/YTU444 2支持单色、4级灰度、16级灰度、256色的调色板显示模式 3支持64K和16M色非调色板显示模式 4支持多种规格和分辨率的LCD 5虚拟屏幕最大可达16MB 65个256*32位调色板内存7支持透明叠加 3、控制器子模块1、主要由VSFR, VDMA, VPRCS , VTIME和视频时钟产生器几个模块组成2、VSFR由121个可编程控制器组一套gamma LUT寄存器组包括64个寄存器一套i80命令寄存器组包括12个寄存器和5块256*32调色板存储器组成主要用于对lcd控制器进行配置。3、VDMA是LCD专用的DMA传输通道可以自动从系统总线上获取视频数据传送到VPRCS无需CPU干涉。4、VPRCS收到数据后组成特定的格式如16bpp或24bpp然后通过数据接口RGB_VD, VEN_VD, V656_VD or SYS_VD传送到外部LCD屏上。 5、VTIME模块由可编程逻辑组成负责不同lcd驱动器的接口时序控制需求。VTIME模块产生 RGB_VSYNC, RGB_HSYNC, RGB_VCLK, RGB_VDEN, VEN_VSYNC等信号。二、接口信号FIMD显示控制器信号我写的word表格怎么成这样了Signal
I/O
Description
LCD Type LCD_HSYNC
O
水平同步信号
RGB I/F LCD_VSYNC
O
垂直同步信号LCD_VDEN
O
数据使能LCD_VCLK
O
视频时钟LCD_VD[23:0]
O LCD像素数据输出 SYS_OE
O
输出使能VSYNC_LDI
O
Indirect i80接口垂直同步信号
i80 I/F SYS_CS0
O
Indirect i80接口片选LCD0SYS_CS1
O
Indirect i80接口片选LCD1SYS_RS
O
Indirect i80接口寄存器选择信号SYS_WE
O
Indirect i80接口写使能信号SYS_VD[23:0]
IO Indirect i80接口视频数据输入输出 SYS_OE
O
Indirect i80接口输出使能信号VEN_HSYNC
O
601接口水平同步信号
ITU 601/656 I/F VEN_VSYNC
O
601接口垂直同步信号VEN_HREF
O
601接口数据使能V601_CLK
O
601接口数据时钟VEN_DATA[7:0]
O 601接口YUV422格式数据输出 V656_DATA[7:0]
O 656接口YUV422格式数据输出 V656_CLK
O
656接口数据时钟VEN_FIELD
O
601接口域信号其中主要的RGB接口信号1、LCD_HSYNC: 行同步信号表示一行数据的开始LCD控制器在整个水平线整行数据移入LCD驱动器后插入一个LCD_HSYNC信号 2、LCD_VSYNC: 帧同步信号表示一帧数据的开始LCD控制器在一个完整帧显示完成后立即插入一个LCD_VSYNC信号开始新一帧的显示VSYNC信号出现的频率表示一秒钟内能显示多少帧图像称为“显示器的频率” 3、LCD_VCLK像素时钟信号表示正在传输一个像素的数据4、LCD_VDEN: 数据使能信号5、LCD_VD[23:0]: LCD像素数据输出端口三、工作时序下图是LCD RGB接口工作时序图上面时序图上各时钟延时参数的含义如下(这些参数的值LCD产生厂商会提供相应的数据手册) VBPD(vertical back porch)表示在一帧图像开始时垂直同步信号以后的无效的行数VFBD(vertical front porch)表示在一帧图像结束后垂直同步信号以前的无效的行数VSPW(vertical sync pulse width)表示垂直同步脉冲的宽度用行数计算HBPD(horizontal back porch)表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数HFPD(horizontal front porth)表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数HSPW(horizontal sync pulse width)表示水平同步信号的宽度用VCLK计算1帧的传输过程1、VSYNC信号有效时表示一帧数据的开始 信号宽度为 VSPW 1个HSYNC信号周期即VSPW 1个无效行2、VSYNC信号脉冲之后总共还要经过VBPD 1个HSYNC信号周期有效的行数据才出现 所以在VSYNC信号有效之后还要经过VSPW 1 VBPD 1个无效的行3、随即发出LINEVAL 1行的有效数据4、最后是VFPD 1个无效的行2行中像素数据的传输过程1、HSYNC信号有效时表示一行数据的开始信号宽度为HSPW 1个VCLK信号周期即HSPW 1个无效像素2、HSYNC信号脉冲之后还要经过HBPD 1个VCLK信号周期有效的像素数据才出现3、随后发出HOZVAL 1个像素的有效数据4、最后是HFPD 1个无效的像素3将VSYNC、HSYNC、VCLK等信号的时间参数设置好之后并将帧内存的地址告诉LCD控制器它即可自动地发起DMA传输从帧内存中得到图像数据最终在上述信号的控制下出现在数据总线VD[23:0]上。用户只需要把要显示的图像数据写入帧内存中。 四、外部接口S5PV210外部LCD控制器接口图如下下图是信号的引脚连接描述116M24BPP色的显示模式 用24位的数据来表示一个像素的颜色每种颜色使用8位LCD控制器从内存中获得某个像素的24为颜色值后直接通过VD[23:0]数据线发送给LCD在内存中使用4个字节32位来表示一个像素其中的3个字节从高到低分别表示红、绿、蓝剩余的1个字节无效 264K16BPP色的显示模式 用16位的数据来表示一个像素的颜色格式又分为两种565 ——使用5位来表示红色6位表示绿色5位表示蓝色 5551——分别使用5位来表示红、绿、蓝最后一位表示透明度 每种bpp模式下的引脚定义五、寄存器主要寄存器如下其它参照用户手册S5PV210X_UserManual.pdf1VIDCON0: 配置视频输出格式显示使能VIDCON0,R/W,ADDRESS0XF800_0000VIDCON1: RGB 接口控制信号 VIDCON2 : 输出数据格式控制 VIDCON3 : 图像增强控制 I80IFCONx: i80接口控制信号 ITUIFCON : ITU接口控制信号 VIDTCONx: 配置视频输出时序及显示大小WINCONx: 每个窗口特性设置 VIDOSDxA,B : 窗口位置设置 VIDOSDxC,D: OSD大小设置六、LCD配置步骤S5PV210手册给出了1. VIDCON0: Configures video output format and displays enable/disable.2. VIDCON1: Specifies RGB I/F control signal.3. VIDCON2: Specifies output data format control.4. VIDCON3: Specifies image enhancement control.5. I80IFCONx: Specifies CPU interface control signal.6. VIDTCONx: Configures video output timing and determines the size of display.7. WINCONx: Specifies each window feature setting.8. VIDOSDxA, VIDOSDxB: Specifies window position setting.9. VIDOSDxC,D: Specifies OSD size setting.10. VIDWxALPHA0/1: Specifies alpha value setting.11. BLENDEQx: Specifies blending equation setting.12. VIDWxxADDx: Specifies source image address setting.13. WxKEYCONx: Specifies color key setting register.14. WxKEYALPHA: Specifies color key alpha value setting.15. WINxMAP: Specifies window color control.16. GAMMALUT_xx: Specifies gamma value setting.17. COLORGAINCON: Specifies color gain value setting.18. HUExxx: Specifies Hue coefficient and offset value setting.19. WPALCON: Specifies palette control register.20. WxRTQOSCON: Specifies RTQoS control register.21. WxPDATAxx: Specifies Window Palette Data of each Index.22. SHDOWCON: Specifies Shadow control register.23. WxRTQOSCON: Specifies QoS control register实际中我们还需要配置 LCD 相关信号引脚GPIO以及背光控制引脚。关键点解析1、 LCD 时钟源的确定参考 S5PV210 芯片手册时钟部分在 VIDCON0 寄存器中的 CLKSEL_F 域指定 LCD 的时钟源可以是 HCLK 和 SCLK_FIMD。S5PV210 由 3 个时钟域组成其中 DSYS 域为 FIMD 提供时钟FIMD 就是 Fully Interactive Mobile Display完全交互式移动显示设备即我们要操作的 LCD 控制器。所以上面的 HCLK 为 HCLK_DSYS由 MOUT_DSYS 分频得到freq(HCLK_DSYS) MOUT_DSYS / (HCLK_DSYS_RATIO 1) 667 / (3 1) 166MHz而 SCLK_FIMD 由 MOUT_FIMD 分频得到而 MOUT_FIMD 的时钟源由 SCLK_SRC1 寄存器中的 FIMD_SEL域确定。2、在 S5PV210 芯片手册 1.3.1 BRIEF DESCRIPTION OF THE SUB-BLOCK 中提到Using the display controller data, you can select one of the above data paths by setting DISPLAY_PATH_SEL[1:0] (0xE010_7008). For more information, refer to Chapter, Section 02.03. Clock controller.我们需要配置这个寄存器3、 VIDCON1 中配置 HSYNC、 VSYNC、 VDEN 的极性是否反转这要对比 S5PV210 中的 LCD 时序图和LCD 芯片手册中的 LCD 时序图如果有效信号的电平或上升沿或下降沿相同则不反转否则要反转。4、 S5PV210 显示控制器有 5 个窗口每个窗口有 3 个视频缓冲区通过 WINCON0 寄存器 BUFSEL选择哪一个这在配置帧缓存地址时用到。添加 lcd 后代码已经增大至 37kB而 BL1 最大为 16KB所以需要重定位 初始化时钟、串口、 DDR设置栈然后跳转到 DDR 中执行 bl2.bin 在 bl2.bin 中进行 lcd 初始化画线、画圆。部分代码如下 #ifndef LCD_H_
#define LCD_H_#include types.h // 重定义了一些类型#define RED 0xFF0000
#define GREEN 0x00FF00
#define BLUE 0x0000FFvoid lcd_init();
void backlight_ctl(u8 ctl);
void lcd_enable(u8 enable);
void draw_pixel(int x, int y, u32 color);
void clear_screen();
void draw_line(int x0, int y0, int x1, int y1, u32 color);
void draw_circle(int x, int y, int r, u32 color);#endif
#include lcd.h#define GPD0CON *((volatile u32 *)0xE02000A0) // 00000001
#define GPD0DAT *((volatile u32 *)0xE02000A4) // 00000001#define GPF0CON *((volatile u32 *)0xE0200120) // 22222222
#define GPF1CON *((volatile u32 *)0xE0200140) // 22222222
#define GPF2CON *((volatile u32 *)0xE0200160) // 22222222
#define GPF3CON *((volatile u32 *)0xE0200180) // 00002222#define DISPLAY_CONTROL *((volatile u32 *)0xE0107008) // 00000002#define VIDCON0 *((volatile u32 *)0xF8000000) // 41b10133
#define VIDCON1 *((volatile u32 *)0xF8000004) // 01b6c060
#define VIDCON2 *((volatile u32 *)0xF8000008) // 00000000
#define VIDTCON0 *((volatile u32 *)0xF8000010) // 0009150c
#define VIDTCON1 *((volatile u32 *)0xF8000014) // 001a0d13
#define VIDTCON2 *((volatile u32 *)0xF8000018) // 000efb1f
#define VIDTCON3 *((volatile u32 *)0xF800001C) // 00000000
#define WINCON0 *((volatile u32 *)0xF8000020) // 0000802d
#define SHODOWCON *((volatile u32 *)0xF8000034) // 00000001
#define VIDOSD0A *((volatile u32 *)0xF8000040) // 00000000
#define VIDOSD0B *((volatile u32 *)0xF8000044) // 003203bf
#define VIDOSD0C *((volatile u32 *)0xF8000048) // 000bb800
#define VIDW00ADD0B0 *((volatile u32 *)0xF80000A0) // 28000000
#define VIDW00ADD1B0 *((volatile u32 *)0xF80000D0) // 28177c80#define VBPD 23
#define VFPD 22
#define VSPW 2
#define HEIGHT 480#define HBPD 46
#define HFPD 210
#define HSPW 2
#define WIDTH 800
#define BPP 24static u32 bytes_per_line;
static u32 frame_buffer_size;
static u32 frame_buffer_addr 0x28000000;void lcd_init()
{GPF0CON 0x22222222; /* LCD_VD[3:0] LCD_VCLK LCD_VDEN LCD_VSYNC LCD_HSYNC */GPF1CON 0x22222222; /* LCD_VD[11:4] */GPF2CON 0x22222222; /* LCD_VD[19:12] */GPF3CON 0x00002222; /* LCD_VD[23:20] */GPD0CON (GPD0CON ~0xF) | (0x1 0); /* LCD PWR(backlight) */DISPLAY_CONTROL (2 0); /* Display path selection:RGBFIMD I80FIMD ITUFIMD */bytes_per_line WIDTH;if (BPP 16)bytes_per_line * 32;elsebytes_per_line * BPP;bytes_per_line / 8;frame_buffer_size bytes_per_line * HEIGHT;/* Configures video output format and displays enable/disable */VIDCON0 (5 6) | /* CLKVAL 4, HCLK(166MHz) / (5 1) 27MHz */(1 4) | /* Selects the clock source as divide using CLKVAL_F */(0 2); /* Selects the video clock source:HCLK166MHz *//* Specifies RGB I/F control signal */VIDCON1 (0 7) | /* Video data is fetched at VCLK falling edge */(1 6) | /* Inverted HSYNC pulse polarity */(1 5) | /* Inverted VSYNC pulse polarity */(0 4); /* Normal VDEN signal polarity ?????*//* Specifies output data format control */VIDCON2 (0b000 19) | /* RGB interface output order(Even line, line #2,4,6,8):RGB */(0b000 16); /* RGB interface output order(Odd line, line #1,3,5,7):RGB *//* Configures video output timing and determines the size of display */VIDTCON0 (VBPD 16) | /* VBPD */(VFPD 8) | /* VFPD */(VSPW 0); /* VSPW */VIDTCON1 (HBPD 16) | /* HBPD */(HFPD 8) | /* HFPD */(HSPW 0); /* HSPW */VIDTCON2 ((HEIGHT - 1) 11) | /* vertical size of display(LINEVAL 1) */(WIDTH - 1); /* horizontal size of display(HOZVAL 1) */VIDTCON3 (0b1 31); /* Enables VSYNC Signal Output */WINCON0 (0 30) | /* BUFSEL_H 0 */(0 20) | /* BUFSEL_L 0, BUFSEL0b00(Selects the Buffer set 0) */(1 15) | /* the Word swap Enable */(0xB 2); /* Unpacked 24 bpp ( non-palletized R:8-G:8-B:8 ) *//* Specifies window position setting */VIDOSD0A (0 11) | 0; /* LeftTop */VIDOSD0B ((WIDTH - 1) 11) | /* RightBotX */(HEIGHT - 1); /* RightBotY *//* Specifies the Window Size:Height * Width (Number of Word) */VIDOSD0C frame_buffer_size / 4;/* the start address for Video frame buffer */VIDW00ADD0B0 frame_buffer_addr;VIDW00ADD1B0 VIDW00ADD0B0 frame_buffer_size;SHODOWCON 0x1; /* Enables Channel 0 */
}void backlight_ctl(u8 ctl)
{if (ctl)GPD0DAT | 1;elseGPD0DAT ~1;
}void lcd_enable(u8 enable)
{if (enable){ VIDCON0 | 0x3;WINCON0 | 1;}else{WINCON0 ~1;/* see the note in the framebuffer datasheet about why you** cannot take both of these bits down at the same time. */if (VIDCON0 (1 1))VIDCON0 ~1;}
}void draw_pixel(int x, int y, u32 color)
{u32 *p (u32 *)frame_buffer_addr;*(p y * bytes_per_line / 4 x) color;
}void clear_screen()
{int x, y;for (y 0; y HEIGHT; y){for (x 0; x WIDTH; x)draw_pixel(x, y, 0);}
}void draw_line(int x0, int y0, int x1, int y1, u32 color)
{int x, y, dx, dy, Dx, Dy, e, i;Dx x1 - x0;Dy y1 - y0;dx x1 - x0;if (dx 0)dx * -1;dy y1 - y0;if (dy 0)dy * -1;x x0;y y0;if(dy dx){e -dy;for(i 0; i dy; i){draw_pixel(x, y, color);if(Dy 0)y; elsey--; e 2 * dx;if(e 0){if(Dx 0)x;elsex--; e - 2 * dy;}}}else{e -dx;for(i 0; i dx; i){draw_pixel(x, y, color);if(Dx 0)x;elsex--;e 2 * dy;if(e 0){if(Dy 0)y;elsey--;e - 2 * dx;}}}
}void draw_circle(int x, int y, int r, u32 color)
{int a, b, num; a 0; b r; while(2 * b * b r * r) { draw_pixel(x a, y - b,color); draw_pixel(x - a, y - b,color); draw_pixel(x - a, y b,color); draw_pixel(x a, y b,color); draw_pixel(x b, y a,color); draw_pixel(x b, y - a,color); draw_pixel(x - b, y - a,color); draw_pixel(x - b, y a,color); a; num (a * a b * b) - r*r; if(num 0) { b--; a--; } }
}#include lcd.hint main()
{ lcd_init();backlight_ctl(1);lcd_enable(1);clear_screen();draw_line(10, 10, 750, 450, RED);draw_circle(150, 150, 150, BLUE);return 0;
}