您的位置 首页 系统

LCD驱动的移植及其GUI仿真怎么进行,LCD数模转化实际原理及其源代码

LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码-系统中显示部分的子程序与字模数据结构互相关联,这里将ASCII字符显示子程序和单独显示汉字字模的子程序列出来,根据这两个子程序

  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屏的新的一帧开端了。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 中找到如下信息

  staTIc struct s3c2410fb_rgb xxx_tft_rgb_16 = {

  red: {offset:11, length:5,},

  green: {offset:5, length:6,},

  blue: {offset:0, length:5,},

  transp: {offset:0, length:0,},

  };

  这是对 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 101

  c) red: {offset: 11, length: 5 } 偏移量为 11,长度为 5,咱们从那个 RGB 中提取出来便是 10101

  d) 咱们得到了一个 RGB 值为 13:45:200,便是这个色彩

  e) 那么反过来,有了 RGB的值咱们该怎样,由于 RGB 的有用位数都缺乏一个字节(8 位),那咱们只能忍痛割爱了,放弃掉低位数据,代码如下

  r=(rDat0xF8);

  g=(gDat0xFC);

  b=(bDat0xF8);

  hight=r|(g《《5);

  low=(g》》3)|(b《《3);

  color=(hight》》8)|low;

  记住,这段代码在 GUI 程序中是有用的

  2) 关于 8 位色(256 色)的数据结构界说

  staTIc struct s3c2410fb_rgb rgb_8 = {

  red: {offset:0, length:4,},

  green: {offset:0, length:4,},

  blue: {offset:0, length:4,},

  transp: {offset:0, length:0,},

  };

  这是原程序中给出的界说,我感觉有些过错,我以为应该为 R:G:B = 3:3:2

  staTIc struct s3c2410fb_rgb rgb_8 = {

  red: {offset:5, length:3,},

  green: {offset:2, length:3,},

  blue: {offset:0, length:2,},

  transp: {offset:0, length:0,},

  };

  由于没有亲身去调试,所以没有什么发言权,期望做过这方面的朋友给我一个答案。

  3) 关于 CSTN 屏,一般都能到达 12 位色(4096 色)的,S3C2410 这颗芯片也是支撑的,但是在软件方面要做的作业比较大,由于从原有的代码,咱们找不到任何 12位色显现的痕迹,其他 Linux 自身如同也不支撑 12 位色的,假设你要作的作业比较简略,那你就自己写代码吧。我在此给出 12位色的数据结构界说

  staTIc struct s3c2410fb_rgb xxx_stn_rgb_12 = {

  red: {offset:8, length:4,},

  green: {offset:4, length:4,},

  blue: {offset:0, length:4,},

  transp: {offset:0, length:0,},

  };

  但是要完结 12 位色 CSTN 屏驱动程序的编写还有一些作业要做,稍后我会恰当的向咱们介绍。

  4) 接着看下面的代码,其间要修正的部分现已用绿色标出,下面别离进行介绍。

  a) 色彩位数

  bpp:16

  假设你的 LCD 屏是 TFT 的,那一般都能够到达 16 位色或 24 位色,这也要看硬件怎样衔接了,依据状况进行设置即可;

  如 果你的 LCD屏是 CSTN的,依照惯例 LCD手册的介绍,一般都能够支撑到8 位色(256色),而实践的 CSTN屏的显现效果都能够到达 12 位色(4096色),那可有很大的差异的,假设你要挑选廉价的屏又要丰厚的色彩,那就费点劲,完结 12 位色的驱动。

  b) LCD屏的宽度和高度

  xres: 240

  yres: 320

  这个就不用多说了,你的屏的分辨率是多少就设置成多少呗。

  c) 寄存器的设置,这些也不困难。下面就让咱们一同一口一口的将 S3C2410 的LCD寄存器通通吃掉! 首要介绍一下我这块屏,这是日立的一块 TFT 屏,巨细为 640X240,能够支撑到 16位色。 与驱动有关的一张表

  图二 LCD屏材料

  有了这些信息,让咱们看一下 LCD寄存器的设置。

  LCD操控器1

  LINECNT --- 这是一个只读的数据,咱们当然没有必要理它

  CLKVAL --- 这但是一个很有用的参数,其实没必要管它后边的核算,咱们能够经过实践的测验来得出一个有用的值,关于320×240 的屏一般设置为 7 就能够了,而关于 640×480 的屏,该值能够小一点。关于后边的核算公式及注释(STN: CLKVAL 《= 2,TFT: CLKVAL 《= 0),我不知道该怎样去了解,由于在实践的运用中我点了一块 640X240 的CSTN 屏,当我的 CLKVAL = 1 时才到达了一个最佳的效果,这如同与阐明书相违反,我也解说不清为什么?!

  PNRMODE --- 这个应该不用多做解说,咱们一看都了解了,关于 TFT 屏,只能设置成 11,而关于 CSTN 屏,或许需求依据实践屏的信息去设置,我遇到的屏都设置成 10,即 8bit 单扫描方式。关于4bit单扫描、4bit 双扫描、8bit 单扫描的阐明在 s3c2410 的手册中有具体的介绍,咱们能够去参阅一下。

  BPPMODE --- 这个参数更不用多说了吧,便是设置屏的色彩位数喽。

  这些参数的设置都很简略,我给出我这块屏的界说:

  lcdcon1: LCD1_BPP_16T | LCD1_PNR_TFT | LCD1_CLKVAL(1),

  一同,我也给出一块 CSTN 屏的寄存器参数信息

  lcdcon1: LCD1_BPP_12S | LCD1_PNR_8S | LCD1_CLKVAL(9),

  LCD操控器2

  关于 TFT 屏必需求填,至于什么意思怎样翻译,信任咱们都比我的水平强,自己翻译吧。我只阐明从 LCD中怎样将这个值“扣”出来。

  很简略,看一下图二 LCD屏材料,比照一下得出如下信息:

  LCD2_VBPD:

  Vertical back porch 典型值为 7

  LCD2_VFPD:

  Vertical front porch 典型值为 4

  LCD2_VSPW:

  Vsync Valid width 典型值为 2

  关于 LINEVAL 在程序的后边将会说到,此处不用理睬。

  经过剖析,咱们知道了怎样设置 LCD2:

  lcdcon2: LCD2_VBPD(7) | LCD2_VFPD(4) | LCD2_VSPW(2),

  关于 STN(CSTN)屏,这个寄存器的设置最简略,将 VBPD、VFPD、VSPW 都设置成 Zero 就能够了。即

  lcdcon2: LCD2_VBPD(0) | LCD2_VFPD(0) | LCD2_VSPW(0),

  LCD操控器3

  关于 TFT 屏,很简略将 HBPD 和 HFPD 找出来,如下

  LCD3_HBPD:

  Horizontal back porch 典型值为 37

  LCD3_HFBD:

  Horizontal back porch 典型值为 32

  关于 HOZVAL 同样会在后边说到,此处暂时不论

  经过剖析,咱们知道了怎样设置 LCD3:

  lcdcon3: LCD3_HBPD(37) | LCD3_HFPD(32) ,

  关于(STN)CSTN屏,我没有很好的了解 WDLY 和 LINEBLANK 的真实寓意,经过改动这两个参数的值,我也没有得到特别显着的差异,我一般设置为:

  lcdcon3: LCD3_WDLY_16 | 0x10 ,

  LCD操控器4

  关于 TFT 屏,需求设置 HSPW 的值,这个在 LCD 手册上也很简略得到

  LCD4_HSPW:

  Hsync Valid width 典型值为 5

  至于 MVAL,我不知道是什么意思,有什么效果,我历来不动它,只取它开始的那个值 13

  经过剖析,咱们知道了怎样设置 LCD4:

  lcdcon4: LCD4_HSPW(5) | LCD4_MVAL(13) ,

  关于 STN(CSTN)屏,像 WDLY 相同,我一般不改动,由于改动了没有发现有什么效果,这是我驱动中的代码,好几块屏都相同的:

  lcdcon4: LCD4_WLH(0) | LCD4_MVAL(13) ,

  LCD操控器5

  这个寄存器的看起来比较复杂,但是无外乎这几类:

  只读信息:VSTATUS和 HSTATUS

  只读的东东,设置它也没用,不用理睬。

  TFT 屏的色彩信息:BPP24BL、FRM565

  TFT 屏的色彩信息,这个咱们在 LCD的硬件衔接时现已说到了,依据具体的接线方法,设置信息。

  操控信号的极性

  TFT/STN 屏操控信号的极性:INVVCLK、INVVLINE、INVVFRAME、INVVD、INVPWREN、PWREN

  TFT 屏特有的操控信号的极性:INVVDEN、INVLEND、ENLEND

  这些信息首要是使S3C2410的信号输出极性与LCD屏的输入极性的问题,需求依据具体的硬件进行设置,较为常见的是vline/hsync 、VFRAME/VSYNC脉冲的极性。

  色彩信息的字节交流操控位:BSWP、HWSWP

  这两位用来操控字节交流和半字交流,首要用来巨细头的问题,假设输出到屏上的汉字左右互换了,或许输出到屏上的图花屏了,能够更改这个选项。具体寓意在 S3C2410芯片手册上有具体的阐明。

  我的这块 TFT 的信息设置如下:

  lcdcon5: LCD5_FRM565 | LCD5_HWSWP | LCD5_PWREN ,

  一块 CSTN屏的信息

  lcdcon5: LCD5_BSWP | LCD5_PWREN ,

  FrameBuffer 开端寄存器 1

  这个寄存器的设置没有必要去修正(TFT/STN),都运用默许的代码即可:

  FrameBuffer 开端寄存器 2 和 FrameBuffer 开端寄存器 3

  这两个寄存器的设置比较重要,在此我给出 12 位色 CSTN 屏和 16 位色TFT 的设置代码:

  前面说到的 LINEVAL 和 HOZVAL 以源码的方式给出,其间 CSTN 8 位色没有经过测验。

  RGB Loopup Table Register

  这三个寄存器的在驱动 256 色 CSTN 屏的时分需求运用,我在其他芯片上运用过,由于这颗芯片支撑 12 位色,所以没有去调试,我给

  出两组或许的值:

  S3C44B0 上的

  rREDLUT = 0xFCA86420;

  rGREENLUT = 0xFCA86420;

  rBLUELUT = 0xFFFFFA50;

  Jupiter 上的

  rREDLUT = 0xFEC85310

  rGREENLUT = 0xFEC85310

  rBLUELUT = 0xFB40

  5) 好了,各个寄存器的设置完结了,最终在驱动 CSTN屏的时分需求提示咱们一句,CSTN的信号引脚中有一个叫VM/DISP的信号线,这个信号线的效果便是翻开LCD的显现开关,让其进行显现,它 能够接到任何一个 GPIO 口上。S3C2410 中供给了一个 VM 信号,能够将 LCD的这个信号与 S3C2410 的 VM 信号相接即可,然后在驱动中必定要加上如下句子(蓝色选中部分):

  不然你的 LCD或许没有任何显现哦(关于 TFT 屏不需求这个句子)

  6) 关于 12 位色的 CSTN屏的驱动还需求做一些作业,我在这儿简略介绍一下:

  a) 首要要完结一个 fbcon-cfb12.c和 fbcon-cfb12.h 的编写,这两个文件很简略,在armLinux 中不是供给了 fbcon-cfb16.c 和 fbcon-cfb12.h 吗?简略修正一下就能够了;

  b) 将 fbcon-cfb12.c 的编译参加 Config.in 中(不会的话去 google 搜一下,或许看一下我的另一篇文章《JFFS2 在 HHARM2410 上的完结》,里面有一些阐明),并界说一个 FBCON_HAS_CFB12 参数(仿照 FBCON_HAS_CFB16 呗);

  c) 其他,需求在 s3c2410fb.c 中的相应部分加上对 12位色的支撑即可。呵,说起来简略,但实践做起来或许会有一些问题,给咱们一个诀窍:在程序中找到#ifdef FBCON_HAS_CFB16 之类的代码,简略了解一下加上对 12 位色的支撑;

  d) 我只给出函数 s3c2410fb_set_var中的改动,其他的应该都不是很困难,信任朋友们都能搞定。

  e) 不要跟我要源码哦,不然老板会不高兴哦 。

  4. 驱动写好了,从头 Make,下载就能够了。假设一切顺利,在 TFT 屏或 256 色的 CSTN屏上会有一个美丽的小蜻蜓(应该是蜻蜓吧)呈现。留意,并不是蜻蜓呈现了就代表你的驱动 OK了,还要用 GUI 程序做进一步的测验,由于某一个或几个参数尽管不正确,但是依然能够看到小蜻蜓的,但显现图形的时分就有问题了。其他,在驱动 CSTN到 12位色的时分,咱们在屏上看不到小蜻蜓(我的 N块 CSTN屏上都没见到小蜻蜓),我想,或许是 armLinux 自身不支撑 12 位色显现,或许咱们某些当地没搞对的原因吧,但这不代表你的驱动有问题,用 GUI 程序写 FrameBuffer,看看能否的到正确的成果。

  5. GUI 程序的编写

  FrameBuffer 驱动写好了,那么怎样去运用,怎样在 LCD 上显现图画呢?这便是 GUI程序的使命了,其实要在 LCD 上显现图画,说白了便是把数据(包括色彩)写到FrameBuffer 中对应的方位就能够了。假设你运用如 Microwinow、MiniGui、Qt 之类的GUI,则没有必要关怀 FrameBuffer与 LCD屏上的点怎样进行映射了,但假设你在运用了 CSTN 屏,而且要显现效果好的相片,挑选了 CSTN 的 12 位色(4096色 ),那你就要自己写 GUI 程序了,由于如同 armLinux(Linux)自身都不支撑 12 位色的,传闻 MiniGui支撑 12 位色,但我在作业中的要求仅仅显现图形罢了,没有去深化研究 MiniGui,所以自己写了。

  其他请朋友们见谅的是我不能给出悉数的源代码,由于我究竟受雇于人,有些东东是能够 GPL 的,而有些东东暂时是不能够 GPL 的。

  下面给出我的程序的部分代码,期望对朋友们有所协助。

  1) 全局变量的界说:

  界说几个全局变量,用起来便利。

  2) 初始化图形显现引擎,将 fb0与 GUI 的 buffer做个映射

  用mmap函数运用户空间的一段地址相关到设备内存(FrameBuffer)上。不管何时,只需程序在分配的地址范围内进行读取或许写入,实践上便是对 设备的拜访,运用 mmap 能够既快速又简略地拜访显现卡的内存。关于象这样的功能要求比较严厉的运用来说,直接拜访能给咱们供给很大不同。 不过我曾将帮一个网友调试了一个 S3C44B0 上的 GUI 程序,在他的 GUI 中 mmap 函数总会犯错,由于没有拿到他的硬件和驱动源码,没有剖分出其间的原因,所以只得用 write函数,直接向 fb0 写入数据,奇怪的是只写入一部分数据如同都不起任何效果,只得整屏数据写入才搞定了。这可就比较痛苦了,不过好在他仅仅写入的是非数据,数据量还不是很 大,要是五颜六色的那可真的痛苦了 。

  其他,我还想多烦琐两句,FrameBuffer的像素点与LCD屏上的像素点的对应联系 ,深化了解一下对程序的了解或许会更清楚一点。咱们知道是非(2 色)色彩用 0 和 1 就能够表明了,也便是 1 位数据就能够了,那 1 个字节就能够表明 8 位数据,假设这个字节是10101010,FrameBuffer 的偏移地址为 0,则在 LCD 屏上便会显现出 4 个黑点,黑点中心会有 4 个白点呈现(假设 1 是黑色);关于 4 色则用 00、01、10、11 就能够表明出四种色彩,即用两位数据能够表明一位数据,那同样是 10101010,则对应于 LCD 屏上则显现的

  是色彩值为10,长度为4(8/2)的一条直线;同理,关于8位色(256色),则8位数据才干表明出一个点的色彩值,10101010在LCD屏上就只能显现为色彩值为10101010的点了。

  有了上面的根底咱们就能够很好的了解这个句子了:

  screensize = vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;

  即FrameBuffer 的巨细=LCD屏的宽度 * LCD屏的高度 * 每像素的位数 / 每字节的位数

  例如,一个320*240的是非平,FrameBuffer的巨细为

  320 * 240 * 1 / 8 = 9600 (字节)

  而一个320 * 240的16位色LCD的 FrameBuffer的巨细则为

  320 * 240 * 16 / 8 = 153600(字节)

  3) TFT 屏 16 位色的画点函数

  有了画点函数,你还愁什么?图形汉字都能够搞定了吧!

  4) CSTN屏 12位色的画点函数

  留意,为了更便于代码书写,我在这个函数中将 fbp 界说为 static char * fbp,而在TFT 屏 16 位色的画点函数中 fbp 的界说为 U16 * fbp,你能够依据需求进行修正。

  5) TFT 屏 16 位色下显现 24色位图函数

  Bmp文件的格局能够参阅网上的一些材料,假设需求也能够直接找我要。

  6) CSTN屏 12位色下显现 24 色位图函数

  7) 呵呵,别忘了封闭设备哦

  void closegraph()

  {

  munmap(fbp,screensize);

  close(fb);

  }

  收成:

  1、LCD的电源电压,关于手持设备来说一般都为 5V 或 3.3V,或一同支撑 5V和 3.3V,假设 LCD的需求的电源电压是 5V,那就要留意了,S3C2410 的逻辑输出电压只需 3.3V,此刻必定要让你们的硬件工程师协助把 S3C2410 的逻辑输出电压提高到 5V,不然不能将屏点亮

  2、S3C2410到 LCD屏的连线千万千万别超越 0.5 米,不然呈现问题。如LCD屏上面的部分显现任何信息都是正确的,而只需屏的底部会有时正确有时过错。

  3、8位色的数据结构界说:

  static struct s3c2410fb_rgb rgb_8 = {

  red: {offset:5, length:3,},

  green: {offset:2, length:3,},

  blue: {offset:0, length:2,},

  transp: {offset:0, length:0,},

  };

  R:G:B = 3:3:2

  4、CLKVAL的确认:

  CLKVAL --- 这但是一个很有用的参数,其实没必要管它后边的核算,咱们能够经过实践的测验来得出一个有用的值,关于320×240 的屏一般设置为 7 就能够了,而关于 640×480 的屏,该值能够小一点。

  5、在设置LCDCON5时,经过 TFT/STN 屏操控信号的极性,使S3C2410的信号输出极性转化后与LCD屏的输入极性相一致

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/171765.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部