LCD驱动程序移植

对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


下面为一些常规用法:





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【ql君】qlexcel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值