高通8×25平台display模块总结

一、概述

1.1 简介

本文档主要包括LCD模块的驱动流程分析、Framebuffer相关知识、Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解。

1.2 开发环境

Android:4.0

Kernel: Linux3.0

Ubuntu:需要 10.04以及之后的版本

Gcc: 4.4.3 toolchain

1.3 硬件平台

Msm8x25,pmic(pm8029)

1.4 操作系统

Android:4.0, Kernel: 3.0

1.5 开发工具

VIM,SourceInsight,JTAG,ADB

二、LCD驱动流程分析

2.1 帧缓冲

2.1.1帧缓冲概念

帧缓冲(framebuffer)是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不必关系物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身来完成。对于帧缓冲设备而言,只要在显示缓冲区中与显示点对应的区域写入颜色值,对应的颜色会自动在屏幕上显示。帧缓冲为标准字符设备,主设备号为29,对应于/dev/fbn。

2.1.2 fb_info结构体

帧缓冲设备最关键的一个数据结构体是fb_info结构,为了便于记忆,简称FBI,这个机构体在fb.h文件中定义了。FBI中包括了关于帧缓冲设备属性和操作的完整描述,这个结构体的定义如下所示。

其中fb_ops、fb_var_screeninfo和fb_fix_screeninfo这三个结构极为重要。FBI的成员变量fbops为指向底层操作的函数指针,这些函数是需要驱动程序开发人员编写的,不过高通平台已经定义好这些接口了,我们只需了解下这些接口的功能,不必修改。

fb_var_screeninfo记录用户可修改的显示控制参数,包括屏幕分辨率和每个像素点的比特数。fb_var_screeninfo中的xres定义屏幕一行有多少个点,yres定义屏幕一列有多少个点,bits_per_pixel定义每个点用多少个字节表示。而fb_fix_screeninfo中记录用户不能修改的显示控制器的参数,如屏幕缓冲区的物理地址、长度。当对帧缓冲设备进行映射操作时,就是从fb_fix_screeninfo中取得缓冲区物理地址的。上述结构体都需要在驱动程序中初始化和设置,在后面的流程分析中会作具体的讲解。

2.1.3 帧缓冲设备驱动结构

从上图可以看出,注册framebuffer时需要用到fb_info结构体,fb_info结构体又包含了fb_ops结构体,而fb_ops结构体中的fb_read、fb_write用于应用层对framebuffer的读写操作,fb_mmap用于应用进程和framebuffer之间的内存映射,fb_ioctl用于应用层对framebuffer进行的一些控制操作,具体的操作会在后面的流程分析中讲到。fb_info结构中的fb_check_var和fb_set_par分别用于获取和设置framebuffer的显示参数。

2.2 LCD driver的注册以及framebuffer的建立

在分析LCD的流程时,从底层往上一层层的分析,这样更容易理解驱动层每一层的作用。

2.2.1 LCD驱动的注册以及LCDC device的创建

在注册LCD驱动前需要设置一些参数,包括分辨率大小、bpp、像素时钟频率等如下图,

在probe函数中会执行msm_fb_add_device这个接口,这个接口在msm_fb.c中定义,这个接口的功能就是传递LCD driver的相关参数并根据LCD的类型(这里假设是RGB接口)创建一个LCDC device,此外还会创建一个framebuffer结构体,并将其添加到全局的framebuffer列表fb_list里面。

2.2.2 MDP device的创建

如果心在远方,只需勇敢前行,梦想自会引路,

高通8×25平台display模块总结

相关文章:

你感兴趣的文章:

标签云: