对LCD的操作可以像串口一样,通过终端设备层的封装(/dev/tty*设备)来输出内容,也可以通过frame buffer(/dev/fb*设备)直接在显存上“绘制”图像。
tty(终端设备)和frame buffer驱动程序的框架:
下面根据每层的文件讲解一下上图:
1)显示驱动程序
2)键盘驱动程序
2.操作实例
1)对/dev/tty*调用write函数的过程
2)USB键盘被按下的函数调用过程
开始移植程序
从前面的框架图可知,架构相关的代码为drivers/video/s3c2410fb.c,移植思想是一样的:先确定LCD控制器所用的资源,然后把它们加入平台设备结构,最后修改代码使这些资源可用。
1.平台设备结构
2.底层驱动代码分析及修改
s3c2410fb_probe函数完成初始化LCD控制器、注册中断处理函数、注册frame buffer设备等工作,流程图如下:
在这个函数中,与开发板相关的就是mach_info结构。他是平台设备s3c_device_lcd结构中的dev.platform_data成员。对于S3C2440,开发板初始化函数smdk2440_machine_init调用s3c24xx_fb_set_platdata函数来设备;对于S3C2410,没有设置。
smdk2440_machine_init函数在arch/arm/mach-s3c2440/mach-smdk2440.c中,如下:
smdk2440_lcd_cfg结构表示LCD控制器的一些配置,比如分辨率、时间特性等,在后面会有详细描述。
s3c24xx_fb_set_platdata函数在arch/arm/plat-s3c24xx/devs.c中,它直接将参数smdk2440_lcd_cfg赋给设备平台设备s3c_device_lcd结构中的dev.platform_data成员。代码如下:
所以,对于S3C2440,需要修改smdk2440_lcd_cfg结构;对于S3C2410,仿照S3C241增加一个smdk2410_lcd_cfg结构,并调用s3c24xx_fb_set_platdata函数来设置它。
smdk2440_lcd_cfg是s3c2410fb_mach_info类型的数据结构,这个类型在include/asm-arm/arch-s3c2410/fb.h文件中定义,如下:
第32行的fixed_syncs被设为1时表示“固定的”时间参数和边框大小,这意味着用户应用程序无法调整分辨率等参数。
第35行的type表示LCD的类型,从LCDCON1寄存器位[6:5]可以知道它有4种取值,如下:
第38、39行的width、height用来设置图像的宽度和高度,它们去取xres、yres的默认值。
下面修改代码:
1.对于S3C2440单板
2.对于S3C2410单板
3.配置内核以使用LCD
下面为一些常规用法: