4 显示模块软件设计方案
4.1 Linux下LCD驱动程序开发
在Linux内核中,设备驱动程序是一个个独立的“黑盒子”,可以使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐藏了设备的工作细节,用户操作只需要通过一组标准化的调用即可完成。把这些调用映射到设备特定的操作上,则是设备驱动程序的任务。而每一个设备都可以看作是一个文件,所以打开的设备在内核中都可以由一个File结构标识,内核使用File_operations结构访问驱动程序的函数。每个文件(设备)都与它自己的函数集相关联。这些操作函数主要负责上面所提到的系统调用的实现,并因此被命名为open、read、fork、ioctl等。
LCD控制器的功能是显示驱动信号,进而驱动LCD。用户只需要通过读写一系列的寄存器,就可以配置和显示驱动。配置LCD控制器时,最重要的一步是帧缓冲区(FrameBuffer)的指定。帧缓冲区为图像硬件设备提供了一种抽象化处理,它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。用户程序只需与帧缓冲驱动程序抽象出来的接口打交道,就可以把要显示的内容从缓冲区中读出,从而显示到屏幕上。
在FrameBuffer驱动程序中,最核心的结构体是帧缓冲区驱动程序接口,即struct fb_info。它记录了当前FrameBuffer硬件设备的状态,通常在Linux的include/Linux/fb.h中定义。最主要的结构体有:Struct fb_fiX_sereeninfo,定义显示输出设备自身的属性,如屏幕缓冲区的物理地址和长度;Struct fb_var_screeninfo,记录帧缓冲设备和指定显示模式的可修改信息,包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。
若要先设定帧缓冲区的物理地址和长度,就要在S1D13506.h里指定,然后在驱动程序里通过对fb_fix_screeninfo赋值来实现:
定义当前显示输出状态,通过对fb_var_screeninfo结构赋值来实现:
Linux下驱动程序总是先调用module_init(),因此LCD初始化通过调用module_init(sldl3xxxfb_init)来实现。sldl3xxxfb_init初始化函数部分代码如下: