Linux LCD驱动(四)--驱动的实现

目录(?)[-]

  1. 基本原理


  2. framebuffer 驱动程序要做什么

  3. LCD 模块
    驱动程序 控制器

  4. 什么是
    frame buffer 设备

  5. Linux
    Frame Buffer 驱动程序层次结构

    1. 数据结构

    2. 接口

  6. 一个 LCD
    controller 驱动程序

    1. 分配系统内存作为显存

    2. 实现
      fb_ops 结构

基本原理


  • 通过 framebuffer ,应用程序用 mmap
    把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来;

  • 驱动程序分配系统内存作为显存;实现 file_operations 结构中的接口,为应用程序服务;实现 fb_ops 结构中的接口,控制和操作
    LDC 控制器;

  • 驱动程序将显存的起始地址和长度传给 LCD 控制器的寄存器 (一般由 fb_set_var 完成) , LDC 控制器会自动的将显存中的数据显示在
    LCD 屏上。

写 framebuffer 驱动程序要做什么


  • 简单的讲,framebuffer 驱动的功能就是分配一块内存作显存,然后对 LCD 控制器的寄存器作一些设置。

  • 具体来说:
    1. 填充一个 fbinfo 结构

    2. 用 reigster_framebuffer (fbinfo*) 将 fbinfo 结构注册到内核

  • 对于 fbinfo 结构,最主要的是它的 fs_ops 成员,需要针对具体设备实现 fs_ops 中的接口

  • 考虑是否使用中断处理

  • 考虑内存访问方式
    1. 显卡不自带显存的,分配系统内存作为显存

    2. 显卡自带显存的,用 I/O 内存接口进行访问 (request_mem_region / ioremap),

  • 关于如何写驱动的参考资料,在网站 http: /linux-fbdev.sourceforge.net/HOWTO/index.html 可以找到
    "Linux Frame buffer Driver Writing HOWTO"

LCD 模块 \ 驱动程序 \ 控制器

关于LCD 设备资料可参考如下资料:

  • Datasheet of LCD device

  • 书:液晶显示技术

  • 书:液晶显示器件

什么是 frame buffer 设备

frame buffer 设备是图形硬件的抽象,它代表了图形硬件的侦缓冲区,允许应
用程序通过指定的接口访问图形硬件。因此,应用程序不必关心底层硬件细节。

设备通过特定的设备节点访问,通常在 /dev 目录下,如 /dev/fb*。

更多关于 frame buffer device 的资料可以在以下两个文件中找到: linux
/Documentation/fb/framebuffer.txt 和 linux /Documentation/fb
/interal.txt,但这些资料内容不多,还需要看看结合代码具体分析。

Linux Frame Buffer 驱动程序层次结构

Frame Buffer 设备驱动可以从三个层次来看:

  1. 应用程序与系统调用;

  2. 适用于所有设备的通用代码,避免重复,包括 file_operations 结构、register/unregister framebuffer
    接口等;

  3. 操作具体硬件的代码,主要是 fs_ops 结构。

在 Linux 内核中,Frame Buffer 设备驱动的源码主要在以下两个文件中,它们 处于 frame buffer
驱动体系结构的中间层,它为上层的用户程序提供系统调用, 也为底层特定硬件驱动提供了接口:

  1. linux/inlcude/fb.h

  2. linux/drivers/video/fbmem.c

数据结构

头文件 fb.h 定义了所有的数据结构:

  • fb_var_screeninfo:描述了一种显卡显示模式的所有信息,如宽、高、颜色深度等,不同的显示模式对应不同的信息;

  • fb_fix_screeninfo:定义了显卡信息,如 framebuffer 内存的起始地址,地址长度等;

  • fb_cmap:设备独立的 colormap 信息,可以通过 ioctl 的 FBIOGETCMAP 和 FBIOPUTCMAP 命令设置
    colormap;

  • fb_info:包含当前 video card 的状态信息,只有 fb_info 对内核可见;

  • fb_ops : 应用程序使用 ioctl 系统调用操作底层的 LCD 硬件,fb_ops 结构中定义的方法用于支持这些操作;

  • 这些结构相互之间的关系如下所示:








framebuffer 驱动主要数据结构

接口

fbmem.c 实现了所有驱动使用的通用代码,避免了重复。

全局变量:

     struct fb_info *registered_fb [FB_MAX]
int num_registered_fb;

