快捷搜索:  FfwG   STM8S003  FfwG.(.))),.  +STM8S003

在Linux下驱动STN彩色LCD

伴跟着高机能嵌入式处置惩罚器的飞速成长与遍及,分外是arm处置惩罚器系列的呈现,嵌入式系统的功能也变得越来越强大年夜。曩昔的单色LCD已不能满意现今的各类多媒体利用,彩色LCD被越来越多地利用到嵌入式系统中。同时,在利用需求的匆匆使下,许多事情在Linux下的图形界面软件包的开拓和移植事情中都涉及到底层LCD驱动的开拓问题。

在硬件采纳Intel ASSABET开拓板,软件采纳Linux 2.4.19平台,编译器为arm-linux-gcc的交叉编译器作为开拓的条件下,由于ASSABET开拓板上应用的是Sharp 3.9英寸320×240 TFT彩色LCD,现改用Kyocera 7.7英寸640×480 STN型彩色LCD,以是经由过程对其Linux驱动法度榜样进行改写和调试,成功地实现了对该种屏的驱动和显示。

LCD

节制器

LCD节制器的功能是显示驱动旌旗灯号,进而驱动LCD显示器。在驱动LCD设计的历程中重要的是设置设置设备摆设摆设LCD节制器。在设置设置设备摆设摆设LCD节制器中最紧张的一步则是帧缓冲区的指定。用户所要显示的内容皆是从缓冲区中读出,从而显示到屏幕上。帧缓冲区的大年夜小由屏幕的分辨率和显示色彩数抉择。驱动帧缓冲的实现是全部驱动开拓历程的重点。

ASSABET开拓板采纳SA1110作为处置惩罚器。SA1110微处置惩罚器是Intel公司临盆的一种基于Strongarm情况的微处置惩罚器。该处置惩罚器内部有一LCD驱动节制器,可支持单、双屏显示和最大年夜1024×1024dpi。每个像素数据以4、8、12或16位编码后存储于外部存储器内,经由过程LCD的专用DAM节制器,被装入至532位的FIFO中。在双屏显示时,两个DMA通道分手认真高低屏幕的显示,但只有第一个DMA通道有调色板缓冲器。帧缓冲器中的已编码像素数据是作为指针指向256×12位的调色板。调色板的色调数据节制着哆嗦逻辑,以孕育发生各类灰度和彩色旌旗灯号并从LCD数据引脚输出。

显示屏

LCD选择Kyocera公司的7.7英寸STN型LCD。该LCD可在640×480分辨率的环境下供给12位彩色显示。该屏为双屏扫描模式,具有两个8位的数据通道,每种基色都由4位的哆嗦逻辑来孕育发生15级灰度,是以可以显示最多153=3375种可能的颜色。

驱动LCD的设计

帧缓冲设备

帧缓冲设备为图像硬件设备供给了一种抽象化处置惩罚。它代表了一些视频硬件设备,容许利用软件经由过程界说明确的界面来造访图像硬件设备。这样软件无需懂得任何涉及硬件底层驱动的器械(如硬件寄存器)。它容许上层利用法度榜样在图形模式下直接对显示缓冲区进行读写和I/O节制等操作。经由过程专门的设备节点可对该设备进行造访,如/dev/fb*。

Linux下可支持多个帧缓冲设备,最多可达32个,即从/dev/fb0到/dev/fb31。平日环境下,缺省的帧缓冲设备为/dev/fb0。

在SA1110处置惩罚器的LCD节制器操作中,帧缓冲器用于寄放整个屏幕的所有编码像素数据。在它的最低位地址处是32或512字节的缓冲器,用来寄放调色板数据表。32位缓冲器用于4、12或16位像素编码的16项调色板;512字节缓冲器用于装入8位像素编码的256项调色板。在12或16位像素编码时,不应用调色板,此时的帧缓冲器的肇端32字节必须填入全零。

主要布局体

struct fb_fix_screeninfo中记录了帧缓冲设备和指定显示模式的弗成改动信息。它包孕了屏幕缓冲区的物理地址和长度。

struct fb_var_screeninfo中记录了帧缓冲设备和指定显示模式的可改动信息。它包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。此中变量xres定义了屏幕一行所占的像素数,yres定义了屏幕一列所占的像素数,bits_per_pixel定义了每个像素用若干个位来表示。

struct fb_info是Linux为帧缓冲设备定义的驱动层接口。它不仅包孕了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一fb_info布局相对应。此中成员变量modename为设备名称,fontname为显示字体,fbops为指向底层操作的函数的指针。

Linux内核设置设置设备摆设摆设与编译

应用下面的敕令启动Linux内核设置设置设备摆设摆设对象:

#make menuconfig

启动如下内核选项,选择对应的选项之后,履行下面的敕令:

Console drivers --->

Frame-buffer support--->

[*] Support for frame buffer devices (EXPERIMENTAL)

[*] SA-1100 LCD support (NEW)

[*] Advanced low level driver options (NEW)

[*] 16 bpp packed pixels support (NEW)

[*] Select compiled-in fonts (NEW)

[*] VGA 88 font

#make dep

#make zImage

驱动帧缓冲的设计

帧缓冲设备属于字符设备,采纳了“文件层-驱动层”的接口要领。Linux为帧缓冲设备定义的驱动层接口为struct fb_info布局。在文件层次上,Linux为其定义了下面的操作函数:

static struct file_operations fb_fops = {

owner: THIS_MODULE,

read: fb_read, /* 读操作*/

write: fb_write, /* 写操作*/

ioctl: fb_ioctl, /* 节制操作*/

mmap: fb_mmap, /* 映射操作*/

open: fb_open, /* 打开操作*/

release: fb_release, /*关闭操作*/

};

利用法度榜样层对帧缓冲设备的造访同对文件的造访操作类似。在利用法度榜样中,对帧缓冲设备(dev/fb)的操作只需调用文件层的操作函数。首先打开/dev/fb设备文件;随后用ioctl操作取得屏幕的分辨率和bpp值,从而谋略出屏幕缓冲区的大年夜小,并将屏幕的缓冲区映射到用户空间;着末就可直接对屏幕缓冲区进行图片显示。

嵌入式Linux操作系统对帧缓冲的初始化进口在fbmem.c中的如下定义:

static struct {

const char *name;

int (*init)(void);

int (*setup)(char*);

} fb_drivers[ ]__initdata = {

#ifdef CONFIG_FB_YOURCARD

{ "driver_name", xxxfb_init, xxxfb_setup },

#endif

经由过程该进口可进入帧缓冲的初始化函数。下面是对全部帧缓冲的实现历程。

首先,根据所选择的STN型LCD先初始化显示屏幕的分辨率(640×480)、每个像素的比特数(实际所选的LCD为12bpp,但在设计中可作为16bpp来设计。这是因SA1110的LCD节制器对两者处置惩罚要领相同而只有色彩深度的比例不合的缘故)和各类时序值。随后这些值将会被写入LCD节制器的节制寄存器LCCR0到LCCR3内,即完成对LCD节制器内一部分寄存器的设置设置设备摆设摆设。特殊的一点,由于所选的LCD是12bpp显示,以是rgbt色彩的深度比值应为4:4:4:0。

其次对LCD进行显示缓冲区的分配。该历程由kmalloc函数实现动态分配一片继续的空间,必要分配的缓冲区大年夜小为600K字节。缓冲区是在SDRAM平分配大年夜容量的地址,存储器映射至SA1110内,此中上半屏肇端地址保存到LCD节制器的寄存器DBAR1中,下半屏肇端地址保存到DBAR2中。在此完全初始化一个fb_info布局,添补此中的各成员变量。之落后行中断处置惩罚哀乞降各类变量和调色板等的设置。然后注册驱动法度榜样,经由过程调用register_framebuffer(&fb_info)实现将fb_info挂号入内核。着末,启动GPIO9~2和LCD节制器。

效果

由于该设计将驱动作为内核的一部分,而不是模块加载的要领,以是需从新编译内核,并将新编译的Linux内核下载到开拓板内。从新启动系统后,经由过程利用法度榜样检测,可以使屏幕显示随意率性所需图片,注解了驱动LCD显示的设计已成功实现。

在对嵌入式Linux系统进行驱动LCD的开拓时,不仅涉及到对开拓板的懂得(分外是微处置惩罚器和外围接口),还要求纯熟设置设置设备摆设摆设Linux内核、掌握Linux的全部系统启动历程和Linux下开拓设备驱动法度榜样历程,同时开拓职员还需掌握所开拓的LCD技巧资料。本文详细的先容驱动LCD历程中驱动帧缓冲的设计。该设计的实现使得此LCD可利用在嵌入式开拓的多种领域,是以具有实用代价。

您可能还会对下面的文章感兴趣: