Linux下的FrameBuffer驱动框架

本文介绍了Linux系统下的FrameBuffer驱动框架,详细讲解了RGB LCD显示器件,并深入探讨了FrameBuffer驱动的底层源码分析。
一、RGB LCD经典显示器件介绍
1、LCD屏幕的重要属性参数
① 分辨率:也就是屏幕上的像素点的个数;
② 像素格式:即单个像素点RGB三种颜色的表达方式,包括RGB888、ARGB8888和RGB565等。
③ LCD屏幕硬件接口这里指的是RGB LCD排线接口如下图所示
R[7:0]、G[7:0]和B[7:0]这24根是数据线,DE、VSYNC、HSYNC和PCLK这四根是控制信号线 。RGB LCD一般有两种驱动模式DE模式和HV模式,这两个模式的区别是DE模式需要用到DE信号线,而HV模式不需要用到DE信号线, 在DE模式下是可以不需要HSYNC信号线的( DE与HSYNC功能相同 ,即使不接HSYNC信号线LCD也可以正常工作。
///////////////////////////////////////////////////////////////////////////////////////////////////////////
2、LCD的时间参数:( 重要
       如果将LCD显示一帧图像的过程想象成绘画,那么在显示的过程中就是用一根“笔”在不同的像素点画上不同的颜色。 这根笔按照 从左至右、从上到下 的顺序扫描每个像素点,并且在像素画上对应的颜色,当画到最后一个像素点的时候一幅图像就绘制好了。 假设一款LCD屏幕的分辨率为1024*600,如下图所示
       HSYNC是水平同步信号,也叫做行同步信号,当产生此信号的话就表示开始显示新的一行数据; VSYNC信号是垂直同步信号,也叫做帧同步信号,当产生此信号的话就表示开始显示新的一帧图像了。 当显示完一行以后会发出HSYNC信号,此时电子枪就会关闭,然后迅速的移动到屏幕的左边,当HSYNC信号结束以后就可以显示新的一行数据了,电子枪就会重新打开在HSYNC信号结束到电子枪重新打开之间会插入一段延时,这段延时就图 50.1.5中的HBP;当显示完一行以后就会关闭电子枪等待HSYNC信号产生,关闭电子枪到HSYNC信号产生之间会插入一段延时,这段延时就是图 50.1.5中的HFP信号。同理, 当显示完一帧图像以后电子枪也会关闭,然后等到VSYNC信号产生期间也会加入一段延时,这段延时就是图 50.1.5中的VFP;VSYNC信号产生,电子枪移动到左上角,当VSYNC信号结束以后电子枪重新打开,中间也会加入一段延时,这段延时就是图 50.1.5中的VBP
///////////////////////////////////////////////////////////////////////////////////////////////////////////
3、RGB LCD屏幕的时序( 底层核心
① 行显示的时序
HSYNC:行同步信号,当此信号有效的话就表示开始显示新的一行数据,查阅所使用的LCD数据手册可以知道此信号是低电平有效还是高电平有效, 假设此时是低电平有效
HSPW:有些地方也叫做thp,是HSYNC信号宽度, 也就是HSYNC信号持续时间。HSYNC信号不是一个脉冲,而是需要持续一段时间才是有效的, 单位为CLK
HBP:有些地方叫做thb,前面已经讲过了,术语 叫做行同步信号后肩单位是CLK
HOZNAL:有些地方叫做thd, 显示一行数据所需的时间,假如屏幕分辨率为1024*600,那么HOZVAL就是1024, 单位为CLK
HFP:有些地方叫做thf,前面已经讲过了,术语叫做行 同步信号前肩单位是CLK
    显示一行所需要的时间就是:HSPW + HBP + HOZVAL + HFP。单位:CLK。
② 帧显示的时序
VSYNC帧同步信号,当此信号有效的话就表示开始显示新的一帧数据,查阅所使用的LCD数据手册可以知道此信号是低电平有效还是高电平有效, 假设此时是低电平有效
VSPW:些地方也叫做tvp,是VSYNC信号宽度,也就是 VSYNC信号持续时间单位为1行的时间( 多少个HSYNC
VBP:有些地方叫做tvb,前面已经讲过了,术语叫做 帧同步信号后肩单位为1行的时间
LINE:有些地方叫做tvd, 显示一帧有效数据所需的时间,假如屏幕分辨率为1024*600,那么LINE就是600行的时间。 单位是1行的时间
VFP:有些地方叫做tvf,前面已经讲过了,术语叫做 帧同步信号前肩单位为1行的时间
      显示一帧所需要的时间就是:VSPW+VBP+LINE+VFP个行时间。
显示完整一帧图像的 clk时间 :T = (VSPW+VBP+LINE+VFP) * (HSPW + HBP + HOZVAL + HFP)。
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
二、Linux的FrameBuffer驱动框架
1、驱动框架的介绍
        帧缓冲(framebuffer)是Linux为显示设备提供的一个接口, 把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。所以在Linux系统中,凡是显示设备都被称为FrameBuffer设备(帧缓冲设备),所以LCD自然而言就是FrameBuffer设备。
         FrameBuffer设备对应的设备文件为/dev/fb*Linux下可支持多个FrameBuffer设备,最多可达32个,分别为/dev/fb0到/dev/fb31,如果没有指定系统所使用的显示设备,通常指向/dev/fb0,在嵌入式系统中支持一个显示设备就够了。在Linux系统中,FrameBuffer设备为标准字符设备,主设备号为29,次设备号则从0到31。分别对应/dev/fb0-/dev/fb31。
        在Linux系统中,FrameBuffer设备也有对应的设备驱动框架,我们把它叫做FrameBuffer驱动框架,所以Linux下编写LCD驱动我们就可以使用FrameBuffer驱动框架。 FrameBuffer驱动架构其实也是基于字符设备驱动来开发的,其内核源码位置在 drivers/video/fbdev/core/fbmem.c中。 其原理大概如下
① 内核源码基于字符设备驱动 在/dev目录下挂载fbxx设备,其 主设备号为29,此设备0~31
② 最多允许同时存在32个显示设备
③ 在字符设备的file_operations中, 实现了open、release、read、write以及memey、ioctl等函数
④ 这些函数其本质是调用了内核链表的一种 结构体对象struct fb_info
⑤ 作为驱动开发者,实际上 我们就是要描述并挂载一个struct fb_info对象,并初始化配置一下外设
////////////////////////////////////////////////////////////////////////////////////////////////////////////
2、LCD驱动开发的基本流程( 基于ZYNQ开发板
① 根据实际电路结构,在设备树上创建设备节点,比如:DMA、pclk、gpio、lcd外设驱动等;
② 在设备树上 按照内核的规定格式,描述lcd显示器件,包括lcd的 刷新频率、分辨率、像素格式等参数
③ 在设备树上描述的 LCD设备,需要基于某个CPU总线来扩展
④ 编写 基于platform_device的驱动程序,匹配设备树上的lcd设备节点;
⑤ 使用 函数接口 framebuffer_alloc动态创建一个struct fb_info对象,同时也为自定义结构体动态申请内存空间;
⑥ 先从设备节点上 获取lcd的pclk时钟( devm_clk_get函数 ,并调用 函数 clk_disable_unprepare先禁止时钟输出;
⑦ 从设备树上获取到lcd的属性参数描述信息( timingxx节点),并 返回到结构体struct videomode
⑧ 调用 函数 dma_alloc_wc获取lcd的dma对应的DDR物理缓存地址和虚拟地址;
配置struct fb_ops结构体,指定设备读写操作函数的具体实现,其中, 有些功能函数内核已经提供drivers/video/fbdev/core/cfbfillrect.c)可以直接引用;
⑩ 开始根据LCD的属性, 配置struct fb_info配置内容包括:显存缓存地址、LCD的fb_fix_screeninfo固定参数、LCD的fb_var_screeninfo动态参数;
11 调用函数fb_alloc_cmap来为lcd分配载流数据, 目前无法确定载流输出是啥
12 为显示设备的16色彩调色板动态分配内存空间;
13 设置LCD的pclk时钟KHz数值,并启动;
14 根据实际电路需求,配置vtc外设和dma外设,DMA外设配置有内核提供的架构可以使用;
15 调用函数 register_framebuffer,向内核注册struct fb_info对象;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值