首先对LCD的背光灯进行点亮。LCD显示是一种被动的显示模式,不能发光,只能依靠控制透射或反射周围环境的光来达到显示的目的。因此,必须通过写寄存器用高电平指示对LCD加3.2 V电压来实现背光灯的点亮。其函数的部分代码如下:
系统采用的彩色LCD最佳分辨率是800×600,但通过前面对结构Struct fb_var_screeninfo的赋值并不能真正设定其分辨率。因为结构Struct fb_var_screeninfo的值只是作为一个显示记录来用,必须通过设定寄存器的值才能达到需要的分辨率。本系统在S1D13506.h头文件里用一个数组对寄存器的设置作了一个预定义,然后在初始化函数里利用sldReg和sldValue两个实参写入,从而设定了寄存器的值。
数组里每个元素的第1个值代表寄存器的名称,第2个值代表要设定的数值(1个十六进制的数)。32h寄存器用于设定LCD显示的水平像素数目,计算方法是把第2个值转换成十进制,加1再乘以8就得出水平像素。例如,0x63换算成十进制为99,加1乘以8就是800。38h和39h寄存器分别设置成0x57和Ox02,就可以显示600的垂直分辨率。计算方法是以39h寄存器的bitO和bitl位为高位,38h寄存器的bit0~bit7为低位,组成的一个十六进制的数,再转换成十进制。除了要修改这3个寄存器外,34h和3Ah这两个寄存器也会对显示的分辨率有影响。
帧缓冲设备也属于字符设备,要通过“文件层一驱动层”的接口方式来对LCD进行驱动,就必须对File_operationes数据结构的参数fh_ops进行填充,并实现其对应的成员函数。本系统在include/Limix/fb.h中定义了帧缓冲区的文件操作,部分代码如下:
这个结构中的每一个字段都必须指向驱动程序中实现特定操作的函数。对于不支持的操作,对应的字段可以被置为NULL,或留到后续开发时再添加。本模块中实现特定操作的成员函数的代码如下: