您的位置 首页 观点

LCD的ARM编程方法,LCD Linux程序怎么写入?

LCD的ARM编程方式,LCD Linux程序如何写入?-目前还没有讨论的 file_operations 方法是 ioctl ()。用户应用程序使用 ioctrl 系统调用操作 LCD 硬件。fb_

  依据ARM处理器的LCD编程规划:

  跟着单片机技能的飞速发展,新式的仪器仪表呈现出操作简略、便携化的趋势。LCD模块能够满意嵌入式体系日益增长的要求,它能够显现汉字、字符和图形,一起还具有低压、低功耗、体积小、重量轻等许多长处,因而运用非常广泛。

  液晶显现模块(LCM)是由操控器、行驱动器、列驱动器、显现存储器和液晶显现屏等器材经过PCB组装成一体的低成本输出设备,被广泛用于各种仪器仪表等设备中。其核心部件LCD操控器是可编程接口芯片,它一方面供给与微操控器(MCU)的接口,一方面衔接行/列驱动器。用户对LCD操控器编程便是完结对LCM的操作操控。LCD操控器的功用是接纳核算机发来的指令和数据,并向核算机反应所需的数据信息。 T6963操控模块 T6963操控器型液晶显现模块的驱动操控体系由液晶显现操控器T6963及其外围电路、行驱动器组、列驱动器组和液晶驱动偏电压电路组成。

  T6963C是一种内置操控器的图形LCD,其面向显现存储器的引脚有8根数据线(D7~D0)、16根地址线(AD15~AD0)和4根操控线,最多能办理64KB巨细的显现存储器。T6963C将显现存储器分红3个区,分别是文本显现缓冲区、图形显现缓冲区和字符发生器RAM(CGRAM)区。 选用图形显现办法时,液晶屏显现单元的单位是8&TImes;1点阵(称为一个图形显现单位)。每个图形显现单位对应图形显现缓冲区中的一个存储单元。将点阵状况信息写入这个存储单元,则对应的方位就会显现出图形。

  选用文本显现办法时,液晶屏显现信息的单位是8&TImes;8点阵(称为一个文本显现单位)。每个文本显现单位对应文本显现缓冲区中的8个接连存储单元。但选用文本显现办法时,写入文本显现缓冲区的不是点阵状况信息,而是字符代码,其点阵状况信息(8&TImes;8)(即字模)存放在CGRAM中。当8&TImes;8的点阵不足以描绘一个符号时,则一般用多个字符的组合来描绘。例如,一般选用16×16的点阵来描绘汉字,将该点阵分为4个8×8的点阵,用4个字符代码描绘一个汉字,依据这4个部分的方位联系将4条代码写入相应的文本显现缓冲区。T6963C片内还包括一个字模库CGROM,固化了数字、英文字母和常用符号等128个字符的点阵状况信息。

  体系硬件结构 1. 处理器 本文体系中的处理器选用的是ARM7系列AT91SAM7S64,该器材具有64KB的高速Flash、16KB的SRAM以及丰厚的外设资源,因而能够给体系规划供给强壮的硬件支撑。它包括的首要功用单元是: PDC(Peripheral Data Controller,外设数据操控器),能够经过该操控器办理SPI接口和串口。串口作为本体系各部分之间通讯的首要手法,而SPI接口作为ARM处理器和A/D、D/A模块之间通讯和操控的首要手法。 AIC(Advanced Interrupt Controller,先进中止操控器),能够经过该操控器发生计时器中止和串口中止,计时器中止可作为本体系分时作业编程的首要手法,而串口中止是数据通讯的处理手法。

  PIOA(Parallel Input/Output Controller,并行输入/输出操控器),能够经过该操控器办理ARM体系的各个设备,一起本体系也运用PIOA来操控LCD。 其它功用单元包括看门狗、电源操控器等。能够经过编程对这些操控器进行办理,在IAR开发环境下选用C言语进行编程,并经过JTAG调试接口下载到板上FLASH中运转调试。

  2. 液晶屏衔接办法 T6963液晶显现模块与处理器的衔接办法一般有两种:直接拜访办法和直接操控办法。

  直接拜访办法是指处理器以拜访存储器或I/O设备的办法操控液晶操控模块作业,模块的数据线与处理器的数据总线衔接,片选及寄存器挑选由处理器的地址总线供给,读和写操作由处理器的读写操作信号操控;而在直接操控办法中,处理器经过本身或体系的并行接口与液晶操控模块相连,处理器经过I/O接口的操作直接完结对模块的操控。 本体系选用的是直接拜访办法,如图1所示。运用ARM处理器AT91SAM7S64的引脚彻底可编程和复用功用,以4路模仿显现模块操控信号,8路作为数据线。这样即充分发挥了T91SAM7S64处理器功用强壮、资源丰厚的长处,又简化了操控并易于完结编程。

  图1:ARM与LCD的接口示意图

  软件完结 本体系对图形显现办法进行编程。图形显现办法可显现任何形状的图形(包括字符),在该办法下,T6963C还能够供给对“位”的操作,即经过指令操控液晶屏上的恣意一点是否显现。每个点的显现状况用一位二进制信息表明,当这一位信息为“1”时显现屏上相应的点就显现,为“0”时则不显现。 但因为本规划中选用的是32位ARM处理器,而不是8位的51系列,因而在直接操控办法下的编程进程中,应留意数据的对应联系。 1. T6963指令集及时序 T6963具有一系列操作指令,经过这些指令能够完结对显现屏的操控。在规划进程中,依据T6963的指令体系以及时序信号波形图等进行编程。T6963指令体系见表1。液晶显现模块的操控引脚和读写信号的操控联系如图2所示。

  表1:T6963指令表

  图2:T6963信号时序图

  2. 程序流程图 一般液晶显现编程的进程是:首要编写状况查询、写指令、写数据、读数据等子程序;然后编写清屏、画点等根本子程序;在此根底上编写程序以显现字符、数字、汉字及杂乱的图形等。每条指令的履行都是先送入参数,再送入指令代码,因而每次操作之前最好先进行状况字检测。 经过对内置T6963点阵式液晶显现的软件规划,能够发现该液晶显现操控模块的操控句子简略、调试便利。T6963C内部经过一根地址线来确认两个寄存器,当地址线为低电平,挑选DATA寄存器;当地址线为高电平,则挑选COMMAND/STATUS寄存器。在对T6963C发送每条指令或参数前,有必要先读取COMMAND/STATUS寄存器以查看T6963C的状况字。状况字节的意义如下: STA0:1/0,指令读写状况为准备好/忙;

  STA1:1/0,数据读写状况为准备好/忙;

  STA2:1/0,数据主动读状况为准备好/忙;

  STA3:1/0,数据主动写状况为准备好/忙;

  STA4:未用;

  STA5:1/0,操控器运转检测或许/不能;

  STA6:1/0,屏读/复制状况为犯错/正确;

  STA7:1/0,闪耀状况检测为正常显现/关显现。 因为各状况位的意义不同,因而在不同的场合应检测不同的状况位。在CPU对T6963C中每一字节的指令或数据进行读写前,应先将STA0和STA1一起置为“准备好”状况。T6963C模块的操控指令可带有0个、1个或2个参数。在履行每条指令时都是先送入参数(假如有的话),再送入指令代码。当向T6963C读、写数据或写入指令时,有必要严厉遵从T6963C的时序。假如送入的参数多于规则个数,则以为最终一次送入的有用。每次操作之前有必要先进行状况字检测。

图3a给出了显现操作的流程框图

  图3:(a) 显现操作流程框图;(b) 双参数指令传输进程。 以上每个进程又需求完结以下流程:关于无参数或主动指令,以上进程仅履行1次,单参数指令需履行2次,而双参数指令则需履行3次(前2次传参数,最终1次传指令)。图3b以双参数指令为例给出了指令传输进程。 检测程序如下: //指令、数据读写状况查看 void RWCheck()

  {

  unsigned int dat = 0;

  do

  {

  *AT91C_PIOB_CODR=CS;

  *AT91C_PIOA_ODSR = DATA_BUS;

  *AT91C_PIOB_SODR = A0;

  *AT91C_PIOB_CODR = RD;

  delay_bus();

  dat=*AT91C_PIOA_PDSR;//读出当时PIO管脚状况

  dat = 0x00600000dat;//取出需求的数据位,看STA0,STA1是否准备好

  delay_bus();

  *AT91C_PIOA_SODR = RD;

  delay_bus();

  *AT91C_PIOA_SODR=CS;

  } 3. 汉字显现 以本体系的显现模块LCM240128为例,液晶显现屏上横向的8个点是一个字节数据,某位为1则对应点变亮,关于240×128的显现模块来说,每行为240点,每列为128点。每个字节在显现缓冲区中均有对应的地址,液晶屏幕的左上角横向8个点对应液晶模块显现缓冲区的首地址。最常见的显现办法有两种,以常用的16×16点阵汉字为例,一种是先将左半部16个字节写入显现缓冲区,再写入右半部的16个字节;另一种则先写入上半部的16个字节,再写入下半部的16个字节。然后单片机经过接口电路,依照规则的时序将待显现汉字字模的一切字节按液晶操控器规则的办法,在预订方位写入液晶操控器缓冲区。程序如下: void ShowHZ(unsigned int lin,unsigned int column,unsigned int hzcode)

  {

  unsigned char i;

  unsigned int StartAddr = 0;

  StartAddr=lin*LineChar column; //定位开始行

  for(i=0;i《16;i )

  {

  OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr》》8), 0x24);

  OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一

  OutPortCom2( HZTable[hzcode][i*2 1], 0xc4); //右半部 字模地址加一

  StartAddr=StartAddr LineChar;

  }

  } 4. 图形显现 固定格局的图形图画显现与在图形办法下显现汉字相似,即先确认点阵信息,再送入显现方位对应的缓冲区中。

  实际上,每个汉字都是一幅图画,只是在处理坐标数据时有所不同。与汉字显现的首要区别是:图形显现中数据需逐点生成并按必定算法逐点送入缓冲区单元;为取得杰出的显现作用,规范图元(直线、圆、椭圆等)可运用图形学中的某些生成算法。因为硬件要求一次扫1行,因而有必要先找到该点地点的行地址,然后在字节内核算点的方位,将该方位1;若是擦除,则将该方位0。画点是完结其它图形的根底,运用画点程序,只需依照图形学算法操控坐标变量x、y并移位,然后逐个画点,就能组成任何图形。

  5. 动态显现 当动态显现图形时,用T6963C操控器的指令和功用编程,取得变参数的各种根本图形函数,以显现不同的图形,在动态图形显现之前将固定的图形选用屏复制办法保存下来,动态图形显现结束时康复本来的图形。汉字字符和数字字符的固定显现在初始化进程中完结,动态显现则直接用掩盖的办法完结。 不管汉字、数字、英文字符或图形,液晶显现操控器都视为在规则区域依据给定数据操控各个点的显现,它们的显现操控原理并没有本质区别,这样在编程时就能够将一切显现内容都当作图形处理。

  驱动程序选用C言语编写,具有模块化的结构和代码可移植性,且通用性较好。

  本文小结 选用点阵式图形液晶显现模块将使显现更直观、界面更丰厚。直接拜访办法的驱动程序比直接操控办法更精简一些,程序的运转功率也较高。本文中的程序选用C言语编写,通用性强、移植便利。该办法及程序在体系显现部分中,显现明晰、作业安稳。具有模块化结构和代码可移植性,且通用性较好,在嵌入式体系中有必定代表性和广泛用处。

  怎样写 Linux LCD 驱动程序:

  根本原理

  经过 framebuffer ,运用程序用 mmap 把显存映射到运用程序虚拟地址空间,即将显现的数据写入这个内存空间就能够在屏幕上显现出来;

  驱动程序分配体系内存作为显存;完结 file_operations 结构中的接口,为运用程序服务;完结 fb_ops 结构中的接口,操控和操作 LDC 操控器;

  驱动程序将显存的开始地址和长度传给 LCD 操控器的寄存器 (一般由 fb_set_var 完结) , LDC 操控器会主动的将显存中的数据显现在 LCD 屏上。

  写 framebuffer 驱动程序要做什么

  简略的讲,framebuffer 驱动的功用便是分配一块内存作显存,然后对 LCD 操控器的寄存器作一些设置。

  详细来说:

  填充一个 fbinfo 结构

  用 reigster_framebuffer (fbinfo*) 将 fbinfo 结构注册到内核

  关于 fbinfo 结构,最首要的是它的 fs_ops 成员,需求针对详细设备完结 fs_ops 中的接口

  考虑是否运用中止处理

  考虑内存拜访办法

  显卡不自带显存的,分配体系内存作为显存

  显卡自带显存的,用 I/O 内存接口进行拜访 (request_mem_region / ioremap),

  关于LCD 设备材料可参阅如下材料:

  Datasheet of LCD device

  书:液晶显现技能

  书:液晶显现器材

  什么是 frame buffer 设备

  frame buffer 设备是图形硬件的笼统,它代表了图形硬件的侦缓冲区,答应应 用程序经过指定的接口拜访图形硬件。因而,运用程序不用关怀底层硬件细节。

  设备经过特定的设备节点拜访,一般在 /dev 目录下,如 /dev/fb*。

  更多关于 frame buffer device 的材料能够在以下两个文件中找到: linux /Documentation/fb/framebuffer.txt 和 linux /Documentation/fb /interal.txt,但这些材料内容不多,还需求看看结合代码详细分析。

  Linux Frame Buffer 驱动程序层次结构

  Frame Buffer 设备驱动能够从三个层次来看:

  运用程序与体系调用;

  适用于一切设备的通用代码,防止重复,包括 file_operations 结构、register/unregister framebuffer 接口等;

  操作详细硬件的代码,首要是 fs_ops 结构。

  在 Linux 内核中,Frame Buffer 设备驱动的源码首要在以下两个文件中,它们 处于 frame buffer 驱动体系结构的中间层,它为上层的用户程序供给体系调用, 也为底层特定硬件驱动供给了接口:

  linux/inlcude/fb.h

  linux/drivers/video/fbmem.c

  数据结构

  头文件 fb.h 界说了一切的数据结构:

  fb_var_screeninfo:描绘了一种显卡显现形式的一切信息,如宽、高、色彩深度等,不同的显现形式对应不同的信息;

  fb_fix_screeninfo:界说了显卡信息,如 framebuffer 内存的开始地址,地址长度等;

  fb_cmap:设备独立的 colormap 信息,能够经过 ioctl 的 FBIOGETCMAP 和 FBIOPUTCMAP 指令设置 colormap;

  fb_info:包括当时 video card 的状况信息,只需 fb_info 对内核可见;

  fb_ops : 运用程序运用 ioctl 体系调用操作底层的 LCD 硬件,fb_ops 结构中界说的办法用于支撑这些操作;

  这些结构相互之间的联系如下所示:

  framebuffer 驱动首要数据结构

  接口

  fbmem.c 完结了一切驱动运用的通用代码,防止了重复。

  全局变量:

  struct fb_info *registered_fb [FB_MAX]

  int num_registered_fb;

  这个两个变量用于记载正在运用的 fb_info 结构实例。fb_info 代表 video card 的当时状况,一切的 fb_info 结构都放在数组中。当一个 frame buffer 在内核中登记时,一个新的 fb_info 结构被参加该数组,num_registered_fb 加 1。

  fb_drivers 数组:

  static struct {

  const char *name;

  int (*init)(void);

  int (*setup)(void);

  } fb_drivers[] __initdata= { 。。。。};

  若 frame buffer 驱动程序是静态链接到内核中,一个新的 entry 有必要要加到这个表中。 若该驱动程序是运用 insmod/rmmod 动态加载到内核,则不用关怀这个结构。

  static struct file_operations fb_ops ={

  owner: THIS_MODULE,

  read: fb_read,

  write: fb_write,

  ioctl: fb_ioctl,

  mmap: fb_mmap,

  open: fb_open,

  release: fb_release

  };

  这是用户运用程序的接口,fbmem.c 完结了这些函数。

  register/unregister framebuffer:

  register_framebuffer(struct fb_info *fb_info)

  unregister_framebuffer(struct fb_info *fb_info)

  这是底层 frame buffer 设备驱动程序的接口。驱动程序运用这对函数完结注册和吊销操作。底层驱动程序的作业根本上是填充 fb_info 结构,然后注册它。

  一个 LCD controller 驱动程序

  完结一个 LCD controller 驱动程序首要做如下两步:

  分配体系内存作显存

  依据详细的硬件特性,完结 fb_ops 的接口

  在 linux/drivers/fb/skeletonfb.c 中有一个 frame buffer 驱动程序的结构,它示例了怎样用很少的代码完结一个 frame buffer 驱动程序。

  分配体系内存作为显存

  因为大多数 LDC controller 没有自己的显存,需求分配一块体系内存作为显存。 这块体系内存的开始地址和长度之后会被存放在 fb_fix_screeninfo 的 smem_start 和 smem_len 域中。该内存应该是物理上接连的。

  关于带独立显存的显卡,运用 request_mem_region 和 ioremap 将显卡外设内存映射到处理器虚拟地址空间。

  完结 fb_ops 结构

  现在还没有评论的 file_operations 办法是 ioctl ()。用户运用程序运用 ioctrl 体系调用操作 LCD 硬件。fb_ops 结构中界说的办法为这些操作供给支 持。留意, fb_ops 结构不是 file_operations 结构。fb_ops 是底层操作的抽 象,而 file_operations 为上层体系调用接口供给支撑。

  下面考虑需求完结哪些办法。ioctl 指令和 fb_ops 结构中的接口之间的联系如 下所示:

  FBIOGET_VSCREENINFO fb_get_var

  FBIOPUT_VSCREENINFO fb_set_var

  FBIOGET_FSCREENINFO fb_get_fix

  FBIOPUTCMAP fb_set_cmap

  FBIOGETCMAP fb_get_cmap

  FBIOPAN_DISPLAY fb_pan_display

  只需咱们完结了那些 fb_XXX 函数,那么用户运用程序就能够运用 FBIOXXXX 宏 来操作 LDC 硬件了。那怎样完结那些接口呢?能够参阅下 linux/drivers/video 目录下的驱动程序。

  在很多接口中, fb_set_var 是最重要的。它用于设置 video mode 等信息。下 面是完结 fb_set_var 函数的通用进程:

  查看是否有必要设置 mode

  设置 mode

  设置 colormap

  依据上面的设置重新配置 LCD controller 寄存器

  其间第四步是底层硬件操作。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部