Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90455
  • 博文数量: 17
  • 博客积分: 408
  • 博客等级: 一等列兵
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-24 10:11
文章分类
文章存档

2012年(1)

2011年(16)

分类: LINUX

2011-10-03 10:26:24

1 Linux下设备驱动程序

驱动程序从字面上可以理解为一类程序,这类程序的目的一般是驱动硬件正常工作,所以通常所说的驱动程序都是针对特定的硬件来编写的。Linux设备驱动程序是为特定的硬件提供给用户程序的一组标准化接口,它隐藏了设备工作的细节。Linux系统下驱动程序是运行在内核态的,是和内核连接在一起的程序。如果运行在用户态的应用程序想控制硬件设备,必须通过驱动程序来控制。

Linux系统的设备分为3种类型,分别是字符设备、块设备和网络设备。文中所涉及的LCD驱动属于字符型设备驱动程序。在对字符设备发出读、写请求时,实际的硬件I/O一般就紧接着发生了。Linux系统访问设备就像访问文件一样,例如打开关闭设备系统调用open()和close()函数。在Linux内核中,字符设备使用struct file_operations结构来定义设备的各种操作集合。编写字符设备驱动程序,主要是实现str-uct file_operations结构中的各个函数。

2 基于FFamebuffer的LCD驱动程序设计

2.1 LCD简介

设计中采用的嵌入式微处理器是Samsung公司的S3C2410,LCD控制器主要用于传输显示数据和产生控制信号,用户只需通过读写一系列寄存器即可完成配置和显示控制,图1是S3C2410平台LCD控制器的结构图。

其各个信号描述及功能如表1所示。


2.2 Framebutfvr概述

Framebuffer即帧缓冲,是图形设备的一个提取或抽象,他把一些视频设备描绘成一个缓冲区,允许应用程序通过Framebuffer所定义的良好接口访问图形设备。Framebuffer是出现在Linux2.2.xx内核当中的一种驱动程序接口。Linux工作在保护模式下,所以用户态进程无法像DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出Framebuffer这个设备供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象化,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象、统一的,用户不必关心物理显存的位置、换页机制等具体细节,这些由Framebuffer设备驱动完成。

2.3 驱动程序设计与实现

2.3.1 LCD驱动的模块加载与卸载

LCD作为一个相对独立的硬件单元,被认定为平台设备,在驱动模块加载和卸载函数中,就分别注册和注销对应的platform_driver。

2.3.2 LCD驱动的探测与移除函数

探测函数probe主要完成LCD控制器初始化的工作,包括对fb_info结构成员的初始化、内存分配、寄存器的配置、Framebuffer的注册等。模块卸载函数中对平台驱动的注销会导致其中移除函数的执行,这个函数释放显示缓冲区并注销帧缓冲设备。

2.3.3 LCD驱动的fb_ops成员函数

在程序设计里,定义LCD驱动的fb_ops结构体和相关函数功能如下所示

可以看出,fb_ops()结构体类似于file_opera tions()结构体,提供了一个帧缓冲设备的统一接口。s3c2410_ops()函数给出了标准接口到针对具体硬件操作函数的跳转指针。

2.3.4 Framebuffer设备驱动程序的设计

驱动程序主要完成的工作有以下5部分:

(1)编写初始化函数

Framebuffer驱动首先要初始化LCD控制器,通过相关寄存器来设置LCD相对应的显示模式和颜色数,然后分配显示缓冲区。通常用vmall-oc()函数分配一段连续空间,缓冲区的大小可以用“点阵行数×点阵列数×一个像素的位数/8”计算得到。

如果使用模块化加载方式,加载LCD驱动模块时,系统调用fb_init()函数。卸载LCD驱动模块时,系统首先调用unregister_framebuffer()取消注册,然后释放显示缓冲区的内存。

(2)编写成员函数

主要负责编写fb_ops()对应的底层操作函数。

(3)读/写(read/write)

完成对帧缓冲区的读写操作。

(4)映射(map)

Linux有内核空间和用户空间,平时工作在保护模式,每个应用程序进程都有自己的虚拟地址空间,应用程序不能直接访问物理缓冲地址。但是,Linux在文件操作接口(file_operations)中提供了地址映射(mmap)操作,它可以将文件的内容映射到用户空间,这样用户就可以通过读写这段地址来访问缓冲区,并在屏幕上绘图。

(5)输入/输出控制

设备文件的ioctl()调用可以读取和设置显示设备的参数,如分辨率、支持颜色数、屏幕大小等

阅读(2175) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~