这个两个变量用于记录正在使用的 fb_info 结构实例。fb_info 代表 video card 的当前状态,所有的 fb_info
结构都放在数组中。当一个 frame buffer 在内核中登记时,一个新的 fb_info 结构被加入该数组,num_registered_fb 加
1。

fb_drivers 数组:

static struct {
const char *name;
int (*init)(void);
int (*setup)(void);
} fb_drivers[] __initdata= { ....};


若 frame buffer 驱动程序是静态链接到内核中,一个新的 entry 必须要加到这个表中。 若该驱动程序是使用 insmod/rmmod
动态加载到内核,则不必关心这个结构。

static struct file_operations fb_ops ={
owner: THIS_MODULE,
read: fb_read,
write: fb_write,
ioctl: fb_ioctl,
mmap: fb_mmap,
open: fb_open,
release: fb_release
};

这是用户应用程序的接口,fbmem.c 实现了这些函数。

register/unregister framebuffer:

 register_framebuffer(struct fb_info *fb_info)
unregister_framebuffer(struct fb_info *fb_info)

这是底层 frame buffer 设备驱动程序的接口。驱动程序使用这对函数实现注册和撤销操作。底层驱动程序的工作基本上是填充 fb_info
结构,然后注册它。

一个 LCD controller 驱动程序

实现一个 LCD controller 驱动程序主要做如下两步:

  • 分配系统内存作显存

  • 根据具体的硬件特性,实现 fb_ops 的接口

  • 在 linux/drivers/fb/skeletonfb.c 中有一个 frame buffer 驱动程序的框架,它示例了怎样用很少的代码实现一个
    frame buffer 驱动程序。

分配系统内存作为显存

由于大多数 LDC controller 没有自己的显存,需要分配一块系统内存作为显存。 这块系统内存的起始地址和长度之后会被存放在
fb_fix_screeninfo 的 smem_start 和 smem_len 域中。该内存应该是物理上连续的。

对于带独立显存的显卡,使用 request_mem_region 和 ioremap 将显卡外设内存映射到处理器虚拟地址空间。

实现 fb_ops 结构

目前还没有讨论的 file_operations 方法是 ioctl ()。用户应用程序使用 ioctrl 系统调用操作 LCD 硬件。fb_ops
结构中定义的方法为这些操作提供支 持。注意, fb_ops 结构不是 file_operations 结构。fb_ops 是底层操作的抽 象,而
file_operations 为上层系统调用接口提供支持。

下面考虑需要实现哪些方法。ioctl 命令和 fb_ops 结构中的接口之间的关系如 下所示:

    FBIOGET_VSCREENINFO fb_get_var
FBIOPUT_VSCREENINFO fb_set_var
FBIOGET_FSCREENINFO fb_get_fix
FBIOPUTCMAP fb_set_cmap
FBIOGETCMAP fb_get_cmap
FBIOPAN_DISPLAY fb_pan_display

只要我们实现了那些 fb_XXX 函数,那么用户应用程序就可以使用 FBIOXXXX 宏 来操作 LDC 硬件了。那怎么实现那些接口呢?可以参考下
linux/drivers/video 目录下的驱动程序。

在众多接口中, fb_set_var 是最重要的。它用于设置 video mode 等信息。下 面是实现 fb_set_var 函数的通用步骤:

  1. 检查是否有必要设置 mode

  2. 设置 mode

  3. 设置 colormap

  4. 根据上面的设置重新配置 LCD controller 寄存器

其中第四步是底层硬件操作。

模板:

1、第1部分:

a.将LCD设备注册到系统平台设备中;

b.定义LCD平台设备结构体lcd_fb_driver。

2、第2部分:

a.获取和设置LCD平台设备的各种资源;

b.分配fb_info结构体空间;

c.初始化fb_info结构体中的各参数;

d.初始化LCD控制器;

e.检查fb_info中可变参数;

f.申请帧缓冲设备的显示缓冲区空间;

g.注册fb_info。

3、第3部分:

a.实现对fb_info相关参数进行检查的硬件接口函数;

b.实现对LCD显示模式进行设定的硬件接口函数;

c.实现对LCD显示开关(空白)的硬件接口函数等。

转载于http://www.linuxgraphics.cn/graphics/writing_lcd_driver.html

Linux LCD驱动(四)--驱动的实现,码迷,mamicode.com

时间: 2024-10-26 19:52:44

Linux LCD驱动(四)--驱动的实现的相关文章

Linux LCD驱动(三)--图形显示

3.  BMP和JPEG图形显示程序3.1  在LCD上显示BMP或JPEG图片的主流程图首先,在程序开始前.要在nfs/dev目录下创建LCD的设备结点,设备名fb0,设备类型为字符设备,主设备号为29,次设备号为0.命令如下:mknod fb0 c 29 0在LCD上显示图象的主流程图如图3.1所示.程序一开始要调用open函数打开设备,然后调用ioctl获取设备相关信息,接下来就是读取图形文件数据,把图象的RGB值映射到显存中,这部分是图象显示的核心.对于JPEG格式的图片,要先经过JPE

4 linux lcd驱动框架分析

4 linux lcd驱动框架 Linux内核中lcd的驱动是基于帧缓冲framebuffer驱动框架设计的.帧缓冲framebuffer框架是在linux2.2.xx以后的版本中为显示设备提供的一种驱动程序接口,它将显示缓冲区framebuffer进行抽象,屏蔽掉硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区framebuffer进行读写和I/O控制操作.Framebuffer机制模仿显卡的功能,将显卡硬件抽象为一系列的数据结构,通过framebuffer的读写实现对显存的操作.

【转】 linux内核移植和驱动添加(三)

原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED驱动的添加 1, 将led.c驱动文件拷贝到linux-3.1.4/drivers/char/目录下 [email protected]# pwd /change/linux-3.1.4/drivers/char [email protected]#  cp /mnt/hgfs/fh/driver/

【L】小米随身WiFi,Linux下AP热点驱动(开源)

前言 这是作者修改后的Linux下的小米随身WiFi驱动,支持Ap模式,开源,同时支持360随身WiFi二代 注意: 1.这个是Linux下的小米随身WiFi驱动,不是Window和MAC下 2.这个不是STA模式下的可当作无线网卡的驱动,是可当Ap热点模式的驱动 3.这个理论上也是支持360随身WiFi二代..(rtusb_dev_id.c 里面同样有360的id) 原由: 小米随身WiFi很好用,有Widnow和Mac的系统的驱动, 但是可怜不少Linux下的苦逼开发者,没有驱动就是没有..

[转载]嵌入式开发板-iTOP-4412开发板LCD的屏幕驱动

平台:iTOP-4412开发板 大家好今天我们来讲一下 iTOP-4412 开发板 LCD 的屏幕驱动, iTOP-4412 开发板支持 4.3 寸, 7 寸, 9.7寸的 lcd 显示屏.其中 4.3 寸屏是用的 cpu 直接出来的 RGB 信号,7 寸屏和 9.7 寸屏是用的 LVDS 信号,硬件 上 使 用 了 一 个 RGB 转 LVDS 的 芯 片 实 现 的 . 我 们 来 看 下 显 示 驱 动 , 显 示 驱 动 在 内 核 的"drivers/video/samsung&quo

【详解】如何编写Linux下Nand Flash驱动

From: http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 版本:v2.2 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开始介绍Linux下面和Nand Flash相关的软件架构MTD的相关知识,最后介绍了

[迅为开发板资料分享]iTOP-4412开发板LCD的屏幕驱动

大家好今天我们来讲一下 iTOP-4412 开发板 LCD 的屏幕驱动, iTOP-4412 开发板支持 4.3 寸, 7 寸, 9.7寸的 lcd 显示屏.其中 4.3 寸屏是用的 cpu 直接出来的 RGB 信号,7 寸屏和 9.7 寸屏是用的 LVDS 信号,硬件 上 使 用 了 一 个 RGB 转 LVDS 的 芯 片 实 现 的 . 我 们 来 看 下 显 示 驱 动 , 显 示 驱 动 在 内 核 的"drivers/video/samsung" 目录下面, 这个驱动是三星

Linux SD/MMC/SDIO驱动分析_转

转自:Linux SD/MMC/SDIO驱动分析    https://www.cnblogs.com/cslunatic/p/3678045.html#3053341 一.SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(MultimediaCard) SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代.在维基百科上有相当详细的 SD/MMC 规格说明:[htt

Linux下 USB设备驱动分析(原创)

之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB枚举过程:https://blog.csdn.net/go_str/article/details/80802452 USB其它概念: (1)usb是主从结构,usb的传输都是主机发起: (2)usb右四种传输类型:控制.批量.中断.实时传输. (3)usb数据是通过端点进行通讯的,0端点既能输入也