S3C2410 下LCD 驱动程序移植及GUI 程序编写
基于ARM9处理器S3C2410的LCD显示系统设计,ARM.
基于ARM9处理器S3C2410的LCD显示系统设计,ARM处理器,S3C2410,
TFT-LCD,显示控制
引言S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,其主频可达203MHz[1],适用于信息家电、PDA、手持设备、移动终端等领域,本文介绍了基于S3C2410的显示系统的硬件电路及驱动软件设计方法。
TFT-LCD模块的时序要求本显示模块选用的LQ080V3DG01是Sharp公司的TFT-LCD器件,该器件的分辨率为640×480,控制时序图如图1所示,时间参数如表1所列[2]。
引言
S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,其主频可达203MHz[1],适用于信息家电、PDA、手持设备、移动终端等领域,本文介绍了基于S3C2410的显示系统的硬件电路及驱动软件设计方法。
TFT-LCD模块的时序要求
本显示模块选用的LQ080V3DG01是Sharp公司的TFT-LCD器件,该器件的分辨率为640×480,控制时序图如图1所示,时间参数如表1所列[2]。
S3c2410 Linux下LCD驱动详解
S3c2410 Linux下LCD驱动详解一实验内容简要描述1.实验目的学会驱动程序的编写方法,配置S3C2410的LCD驱动,以及在LCD屏上显示包括bmp和jpeg两种格式的图片2.实验内容(1)分析S3c2410实验箱LCD以及LCD控制器的硬件原理,据此找出相应的硬件设置参数,参考xcale实验箱关于lcd的设置,完成s3c2410实验箱LCD的设置(2)在LCD上显示一张BMP图片或JPEG图片3.实验条件(软硬件环境)PC机、S3C2410开发板、PXA255开发板二实验原理1. S3C2410内置LCD控制器分析1.1 S3C2410 LCD控制器一块LCD屏显示图像,不但需要LCD驱动器,还需要有相应的LCD控制器。
通常LCD 驱动器会以COF/COG的形式与LCD 玻璃基板制作在一起,而LCD控制器则由外部电路来实现。
而S3C2410内部已经集成了LCD控制器,因此可以很方便地去控制各种类型的LCD屏,例如:STN和TFT屏。
S3C2410 LCD控制器的特性如下:(1)STN屏支持3种扫描方式:4bit单扫、4位双扫和8位单扫支持单色、4级灰度和16级灰度屏支持256色和4096色彩色STN屏(CSTN)支持分辩率为640*480、320*240、160*160以及其它规格的多种LCD(2)TFT屏支持单色、4级灰度、256色的调色板显示模式支持64K和16M色非调色板显示模式支持分辩率为640*480,320*240及其它多种规格的LCD对于控制TFT屏来说,除了要给它送视频资料(VD[23:0])以外,还有以下一些信号是必不可少的,分别是:VSYNC(VFRAME):帧同步信号HSYNC(VLINE):行同步信号VCLK :像数时钟信号VDEN(VM):数据有效标志信号由于本项目所用的S3C2410上的LCD是TFT屏,并且TFT屏将是今后应用的主流,因此接下来,重点围绕TFT屏的控制来进行。
Linux的LCD驱动源码分析及移植
Linux的LCD驱动源码分析及移植Linux的LCD驱动源码分析及移植(三部曲)第一部分:基于ARM9处理器的linux-2.6.32.2操作系统内核移植手记part5.1(LCD驱动源码分析及移植之platform device)1.与LCD控制器硬件相关的寄存器内容请参照三星S3C2440A技术手册中的第15章。
2. LCD Controller的平台设备定义如下(文件位于linux/arch/arm/plat-s3c24xx/devs.c):1./* LCD Controller */2.3.static struct resource s3c_lcd_resource[] = {4. [0] = {5. .start = S3C24XX_PA_LCD,6. .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,7. .flags = IORESOURCE_MEM,8. },9. [1] = {10. .start = IRQ_LCD,11. .end = IRQ_LCD,12. .flags = IORESOURCE_IRQ,13. }14.15.};16.17.static u64 s3c_device_lcd_dmamask = 0xffffffffUL;18.19.struct platform_device s3c_device_lcd = {20. .name = "s3c2410-lcd",21. .id = -1,22. .num_resources = ARRAY_SIZE(s3c_lcd_resource),23. .resource = s3c_lcd_resource,24. .dev = {25. .dma_mask = &s3c_device_lcd_dmamask,26. .coherent_dma_mask = 0xffffffffUL27. }28.};29.30.EXPORT_SYMBOL(s3c_device_lcd);平台设备的结构体定义为s3c_device_lcd,该设备在平台总线中的名字取为s3c2410-lcd,该平台设备申请的两个板级资源为以S3C24XX_PA_LCD为起始的IORESOURCE_MEM资源和一个定义为IRQ_LCD的IORESOURCE_IRQ资源。
ARMS3C2410驱动TFT-LCD的研究.
ARM S3C2410驱动TFT-LCD的研究技术分类:嵌入式系统 | 2008-03-07来源:电子开发网 | 作者:张义磊介绍了S3C2410的LCD控制器的数据和控制管脚,并给出了LCD的控制流程和TFT-LCD 的控制器设置规则。
参照TFT-LCD CJM10C0101的逻辑要求和时序要求设计了其驱动电路,设置了各主要LCD寄存器。
开发了CJM10C0101在嵌入式LINUX下的显示驱动程序,并在CJM10C0101上显示了清晰稳定的画面。
实验表明这套装置通用性好,能驱动大部分的TFT-LCD;可移植性强,经过少许修改即可应用在其他嵌入式系统中。
它是S3C2410驱动TFT-LCD的一套较佳的解决方案。
1 引言随着科技的发展,ARM在社会各个方面的应用越来越广。
S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,主频可达203MHz,适用于信息家电、SmartPhone、Tablet、手持设备、移动终端等领域。
其中,集成的LCD控制器具有通用性,可与大多数的LCD显示模块接口。
CJM10C0101是一种用非晶硅TFT作为开关器件的有源矩阵液晶显示器,该模块包括TFT-LCD显示屏!驱动电路和背光源,其接口为TTL电平。
分辨率为640×480像素,用18bit 数据信号能显示262144色。
6点视角是最佳视角。
在以三星ARM芯片S3C2410为核心,USB、UART、LCD、TOUCHPANEL等作为输入输出设备,FLASH和SDRAM作存储器,加上固化在FLASH里面的嵌入式LINUX组成的嵌入式系统中,我们致力于使此系统用本国生产的TFT-LCD作显示输出,因此研究设计了驱动CJM10C0101型26.4cm(10.4in)TFTLCD的硬件适配电路与嵌入式LINUX下的显示驱动程序。
2 S3C2410 LCD控制器介绍2.1 管脚S3C2410 LCD控制器用于传输视频数据和产生必要的控制信号,像VFRAME、VLINE、VCLK、VM等等。
S3C2410触摸屏驱动程序原理图
S3C2410触摸屏驱动程序原理图本文介绍了基于三星S3C2410X微处理器,采用SPI接口与ADS7843触摸屏控制器芯片完成触摸屏模块的设计。
具体包括在嵌入式Linux操作系统中的软件驱动开发,采用内核定时器的下半部机制进行了触摸屏硬件中断程序设计,采用16个时钟周期的坐标转换时序,实现触摸点数据采集的方法,给出了坐标采集的流程。
设计完成的触摸屏驱动程序在博创公司教学实验设备UP-NETARM2410-S平台上运行效果良好。
引言随着信息家电和通讯设备的普及,作为与用户交互的终端媒介,触摸屏在生活中得到广泛的应用。
如何在系统中集成触摸屏模块以及在嵌入式操作系统中实现其驱动程序,都成为嵌入式系统设计者需要考虑的问题。
本文主要介绍在三星S3C2410X微处理器的硬件平台上进行基于嵌入式Linux的触摸屏驱动程序设计。
硬件实现方案SPI接口是Motorola推出的一种同步串行接口,采用全双工、四线通信系统,S3C2410X是三星推出的自带触摸屏接口的ARM920T内核芯片,ADS7843为Burr-Brown生产的一款性能优异的触摸屏控制器。
本文采用SPI接口的触摸屏控制器ADS7843外接四线电阻式触摸屏,这种方式最显著的特点是响应速度更快、灵敏度更高,微处理器与触摸屏控制器间的通讯时间大大减少,提高了微处理器的效率。
ADS7843与S3C2410的硬件连接如图1所示,鉴于ADS7843差分工作模式的优点,在硬件电路中将其配置为差分模式。
图1触摸屏输入系统示意图嵌入式Linux系统下的驱动程序设备驱动程序是Linux内核的重要组成部分,控制了操作系统和硬件设备之间的交互。
Linux 的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,成为设备文件。
应用程序可以打开、关闭、读写这些设备文件,对设备的操作就像操作普通的数据文件一样简便。
为开发便利、提高效率,本设计采用可安装模块方式开发调试触摸屏驱动程序。
S3C2410内核移植实验报告
Kernel内核实验指导实验环境:宿主机:RHEL4(Linux vm-dev 2.6.9-42.ELsmp)目标机:博创经典S2410平台交叉编译器:arm-linux-gcc V3.4.1本次实验目录下存放着已经修改好的博创经典2410平台的内核源码包,将该源码包拷贝到宿主机LINUX系统中,解压至本次实验目录,配置编译生成内核uImage文件烧写到ARM设备中。
一、配置、编译内核1、建立kernel实验目录:[root@vm-dev ~]# mkdir kernel2、进入该实验目录,将kernel源码解压至该目录下:[root@vm-dev ~]# cd kernel/[root@vm-dev kernel]# lslinux-2.6.24.4.tar.bz2[root@vm-dev kernel]# tar -xjvf linux-2.6.24.4.tar.bz2[root@vm-dev kernel]# lslinux-2.6.24.4 linux-2.6.24.4.tar.bz23、进入解压后的目录linux-2.6.24.4,运行make menuconfig对内核进行配置:[root@vm-dev kernel]# cd linux-2.6.24.4[root@vm-dev linux-2.6.24.4]# make menuconfig3.1 配置系统硬件处理器:-> System Type-> S3C2410 Machines3.2 配置LCD驱动:-> Device Drivers-> Graphics support-> Support for frame buffer devices (FB [=y])配置系统启动LOGO:-> Device Drivers-> Graphics support-> Bootup logo (LOGO [=y])3.3 配置网卡驱动:-> Device Drivers-> Network device support (NETDEVICES [=y])-> Ethernet (10 or 100Mbit) (NET_ETHERNET [=y])3.4 配置文件系统支持:-> File systems-> Miscellaneous filesystemsNFS文件系统支持:-> File systems-> Network File Systems (NETWORK_FILESYSTEMS [=y])这样,内核的配置基本上就做好了。
LCD驱动程序之代码编写
LCD驱动程序之代码编写实现LCD驱动程序编写前⾯通过对linux内核中LCD的驱动框架进⾏了分析,弄清楚了内核中LCD的驱动框架,通过分析知道内核中已经在fbmem.c⽂件中注册了LCD这⼀类设备的字符设备驱动,向上实现了上层通⽤的访问接⼝,向下给驱动设计者预留了fb_info注册接⼝。
现在基于我们的开发板平台(JZ2240),编写适配于⾃⼰硬件的驱动程序从前⾯分析可以知道,编写LCD驱动需要驱动的编写者去完成以下内容(可参考内核中s3c2410fb.c):1)分配⼀个fb_info结构体2)根据使⽤LCD硬件特征,设置fb_info结构体的⼀些参数3)配置硬件相关操作4)注册fb_info结构体下⾯我们就开始按照这些步骤,完成LCD驱动程序的编写1、fb_info结构体介绍fb_info结构体是LCD驱动程序中最核⼼的数据结构,应⽤程序通过fbmem.c⽂件中注册的设备访问⼊⼝,找到打开设备⽂件的fb_info结构体,最终访问到硬件,fb_info结构体声明如下:struct fb_info {int node;int flags;struct fb_var_screeninfo var; /* Current var */struct fb_fix_screeninfo fix; /* Current fix */struct fb_monspecs monspecs; /* Current Monitor specs */struct work_struct queue; /* Framebuffer event queue */struct fb_pixmap pixmap; /* Image hardware mapper */struct fb_pixmap sprite; /* Cursor hardware mapper */struct fb_cmap cmap; /* Current cmap */struct list_head modelist; /* mode list */struct fb_videomode *mode; /* current mode */#ifdef CONFIG_FB_BACKLIGHT/* assigned backlight device *//* set before framebuffer registration,remove after unregister */struct backlight_device *bl_dev;/* Backlight level curve */struct mutex bl_curve_mutex;u8 bl_curve[FB_BACKLIGHT_LEVELS];#endif#ifdef CONFIG_FB_DEFERRED_IOstruct delayed_work deferred_work;struct fb_deferred_io *fbdefio;#endifstruct fb_ops *fbops;struct device *device; /* This is the parent */struct device *dev; /* This is this fb device */int class_flag; /* private sysfs flags */#ifdef CONFIG_FB_TILEBLITTINGstruct fb_tile_ops *tileops; /* Tile Blitting */#endifchar __iomem *screen_base; /* Virtual address */unsigned long screen_size; /* Amount of ioremapped VRAM or 0 */void *pseudo_palette; /* Fake palette of 16 colors */#define FBINFO_STATE_RUNNING 0#define FBINFO_STATE_SUSPENDED 1u32 state; /* Hardware state i.e suspend */void *fbcon_par; /* fbcon use-only private area *//* From here on everything is device dependent */void *par;};可以看到fb_info的结构体⽐较复杂,它的肯定是为了抽象出所有LCD硬件⽽设计的,但我们不需要去了解每⼀个成员变量的功能和使⽤⽅法。
24402410LCD显示屏驱动程序
24402410LCD显示屏驱动程序u-boot早就支持framebuffer了,不光显示图片,还可以把控制台重定向到lcd上,只是24x0部分缺代码罢了,需要填充一个结构体,可以从openmoko那里copy过来。
不过如果只是为了显示一张图片的话……初始化lcd控制器的代码随便放哪里运行都可以的吧!2440&2410 LCD显示屏驱动程序#include "config.h"// GPB1/TOUT1 for Backlight control(PWM)#define GPB1_TO_OUT() (rGPBUP &= 0xfffd, rGPBCON &= 0xfffffff3, rGPBCON |= 0x00000004)#define GPB1_TO_1() (rGPBDAT |= 0x0002)#define GPB1_TO_0() (rGPBDAT &= 0xfffd)//extern void Uart_Printf(char *f, ...) ;extern unsigned char __CHS[];extern unsigned char __VGA[];//volatile staticunsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];static void Lcd_PowerEnable(int invpwren,int pwren);static void Lcd_Init(void){rGPCUP = 0x00000000;rGPCCON = 0xaaaa02a9;// rGPDUP=0xffffffff; // Disable Pull-up registerrGPDUP = 0x00000000;rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]rLCDCON1=(CLKVAL_TFT << 8)|(MVAL_USED << 7)|(3 <<5 )|(12 << 1)|0;// TFT LCD panel,16bpp TFT,ENVID=offrLCDCON2=(VBPD << 24)|(LINEVAL_TFT << 14)|(VFPD << 6)|(VSPW); rLCDCON3=(HBPD << 19)|(HOZVAL_TFT << 8)|(HFPD);rLCDCON4=(MVAL << 8)|(HSPW);#if(LCD_TYPE == PT035)rLCDCON5 = (1 << 11) | (1 << 10) | (0 << 9) | (0 << 8) | (1 << 7) | (1 << 6)| (1 << 3) |(BSWP << 1) | (HWSWP);#elif(LCD_TYPE == WD_F3224)rLCDCON5 = (1 << 11) | (1 << 10) | (0 << 9) | (0 << 8) | (0 << 7) | (0 << 6)| (1 << 3) |(0 << 1) | (HWSWP);#elif(LCD_TYPE == TX11D)rLCDCON5 = (1 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (0 << 7) | (0<< 6)| (1 << 3) | (1 << 2) | (BSWP << 1) | (HWSWP);#endifrLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)L CD_BUFFER>>1);rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT * LCD_YSIZE_TFT * 2)) >> 1 );rLCDSADDR3=(((SCR_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11)|(LCD_XSIZE_TFT / 1);rLCDINTMSK|=(3); // MASK LCD Sub InterruptrTCONSEL &= (~7) ; // Disable LPC3480rTPAL=0; // Disable Temp Palette}static void Lcd_EnvidOnOff(int onoff){if(onoff == 1)rLCDCON1 |= 1; // ENVID=ONelserLCDCON1 = rLCDCON1 & 0x3fffe; // ENVID Off}static void Lcd_PowerEnable(int invpwren,int pwren){//GPG4 is setted as LCD_PWRENrGPGUP = rGPGUP & ( ~(1 << 4)) |(1 << 4); // Pull-up disable rGPGCON = rGPGCON & ( ~(3 << 8)) |(3 << 8); //GPG4=LCD_PWREN rGPGDAT = rGPGDAT | (1 << 4) ;// invpwren=pwren;//Enable LCD POWER ENABLE FunctionrLCDCON5 = rLCDCON5 & ( ~(1 << 3)) |(pwren << 3); // PWRENrLCDCON5 = rLCDCON5 & ( ~(1 << 5)) |(invpwren << 5); // INVPWREN}static void Lcd_MoveViewPort(int vx, int vy){U32 addr;SET_IF();#if (LCD_XSIZE_TFT < 32)while((rLCDCON1 >> 18) <= 1); // if x<32#elsewhile((rLCDCON1 >> 18) == 0); // if x>32#endifaddr = (U32)LCD_BUFFER + (vx * 2) + vy * (SCR_XSIZE_TFT * 2);rLCDSADDR1 = ( (addr >> 22) << 21 ) | M5D(addr >> 1);rLCDSADDR2 = M5D(((addr + (SCR_XSIZE_TFT * LCD_YSIZE_TFT * 2)) >> 1)); CLR_IF();}static void MoveViewPort(void){int vx=0,vy=0,vd=1;Uart_Printf("\n*Move the LCD view windos:\n");Uart_Printf(" press 8 is up\n");Uart_Printf(" press 2 is down\n");Uart_Printf(" press 4 is left\n");Uart_Printf(" press 6 is right\n");Uart_Printf(" press Enter to exit!\n");while(1){switch( Uart_GetKey() ){case '8':if(vy>=vd)vy-=vd;Uart_Printf("vx==,vy==\n",vx,vy);Lcd_MoveViewPort(vx,vy);break;case '4':if(vx>=vd)vx-=vd;Uart_Printf("vx==,vy==\n",vx,vy);Lcd_MoveViewPort(vx,vy);break;case '6':if(vx<=(SCR_XSIZE_TFT - LCD_XSIZE_TFT -vd))vx += vd;Uart_Printf("vx==,vy==\n",vx,vy);Lcd_MoveViewPort(vx,vy);break;case '2':if(vy<=(SCR_YSIZE_TFT - LCD_YSIZE_TFT -vd))vy += vd;Uart_Printf("vx==,vy==\n",vx,vy);Lcd_MoveViewPort(vx,vy);break;case '\r':return;default:break;}//Uart_Printf("vx==,vy==\n",vx,vy);//Lcd_MoveViewPort(vx,vy);}}void PutPixel(U32 x,U32 y, U16 c ){if ( (x < SCR_XSIZE_TFT) && (y < SCR_YSIZE_TFT) ) LCD_BUFFER[(y)][(x)] = c;}void GUI_Point(U32 x,U32 y, U16 c ){if ( (x < SCR_XSIZE_TFT) && (y < SCR_YSIZE_TFT) ) LCD_BUFFER[(y)][(x)] = c;}void Lcd_ClearScr( U16 c){unsigned int x,y ;for( y = 0 ; y < SCR_YSIZE_TFT ; y++ ){for( x = 0 ; x < SCR_XSIZE_TFT ; x++ ){LCD_BUFFER[y][x] = c ;}}}void Glib_Line(int x1,int y1,int x2,int y2,int color) { int dx,dy,e;dx = x2 -x1;dy = y2 -y1;if(dx >= 0){if(dy >= 0) // dy>=0{if(dx>=dy) // 1/8 octant{e=dy-dx/2;while(x1<=x2){PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1+=1; e+=dy;}}else // 2/8 octant{e=dx-dy/2;while(y1<=y2){PutPixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1+=1; e+=dx;}}}else // dy<0{dy=-dy; // dy=abs(dy)if(dx>=dy) // 8/8 octant {e=dy-dx/2;while(x1<=x2){PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1+=1; e+=dy;}}else // 7/8 octant{e=dx-dy/2;while(y1>=y2){PutPixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1-=1; e+=dx;}}}else //dx<0{dx=-dx; //dx=abs(dx)if(dy >= 0) // dy>=0 {if(dx>=dy) // 4/8 octant {e=dy-dx/2;while(x1>=x2){PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1-=1; e+=dy;}}else // 3/8 octant{e=dx-dy/2;while(y1<=y2){PutPixel(x1,y1,color); if(e>0){x1-=1;e-=dy;} y1+=1; e+=dx;}}}else // dy<0{dy=-dy; // dy=abs(dy)if(dx>=dy) // 5/8 octant {e=dy-dx/2;while(x1>=x2){PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1-=1; e+=dy;}}else // 6/8 octante=dx-dy/2;while(y1>=y2){PutPixel(x1,y1,color);if(e>0){x1-=1;e-=dy;}y1-=1;e+=dx;}}}}}void Glib_Rectangle(int x1,int y1,int x2,int y2,int color){Glib_Line(x1,y1,x2,y1,color);Glib_Line(x2,y1,x2,y2,color);Glib_Line(x1,y2,x2,y2,color);Glib_Line(x1,y1,x1,y2,color);}void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color) { int i;for(i=y1;i<=y2;i++)Glib_Line(x1,i,x2,i,color);}void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[]) { int x,y;U32 c;int p = 0;for( y = y0 ; y < l ; y++ ){for( x = x0 ; x < h ; x++ ){c = bmp[p+1] | (bmp[p]<<8) ;if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) ) LCD_BUFFER[y0+y][x0+x] = c ;p = p + 2 ;}}#if 1void Lcd_PutASCII(unsigned int x,unsigned int y,unsigned char ch,unsigned int c,unsigned int bk_c,unsigned int st) {unsigned short int i,j;unsigned char *pZK,mask,buf;pZK = &__VGA[ch*16];for( i = 0 ; i < 16 ; i++ ){mask = 0x80;buf = pZK[i];for( j = 0 ; j < 8 ; j++ ){if( buf & mask ){PutPixel(x+j,y+i,c);}else{if( !st ){PutPixel(x+j,y+i,bk_c);}}mask = mask >> 1;}}}void Lcd_PutHZ(unsigned int x,unsigned int y,unsigned short int QW,unsigned int c,unsigned int bk_c,unsigned int st) {unsigned short int i,j;unsigned char *pZK,mask,buf;pZK = &__CHS[ ( ( (QW >> 8) - 1 )*94 + (QW & 0x00FF)- 1 )*32 ]; for( i = 0 ; i < 16 ; i++ ){//左mask = 0x80;buf = pZK[i*2];for( j = 0 ; j < 8 ; j++ ){if( buf & mask ){PutPixel(x+j,y+i,c);}else{if( !st ){PutPixel(x+j,y+i,bk_c);}}mask = mask >> 1;}//右mask = 0x80;buf = pZK[i*2 + 1];for( j = 0 ; j < 8 ; j++ ){if( buf & mask ){PutPixel(x+j + 8,y+i,c);}else{if( !st ){PutPixel(x+j + 8,y+i,bk_c);}}mask = mask >> 1;}}}//----------------------void Lcd_printf(unsigned int x,unsigned int y,unsigned int c,unsigned int bk_c,unsigned int st,char *fmt,...){char __LCD_Printf_Buf[256];va_list ap;unsigned char *pStr = (unsigned char *)__LCD_Printf_Buf;unsigned int i = 0;va_start(ap,fmt);vsprintf(__LCD_Printf_Buf,fmt,ap);va_end(ap);while(*pStr != 0 ){switch(*pStr){case '\n' :{break;}default:{if( *pStr > 0xA0 & *(pStr+1) > 0xA0 ) //中文输出{Lcd_PutHZ( x , y , (*pStr - 0xA0)*0x0100 + *(pStr+1) - 0xA0 , c , bk_c , st);pStr++;i++;x += 16;}else //英文输出{Lcd_PutASCII( x , y , *pStr , c , bk_c , st );x += 8;}break;}}pStr++;i++;if( i > 256 ) break;}}#endifvoid Lcd_Display(void){Lcd_Init();Lcd_PowerEnable(0, 1);Lcd_EnvidOnOff(1);Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) ); #if((LCD_TYPE == PT035)||(LCD_TYPE == WD_F3224)) Paint_Bmp(0, 0, 320, 240, phone);#elif(LCD_TYPE == TX11D)Paint_Bmp(0, 0, 480, 272, LCD43_ucos);#endif}。
LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码
LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码LCD字模显示程序如何设计?系统中显示部分的子程序与字模数据结构互相关联,这里将ASCII字符显示子程序和单独显示汉字字模的子程序列出来,根据这两个子程序也可以看出显示部分的显示程序实现原理。
在这个子程序中,x指的是汉字行,只能是0~3共4行;y指的是半角字符列,只能是0~15共16列,因而可以在屏幕任何一个半角字符位置上显示一个ASCII半角字符。
在处理汉字时是将汉字当作两个半角字符来处理的,显示时将一个汉字分左上、左下、右上、右下4个部分顺序显示出来,从下面的显示汉字字模子程序中可以看出这一点。
从程序中可以看出,当j=0时写的是第工个汉字的左上和左下,然后在j的循环过程中依次显示的是第一个汉字的右上、右下,第二个汉字的左上、左下,第二个汉字的右上、右下。
实际上LCD的起始页,表示起始显示的8行,也就是表示一个半角字符的上半部分。
这就是显示部分汉字的显示过程。
S3C2410 LCD 驱动程序移植及GUI程序编写:1. 为了不让大家觉枯燥,让朋友们更好的理解,我以一个实例来叙述S3C2410 下一个驱动程序的编写(本文的初始化源码以华恒公司提供的s3c2410fb.c 为基础)及简单的GUI程序的编写。
2. 拿到一块LCD,首先要将LCD的各个控制线与S3C2410 的LCD控制信号相接,当然,电源也一定要接入了,否则不亮可别找我。
另外需要注意以下几点:1)背光:对于大部分的彩色LCD一定要接背光,我们才能看到屏上的内容;2)控制信号:不同的LCD 厂商对于控制信号有不同的叫法,S3C2410 芯片手册也给出了一个信号的多个名称(图一),这就要看你们硬件工程师的功底了,图一S3C2410 手册上给出的控制信号的名称及解释这里我做一个简单的介绍:VFRAME:LCD 控制器和LCD 驱动器之间的帧同步信号。
该信号告诉LCD屏的新的一帧开始了。
2410 移植 LCD 驱动Linux
2410 移植LCD 驱动主机:ubuntu 8.10 x86_64交叉编译器:/usr/local/ar m/3.3.2/bin/ar m-linux-内核:2.6.22.6LCD:SUMSANG 的L TV350QV_FOE 3.5 寸 240x320一点LCD 的知识:LCDTFT LCD 电信号部件组成:主要由背光电路和显示电路组成。
背光电路: 3.5 寸TFT LCD 背光,大都采用白光LED 作为背光源,一般由 6 个串连的白光 LED 组成(如下图),驱动电压大概20V 左右,20m A 电流左右,是一个耗电量很大的部件。
对于电池供电系统,大都采用升压型DC/DC 进行驱动,很多厂家都有推出专门针对串连白光 LED 的驱动器。
显示电路:显示电路一般由Timing Controller、Sourc e Driver、Gate Driver 组成。
有的IC 把 Timing Controller 和Sourc e Driver 集成在一起了,也有的 IC 把三个部分都集成了。
这三部分电路一般都集成在TFT LCD 模组里面了,也有的 TFT LCD 把 Tim ing Controller IC 放到外面了(如SHARP 的一些 LCD)。
SAMSUNG L TV350QV 的DRIVE R IC 是S6F2002,S6F2002 集成了Tim ing Controller、Sourc e Driver、Gate Driver 部分和电源管理部分,164RGB X 240 驱动能力,所以对于 320 X 240 QVGA 的分辨率,需要两片S6F2002。
两片S6F2002,一片作为主控制器,一片作为从控制器,正是由于LVT350QV 是有两片DRIVE R IC 驱动的缘故,如果上电时序配合不好,很容易出现显示异常(一半显示不正常,一半显示正常)。
更多的内容见http://bbs.21ic.c om/upfiles/img/200686154229590.pdf这个LTV350QV 比较特殊的是,它的初始化需要通过 spi 总线写S6F2002 内部的寄存器,有人说,LTV350QV 比较麻烦的一点是还必须要进行 SPI 设置,但这也是它比较灵活的一面。
三星S3C2410芯片内部集成的LCD驱动控制器滚动屏幕的实现
三星S3C2410芯片内部集成的LCD驱动控制器滚动屏幕的实现S3C2410X 支持硬件方式的水平和垂直滚屏。
要实现滚屏,可修改LCDSADDR1和LCDSADDR2寄存器中的LCDBASEU和LCDBASEL的值(如图所示)。
但不是通过修改PAGEWIDTH和OFFSIZE来实现。
对于STN类型的LCD,VFRAME和VLINE脉冲的产生取决于于LCDCON2/3寄存器中的HOZV AL和LINEV AL的配置,它们都与LCD屏的大小和显示模式有关。
换句话说,HOZV AL和LINEV AL可由LCD屏与显示模式决定,公式如下:HOZV AL = (水平显示尺寸/有效VD数据队列数)-1彩色显示模式下:水平显示尺寸=3 * 水平像素数在4位但扫描模式下,有效VD数据队列数应为4。
若用4位双扫描模式显示,有效的VD数据队列数也是4,但在8位但扫描模式下,有效的VD数据队列数应为8.单扫描情况:LINEV AL = (垂直显示尺寸)-1双扫描情况:LINEV AL = (垂直显示尺寸/2)-1LCDBASEU:对双扫描LCD:这些位只是帧缓冲区或在双扫描LCD时的上帧缓冲区的开始地址A[21:1]对单扫描LCD:这些位只是帧缓冲区的开始地址A[21:1]LCDBASEL:对双扫描LCD:这些位只是在使用双扫描LCD时的下帧存储区的开始地址A[21:1]对单扫描LCD:这些位只是帧存储区的末地址[21:1]LCDBASEL=((the frame end address)>>1)+1=LCDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEV AL+1)注意:当LCD 控制器启用时,用户可通过改变LCDBSEU和LCDBASEL的值实现滚屏。
但是,在一帧结束时,LCDBASEU和LCDBASEL的值务必不能改变,可参考LCDCON1寄存器中的LINECNT域,因为LCD屏的显示也会出现错误。
实验4 S3C2410 LCD的驱动控制实验
实验4 S3C2410 LCD的驱动控制实验一、实验目的1.学习LCD与ARM的LCD的控制器的接口原理;2.掌握内置LCD控制器驱动编写方法;3.学习调用简单的GUI绘图。
二、实验设备硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。
软件:PC 机操作系统REDHAT LINUX 9.0+超级终端(或X-shell)+ARM-LINUX 开发环境。
三、预备知识学习LCD 显示器的基本原理,理解其驱动控制方法。
掌握两种LCD 驱动方式的基本原理和方法。
并用编程实现:1.用总线方式直接驱动带有驱动模块的LCD。
2.用ARM 内置的LCD 控制器来驱动LCD。
四、实验原理1.LCD(Liquid Crystal Display)原理液晶得名于其物理特性:它的分子晶体,以液态存在而非固态。
这些晶体分子的液体特性使得它具有两种非常有用的特点:1、如果让电流通过液晶层,这些分子将会以电流的流向方向进行排列,如果没有电流,它们将会彼此平行排列。
2、如果提供了带有细小沟槽的外层,将液晶倒入后,液晶分子会顺着槽排列,并且内层与外层以同样的方式进行排列。
液晶的第三个特性是很神奇的:液晶层能使光线发生扭转。
液晶层表现的有些类似偏光器,这就意味着它能够过滤除了那些从特殊方向射入之外的所有光线。
此外,如果液晶层发生了扭转,光线将会随之扭转,以不同的方向从另外一个面中射出。
液晶的这些特点使得它可以被用来当作一种开关——即可以阻碍光线,也可以允许光线通过。
液晶单元的底层是由细小的脊构成的,这些脊的作用是让分子呈平行排列。
上表面也是如此,在这两侧之间的分子平行排列,不过当上下两个表面之间呈一定的角度时,液晶随着两个不同方向的表面进行排列,就会发生扭曲。
结果便是这个扭曲的螺旋层使通过的光线也发生扭曲。
如果电流通过液晶,所有的分子将会按照电流的方向进行排列,这样就会消除光线的扭转。
嵌入式s3c2410下MiniGUI移植与实现
工 业 技 术DOI:10.16661/ki.1672-3791.2019.10.053嵌入式s3c2410下MiniGUI移植与实现蒋若鸿(桂林优利特医疗电子有限公司 广西桂林 541004)摘 要:当前嵌入式系统被广泛应用于工业领域和家用领域,且随着嵌入式系统的不断发展,用户对嵌入式系统的要求也越来越高,因此实现与用户交流功能的嵌入式GUI成为嵌入式研究领域中的一个重点。
该文详细描述了MiniGUI系统基于s3c2410开发板的移植与实现,内容包括交叉编译环境的建立、MiniGUI编译选项的配置和修改、启动项参数的设置以及交叉编译MiniGUI应用程序等。
关键词:s3c2410 MiniGUI 移植中图分类号:TP273 文献标识码:A 文章编号:1672-3791(2019)04(a)-0053-02MiniGUI是目前比较常见的几种GUI系统之一,与其他的GUI相比,MiniGUI最显著的特点是:(1)小巧轻型、占用资源少,稳定性高,可移植性好。
(2)拥有丰富的控件资源,包括静态框控件、按钮控件、编辑框控件、列表框控件、进度条控件、滑块控件、组合框控件、工具栏控件等。
(3)支持拼音输入法和五笔输入法。
(4)支持消息传递机制。
(5)支持JPG、PNG和BMP等图像文件。
1 MiniGUI的移植Samsung公司的s3c2410开发板,平台硬件系统为64MB Nandflash、2MB Norflash、64MB SDRAM。
s3c2410开发板通过USB口、串口、网口与宿主机通信,图形图像处理通过LCD显示。
把MiniGUI移植到s3c2410开发板的步骤:(1)安装交叉编译器和设置交叉编译器环境;(2)使用编译器CC对MiniGUI进行交叉编译,获得可在s3c2410上运行的库;(3)在s3c2410开发板的文件系统中添加交叉编译的MiniGUI 库;(4)编译MiniGUI可执行程序,并下载到s3c2410开发板上。
Linux移植到S3C2410(nano2410)之LCD
Linux 2.6.24.4移植到S3C2410(nano2410)之:LCD【平台信息】目标板(Nano2410)------------------------CPU: S3C2410XSDRAM: HY57V561620(32MB)FLASH: K9F1208(64MB)NET: CS8900HOST---------------------------------------Linux Realse Version: Fecora Cor 8 (FC8)CrossCompiler: gcc-4.1.1/glibc-2.3.2从启动信息可以看出没有加载成功LCD驱动io scheduler cfq registereds3c2410-lcd s3c2410-lcd: no platform data for lcd, cannot attachs3c2410-lcd: probe of s3c2410-lcd failed with error -22 lp: driver loaded but no devices foundLCD为三星的3.5寸TFT屏. 分辨率320x240内核代码修改步骤:1.修改文件/linux2.6.24.4/arch/arm/mach-s3c2410/mach-smdk2410.c加入头文件#include <asm/arch/fb.h>添加代码static struct s3c2410fb_display nano2410_lcd_cfg[] __initdata = {{/* Config for 240x320 LCD */.lcdcon5 = S3C2410_LCDCON5_FRM565 |S3C2410_LCDCON5_INVVLINE |S3C2410_LCDCON5_INVVFRAME |S3C2410_LCDCON5_PWREN |S3C2410_LCDCON5_HWSWP,.type = S3C2410_LCDCON1_TFT,.width = 320,.height = 240,.pixclock = 100000, /* HCLK/10 */.xres = 320,.yres = 240,.bpp = 16,.left_margin = 16,.right_margin = 6,.hsync_len = 9,.upper_margin = 4,.lower_margin = 6,.vsync_len = 16,}};static struct s3c2410fb_mach_info nano2410_fb_info __initdata = { .displays = nano2410_lcd_cfg,.num_displays = ARRAY_SIZE(nano2410_lcd_cfg),.default_display = 0,.gpccon = 0xaa955699,.gpccon_mask = 0xffc003cc,.gpcup = 0x0000ffff,.gpcup_mask = 0xffffffff,.gpdcon = 0xaa95aaa1,.gpdcon_mask = 0xffc0fff0,.gpdup = 0x0000faff,.gpdup_mask = 0xffffffff,.lpcsel = ((0xCE6) & ~7) | 1<<4,};在函数smdk2410_init()中加入s3c24xx_fb_set_platdata(&nano2410_fb_info);在内核配置时,启用graphic device里面的frambuffer.并打开boot logo重新编译内核,看看启动信息……io scheduler cfq registeredConsole: switching to colour frame buffer device 30x40fb0: s3c2410fb frame buffer device……同时可以看到LCD上出现了一只可爱的小企鹅~~~在uboot中设置boot command中的console=tty .可以讲启动信息在LCD上显示.。
S3C2410TFT-LCD显示的驱动程序设计
S3C2410TFT-LCD显示的驱动程序设计
陆二庆;栗方;赵荣阳
【期刊名称】《电脑开发与应用》
【年(卷),期】2009(22)3
【摘要】系统地介绍了S3C2410微处理器内置的LCD控制器功能与结构,TFT型彩色LCD显示的基本工作原理,LCD显示屏与微处理器的连接,通过编写S3C2410的LCD端口初始化及LCD初始化驱动程序,实现了LCD清晰稳定的显示.为汽车行驶记录仪中人机界面设计提供了很好的解决方案.
【总页数】3页(P24-26)
【作者】陆二庆;栗方;赵荣阳
【作者单位】桂林工学院,广西桂林,541004;桂林工学院,广西桂林,541004;桂林工学院,广西桂林,541004
【正文语种】中文
【中图分类】TP302.1
【相关文献】
1.一种WindML双屏显示驱动程序设计方法 [J], 肖峰;窦强;霍家道
2.基于ARM9的触摸屏驱动开发及LCD显示程序设计 [J], 庄育锋;蔡坤;张墨;郭磊
3.XENIX驱动程序设计及高分辨大屏幕显示开发 [J], 陈少林;罗建国
4.基于NiosⅡ处理器的液晶显示接口及驱动程序设计 [J], 宋泽琳;郑恩让;马令坤
5.LCD显示模块并行接口驱动程序设计 [J], 张芝贤;王明贺;张正吉;邱伟华;刘筠筠
因版权原因,仅展示原文概要,查看原文内容请购买。
s3c2440 LCD控制器原理与编程
一行时间宽度
=(HSPW+1)+(HBPD+1)+(HOZVAL+1)+(HFPD+1);
此处数值以像素时间宽度为单位(VCLK信号的周期)
16.22
TFT LCD控制器操作
VCLK 的速率取决于寄存器LCDCON1 中CLKVAL 的值 VCLK(Hz) = HCLK/[(CLKVAL+1)x2](像素频率) 帧频即为VSYNC信号的频率 帧频与控制寄存器LCDCON1及LCDCON2/3/4 中的VSYNC、
160×160等
最大虚拟屏幕占内存大小为4M字节 64K色模式下最大虚拟屏幕大小:2048×1024等
16.10
S3C2410 LCD控制器功能与结构
LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS和
LPC3600组成,其结构框图如下:
S3C2410 LCD控制器结构框图
16.11
S3C2410 LCD控制器功能与结构
REGBANK由17个可编程的寄存器组和一块256*16的调色
板内存组成,它们用来配置LCD控制器的;
LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的
视频数据传送到LCD驱动器,通过使用这个DMA通道,视 频数据在不需要CPU的干预的情况下显示在LCD屏上;
F:同样的,在帧与帧切换之间也是需要一定的时间的,
我们称之为帧切换,那么LCD整个显示的过程在时间线上 看,就可表示为时序图上的VSYNC。
16.21
TFT LCD控制器操作
一帧时间宽度
=(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1);
s3c2440LCD控制器设置及代码详解
s3c2440LCD控制器设置及代码详解要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD操纵器。
在通常情形下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD操纵器则是由外部的电路来实现,现在专门多的MCU内部都集成了LCD操纵器,如S3C2410/2440等。
通过LCD操纵器就能够产生LCD驱动器所需要的操纵信号来操纵STN/TFT屏了。
2. S3C2440内部LCD操纵器结构图:我们依照数据手册来描述一下那个集成在S3C2440内部的LCD操纵器:a:LCD操纵器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成;b:REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD操纵器的;c:LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD 驱动器,通过使用那个DMA通道,视频数据在不需要CPU的干预的情形下显示在LCD屏上;d:VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD 驱动器;e:TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的操纵信号,比如VSYNC、HSYNC、VCLK和LEND等等,而这些操纵信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置紧密相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形状,从而支持不同的LCD驱动器(即不同的STN/TFT屏)。
3. 常见TFT屏工作时序分析:LCD提供的外部接口信号:VSYNC/VFRAME/STV:垂直同步信号(TFT)/帧同步信号(STN)/SEC TFT信号; HSYNC/VLINE/CPV:水平同步信号(TFT)/行同步脉冲信号(STN)/SEC TFT信号;VCLK/LCD_HCLK:象素时钟信号(TFT/STN)/SEC TFT信号;VD[23:0]:LCD像素数据输出端口(TFT/STN/SEC TFT);VDEN/VM/TP:数据使能信号(TFT)/LCD驱动交流偏置信号(STN)/SEC TFT 信号;LEND/STH:行终止信号(TFT)/SEC TFT信号;LCD_LPCOE:SEC TFT OE信号;LCD_LPCREV:SEC TFT REV信号;LCD_LPCREVB:SEC TFT REVB信号。
S3C2440uboot2010.06LCD驱动移植手册
S3C2440uboot2010.06LCD驱动移植手册十四、添加LCD驱动和LOGO制作1、在drivers/video目录中新增s3c2440_fb.c,代码如下:#include#if defined(CONFIG_VIDEO_S3C2440)#include#include "videomodes.h"#include#include/** Export Graphic Device*/GraphicDevice smi;#define VIDEO_MEM_SIZE 0x200000#define MVAL (0)#define MVAL_USED (0) //0=each frame 1=rate by MVAL#define INVVDEN (1) //0=normal 1=inverted#define BSWP (0) //Byte swap control#define HWSWP (1) //Half word swap control#define VBPD (12)#define VFPD (4)#define VSPW (10)#define HBPD (43)#define HFPD (8)#define HSPW (1)#define CLKVAL_TFT (4)void lcd_enable(void){struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();gpio->GPGUP = gpio->GPGUP & ((~(1 << 4)) | (1 << 4));gpio->GPGCON = gpio->GPGCON & ((~( 3 << 8)) | ( 3 << 8));gpio->GPGDAT = gpio->GPGDAT | (1 << 4 );lcd->LCDCON5 = lcd->LCDCON5 & ((~( 1 << 3)) | (1 << 3)); // PWREN lcd->LCDCON5 = lcd->LCDCON5 & ((~( 1 << 5)) | (0 << 5)); // INVPWREN lcd->LCDCON1 |= 1;gpio->GPBUP = gpio->GPBUP & ((~(1 << 1)) | (1 << 1));gpio->GPBCON = gpio->GPBCON & ((~( 3 << 2)) | ( 3 << 2));gpio->GPBDAT = gpio->GPBDAT | (1 << 1 );/************************************************************** ******************* Init video chip with common Linux graphic modes (lilo)*/void *video_hw_init (void){struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();GraphicDevice *pGD = (GraphicDevice *)&smiint videomode;int bppmode;unsigned long t1, hsynch, vsynch;char *penv;int tmp, i, bits_per_pixel;struct ctfb_res_modes *res_mode;struct ctfb_res_modes var_mode;tmp = 0;videomode = CONFIG_SYS_DEFAULT_VIDEO_MODE;/* get video mode via environment */if ((penv = getenv ("videomode")) != NULL) {/* deceide if it is a string */if (penv[0] <= '9') {videomode = (int) simple_strtoul (penv, NULL, 16);tmp = 1;}}else{tmp = 1;}if (tmp) {/* parameter are vesa modes *//* search params */for (i = 0; i < VESA_MODES_COUNT; i++) {if (vesa_modes[i].vesanr == videomode)break;}if (i == VESA_MODES_COUNT) {printf ("no VESA Mode found, switching to mode 0x%x ", CONFIG_SYS_DEFAULT_VIDEO_MODE);i = 0;res_mode = (struct ctfb_res_modes *) &res_mode_init[vesa_modes[i].resindex];bits_per_pixel = vesa_modes[i].bits_per_pixel;}else{res_mode = (struct ctfb_res_modes *) &var_mode;bits_per_pixel = video_get_params (res_mode, penv);}/* calculate hsynch and vsynch freq (info only) */t1 = (res_mode->left_margin + res_mode->xres + res_mode->right_margin + res_mode->hsync_le n) / 8;t1 *= 8;t1 *= res_mode->pixclock;t1 /= 1000;hsynch = 1000000000L / t1;t1 *= (res_mode->upper_margin + res_mode->yres + res_mode->lower_margin + res_mode->vsy nc_len);t1 /= 1000;vsynch = 1000000000L / t1;/* fill in Graphic device struct */sprintf (pGD->modeIdent, "%dx%dx%d %ldkHz %ldHz", res_mode->xres, res_mode->yres, bits_pe r_pixel, (hsynch / 1000), (vsynch / 1000));pGD->winSizeX = res_mode->xres;pGD->winSizeY = res_mode->yres;pGD->plnSizeX = res_mode->xres;pGD->plnSizeY = res_mode->yres;switch (bits_per_pixel){case 8:pGD->gdfBytesPP = 1;pGD->gdfIndex = GDF__8BIT_INDEX;bppmode = 11;break;case 16:pGD->gdfBytesPP = 2;pGD->gdfIndex = GDF_16BIT_565RGB;bppmode = 12;break;case 24:pGD->gdfBytesPP = 3;pGD->gdfIndex = GDF_24BIT_888RGB;bppmode = 13;break;}pGD->frameAdrs = LCD_VIDEO_ADDR;pGD->memSize = VIDEO_MEM_SIZE;lcd->LCDCON1 = (CLKVAL_TFT << 8) | (MVAL_USED << 7) | (3 << 5) | (bppmode << 1) | 0;lcd->LCDCON2 = (VBPD << 24) | (pGD->winSizeY-1 << 14) | (VFPD << 6) | (VSPW);lcd->LCDCON3 = (HBPD << 19) | (pGD->winSizeX-1 << 8) | (HFPD);lcd->LCDCON4 = (MVAL << 8) | (HSPW);lcd->LCDCON5 = (1 << 11) | (0 << 10) | (1 << 9) | (1 << 8) | (0 << 7) | (0 << 6) | (1 << 3) | (BSWP < < 1) | (HWSWP);lcd->LCDINTMSK |= (3);lcd->LPCSEL &= (~7);lcd->TPAL = 0x0;writel((pGD->frameAdrs >> 1), &lcd->LCDSADDR1);/* This marks the end of the frame buffer. */writel((((readl(&lcd->LCDSADDR1))&0x1fffff) + (pGD->winSizeX+0) *pGD->winSizeY), &lcd->LCDSA DDR2);writel((pGD->winSizeX & 0x7ff), &lcd->LCDSADDR3);/* Clear video memory */memset((void *)pGD->frameAdrs, 0, pGD->memSize);lcd_enable();return ((void*)&smi);}void video_set_lut (unsigned int index,/* color number */unsigned char r, /* red */unsigned char g, /* green */unsigned char b /* blue */){}#endif /* CONFIG_VIDEO_S3C2440 */修改video目录下Makefile文件COBJS-$(CONFIG_VIDEO_VCXK) += bus_vcxk.oCOBJS-$(CONFIG_VIDEO_S3C24X0) += s3c24x0_fb.o videomodes.o cfb_console.o COBJS := $(COBJS-y)2、修改include/configs/SMDK2440.h,添加下面的宏定义/* LCD settings */#define CONFIG_VIDEO#define CONFIG_VIDEO_S3C2440#define CONFIG_VIDEO_LOGO#define CONFIG_VIDEO_BMP_LOGO#define VIDEO_FB_16BPP_WORD_SWAP#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (800*480+1024+100)#define LCD_VIDEO_ADDR 0x33d00000#define CONFIG_CMD_BMP#define CONFIG_CFB_CONSOLE#define CONFIG_SYS_CONSOLE_INFO_QUIET/* for PC-keyboard */#define VIDEO_KBD_INIT_FCT 0#define VIDEO_TSTC_FCT serial_tstc#define VIDEO_GETC_FCT serial_getc3、修改drivers/video/videomodes.c{0x31A, RES_MODE_1280x1024, 16},{0x31B, RES_MODE_1280x1024, 24},{0x213, RES_MODE_800x480, 16},};RES_MODE_800x480前的数据0x213与前面的不同即可。
基于S3C2410触摸屏驱动程序设计
网络信息工程2021.10基于S3C2410触摸屏驱动程序设计张鹏(汉中职业技术学院汽车与机电工程学院,陕西汉中,723002)摘要:本文所设计的基于S3C2410触摸屏驱动程序,利用ADS软件配置,其中程序中包含了触摸屏初始化模块、AD转换和采样数据处理模块等等,实现驱动触摸屏的目的。
关键词:S3C2410;ADS;触摸屏;嵌入式Design of touch screen driver based on S3C2410Zhang Peng(School of Automobile and Mechanical and Electrical Engineering,Hanzhong Vocation&l and Technical College,Hanzhong Shaanxi,723002)Abstrac t:The touch screen driver based on S3C2410is designed in this paper,which is configured by ADS software.The program includes touch screen initialization module,AD conversion and sampling data processing module,etc.to achieve the purpose of driving the touch screen.Keywords;S3C2410;ads;touch screen;embedded1S3C2410触摸屏设备及原理介绍触摸屏(touch screen)又称为触控屏或触控板,是一种便于接收触头等输入信号的感应式液晶显示设备,当接触到液晶显示屏幕时,屏幕上的触觉信号反馈系统就会根据预先编写的算法程序驱动各种外接设备,用以代替常规机械式的手动按钮面板,同时,借用液晶显示画面显示出形象生动的视觉效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S3C2410下LCD驱动程序移植及GUI程序编写Write by llg 著作权所有:刘利国如转载请告知作者 laoliu@ 并注明出处 1.为了不让大家觉枯燥,让朋友们更好的理解,我以一个实例来叙述S3C2410下一个驱动程序的编写(本文的初始化源码以华恒公司提供的s3c2410fb.c为基础)及简单的GUI 程序的编写。
2.拿到一块LCD,首先要将LCD的各个控制线与S3C2410的LCD控制信号相接,当然,电源也一定要接入了,否则不亮可别找我。
另外需要注意以下几点:1)背光:对于大部分的彩色LCD一定要接背光,我们才能看到屏上的内容;2)控制信号:不同的LCD厂商对于控制信号有不同的叫法,S3C2410芯片手册也给出了一个信号的多个名称(图一),这就要看你们硬件工程师的功底了,图一 S3C2410手册上给出的控制信号的名称及解释这里我做一个简单的介绍:¾VFRAME:LCD控制器和LCD驱动器之间的帧同步信号。
该信号告诉LCD 屏的新的一帧开始了。
LCD控制器在一个完整帧显示完成后立即插入一个VFRAME信号,开始新一帧的显示;¾VLINE:LCD控制器和LCD驱动器之间的线同步脉冲信号,该信号用于LCD 驱动器将水平线(行)移位寄存器的内容传送给LCD屏显示。
LCD控制器在整个水平线(整行)数据移入LCD驱动器后,插入一个VLINE信号;¾VCLK:LCD控制器和LCD驱动器之间的像素时钟信号,由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿处被LCD驱动器采样;¾VM:LCD驱动器的AC信号。
VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示或熄灭。
VM信号可以与每个帧同步,也可以与可变数量的VLINE信号同步。
3)数据线:也就是我们说的RGB信号线,S3C2410芯片手册上都有详细的说明,由于篇幅关系,在此不一一摘录,不过需要与硬件工程是配合的是他采用了哪种接线方法,24位16位或其它。
对于16位TFT屏又有两种方式,在写驱动前你要清楚是5:6:5还是5:5:5:I,这些与驱动的编写都有关系4)要注意一下LCD的电源电压,对于手持设备来说一般都为5V或3.3V,或同时支持5V和3.3V,如果LCD的需要的电源电压是5V,那就要注意了,S3C2410的逻辑输出电压只有3.3V,此时一定要让你们的硬件工程师帮忙把S3C2410的逻辑输出电压提高到5V,否则你可能能将屏点亮,但显示的图像要等到太阳从西边出来的那一天才能正常,呵呵,我可吃过苦头的哦!5)3.3V逻辑电压转变成5V逻辑电压电路图(此图由华恒公司提供)6)最后还有一个问题,有些LCD屏还需要一颗伴侣芯片,就是S3C2410手册中的那颗LPC3600。
这可能在LCD的手册中都有论述吧,我没有遇到过这样的屏,所以也不是很清楚。
那么是不是所有的屏与S3C2410相接都需要那个讨厌的家伙呢?这是好多人(包括我)在最开始都会有的疑问,不过现在的大部分LCD屏应该都不需要这个讨厌的家伙了,屏的控制信号直接与S3C2410的控制信号相接就可以了,至少我还没有遇到过。
7)还得提醒大家一下,S3C2410到LCD屏的连线千万千万别超过0.5米,否则会给你带来麻烦,我也是吃过苦头的,LCD屏上面的部分显示任何信息都是正确的,而只有屏的底部会有时正确有时错误,折腾了好一阵,才知道是连线太长的缘故!3.好了,在硬件工程师的帮助下,硬件接好了,那就该我们做软件的干活了,编写驱动吧1)让我们首先看一下RGB数据结构的定义在s3c2410fb.c中找到如下信息这是对16位色的RGB颜色进行定义,R:G:B:I = 5:6:5:0,即我们常说的565显示方式。
呵呵,为了让有些朋友更好的理解,我多罗嗦几句,我们随便写一个16位数据的颜色数据(为了分析的方便,我把它写成二进制)RGB = 10101101 10111001根据上面的结构定义我们来分析一下RGB各是多少(因为没有透明色,我们不去分析)a)blue: {offset: 0, length: 5} 偏移量为0,长度为5,我们从那个RGB中提取出来便是“11001”b)green:{offset: 5, length: 6} 偏移量为5,长度为6,我们从那个RGB中提取出来便是101 101c)red: {offset: 11, length: 5 } 偏移量为11,长度为5,我们从那个RGB中提取出来便是10101d)我们得到了一个RGB值为13:45:200,就是这个颜色e)那么反过来,有了RGB的值我们该如何,因为RGB的有效位数都不足一个字节(8位),那我们只能忍痛割爱了,舍弃掉低位数据,代码如下记住,这段代码在GUI程序中是有用的2)对于8位色(256色)的数据结构定义这是原程序中给出的定义,我感觉有些错误,我认为应该为R:G:B = 3:3:2因为没有亲自去调适,所以没有什么发言权,希望做过这方面的朋友给我一个答案。
3)对于CSTN屏,一般都能达到12位色(4096色)的,S3C2410这颗芯片也是支持的,但是在软件方面要做的工作比较大,因为从原有的代码,我们找不到任何12位色显示的迹象,另外Linux本身好像也不支持12位色的,如果你要作的事情比较简单,那你就自己写代码吧。
我在此给出12位色的数据结构定义但是要完成12位色CSTN屏驱动程序的编写还有一些工作要做,稍后我会适当的向大家介绍。
4)接着看下面的代码,其中要修改的部分已经用绿色标出,下面分别进行介绍。
a)颜色位数bpp:16如果你的LCD屏是TFT的,那一般都可以达到16位色或24位色,这也要看硬件怎么连接了,根据情况进行设置即可;如果你的LCD屏是CSTN的,按照常规LCD手册的介绍,一般都可以支持到8位色(256色),而实际的CSTN屏的显示效果都可以达到12位色(4096色),那可有很大的区别的,如果你要选择便宜的屏又要丰富的颜色,那就费点劲,完成12位色的驱动。
b)LCD屏的宽度和高度xres: 240yres: 320这个就不用多说了,你的屏的分辨率是多少就设置成多少呗。
c)寄存器的设置,这些也不困难。
下面就让我们一起一口一口的将S3C2410的LCD寄存器统统吃掉!¾首先介绍一下我这块屏,这是日立的一块TFT屏,大小为640X240,可以支持到16位色。
¾与驱动有关的一张表图二 LCD屏资料有了这些信息,让我们看一下LCD寄存器的设置。
¾LCD控制器1LINECNT ---这是一个只读的数据,我们当然没有必要理它 CLKV AL --- 这可是一个很有用的参数,其实没必要管它后面的计算,我们可以通过实际的测试来得出一个有效的值,对于320x240的屏一般设置为7就可以了,而对于640x480的屏,该值可以小一点。
对于后面的计算公式及注释(STN: CLKVAL >= 2,TFT:CLKVAL >= 0),我不知道该如何去理解,因为在实际的应用中我点了一块640X240的CSTN屏,当我的CLKVAL = 1时才达到了一个最佳的效果,这似乎与说明书相违背,我也解释不清为什么?!PNRMODE --- 这个应该不用多做解释,大家一看都明白了,对于TFT屏,只能设置成11,而对于CSTN屏,可能需要根据实际屏的信息去设置,我遇到的屏都设置成10,即8bit单扫描模式。
对于4bit单扫描、4bit双扫描、8bit单扫描的说明在s3c2410的手册中有详细的介绍,大家可以去参考一下。
BPPMODE --- 这个参数更不用多说了吧,就是设置屏的颜色位数喽。
这些参数的设置都很简单,我给出我这块屏的定义:同时,我也给出一块CSTN屏的寄存器参数信息¾LCD控制器2对于TFT屏必须要填,至于什么意思怎么翻译,相信大家都比我的水平强,自己翻译吧。
我只说明从LCD中如何将这个值“扣”出来。
很容易,看一下图二 LCD屏资料,对比一下得出如下信息:LCD2_VBPD:Vertical vack proch 典型值为7LCD2_VFPD:Vertical front porch 典型值为4LCD2_VSPW:Vsync Valid width 典型值为2关于LINEV AL在程序的后面将会提到,此处不必理会。
经过分析,我们知道了如何设置LCD2:对于STN(CSTN)屏,这个寄存器的设置最简单,将VBPD、VFPD、VSPW都设置成Zero就可以了。
即¾LCD控制器3对于TFT屏,很容易将HBPD和HFPD找出来,如下LCD3_HBPD:Horizontal back porch 典型值为37LCD3_HFBD:Horizontal back porch 典型值为32对于HOZV AL同样会在后面提到,此处暂时不管经过分析,我们知道了如何设置LCD3:对于(STN)CSTN屏,我没有很好的理解WDLY和LINEBLANK的真正涵义,通过改变这两个参数的值,我也没有得到特别明显的差异,我一般设置为:¾LCD控制器4对于TFT屏,需要设置HSPW的值,这个在LCD手册上也很容易得到LCD4_HSPW:Hsync Valid width 典型值为5至于MV AL,我不知道是什么意思,有什么作用,我从来不动它,只取它最初的那个值13经过分析,我们知道了如何设置LCD4:对于STN(CSTN)屏,像WDLY一样,我通常不改变,因为改变了没有发现有什么作用,这是我驱动中的代码,好几块屏都一样的:¾LCD控制器5这个寄存器的看起来比较复杂,但是无外乎这几类:只读信息:VSTATUS和HSTATUS只读的东东,设置它也没用,不必理会。
TFT屏的颜色信息:BPP24BL、FRM565TFT屏的颜色信息,这个我们在LCD的硬件连接时已经提到了,根据具体的接线方式,设置信息。
控制信号的极性TFT/STN屏控制信号的极性:INVVCLK、INVVLINE、INVVFRAME、INVVD、INVPWREN、PWRENTFT屏特有的控制信号的极性:INVVDEN、INVLEND、ENLEND这些信息主要是使S3C2410的信号输出极性与LCD屏的输入极性的问题,需要根据具体的硬件进行设置,较为常见的是vline/hsync 、VFRAME/VSYNC脉冲的极性。
颜色信息的字节交换控制位:BSWP、HWSWP这两位用来控制字节交换和半字交换,主要用来大小头的问题,如果输出到屏上的汉字左右互换了,或者输出到屏上的图花屏了,可以更改这个选项。
具体涵义在S3C2410芯片手册上有详细的说明。