单片机
返回首页

Linux帧缓冲设备驱动程序框架及图形界面GUI的移植

2024-11-11 来源:cnblogs

硬件平台

  S3C2410X是三星公司的基于ARM920T的S3C2410X芯片。S3C2410X集成了一个LCD控制器(支持STN和TFT带有触摸屏的液晶显示屏)、SDRAM、触摸屏、USB、SPI、SD和MMC等控制器,4个具有PWM功能的计时器和1个内部时钟,8通道的10位ADC,117位通用I/O口和24位外部中断源,8通道10位AD控制器,处理器工作频率最高达到203MHz。

  S3C2410中的LCD控制器可支持单色/彩色LCD显示器。支持彩色TFT时,可提供4/8/12/16位颜色模式,其中16位颜色模式下可以显示65536种颜色。配置LCD控制器重要的一步是指定显示缓冲区,显示的内容就是从缓冲区中读出的,其大小由屏幕分辨率和显示颜色数决定。文中采用的是台湾元太V16C6448ACTFT显示模块,在640*480分辨率下可提供16位彩色显示。

  Qt/Embedded底层支持分析

  Qt/Embedded的底层图形引擎是基于帧缓冲(Frame Buffer),帧缓冲是出现在2.2.x以上内核的版本当中的一种驱动程序接口。这种接口采用mmap系统调用,将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间以后,就可以直接进行读写操作了,而写操作可以立即反映在屏幕上。帧缓冲驱动程序是最重要的驱动程序之一,正是这个驱动程序才能使系统屏幕显示内容,其实现分为两个方面:一是对LCD及其相关部件的初始化,包括画面缓冲区的创建和对DMA通道的设置;二是对画面缓冲区的读写,具体到代码为read,write等系统调用接口。

  帧缓冲是Linux为图形设备提供的一个抽象接口,它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的、统一的。应用程序不必关心物理显存的位置、换页机制等等具体细节。这些都是由帧缓冲设备驱动来完成的。帧缓冲设备对应的设备文件通常为/dev/fb031,Linux的帧缓冲设备的驱动主要基于两个文件:

  1)linux/include/linux/fb.h;

  2)linux/drivers/video/fbmem.c。

  帧缓冲设备属于字符设备,采用“文件层-驱动层”的接口方式。

  帧缓冲设备在驱动层所要做的工作仅仅是对Linux为帧缓冲的驱动层接口fb-info进行初始化,然后调用这两个函数对其注册或注销。帧缓冲设备驱动层接口直接对LCD设备硬件进行操作,而fbmem.c可以记录和管理多个底层设备驱动。

  文件fbmem.c中定义了帧缓冲设备的文件层接口file-operations结构体,它对应用程序可见,该结构体的定义如下:

  staticstructfile-operationsfb-fops=

  {

  owner:THIS-MODULE,

  read:fb-read,/*读操作*/

  write:fb-write,/*写操作*/

  ioctl:fb-ioctl,/*控制操作*/

  mmap:fb-mmap,/*映射操作*/

  open:fb-open,/*打开操作*/

  release:fb-release,/*关闭操作*/

  };

  在这个结构体中功能函数open()和release()不需要底层的支持,而read(),write(),mmap()则需要调用fb-get-fix(),fb-get-var(),fb-set-var()(这些函数位于结构体fb-info中指针fbops指向的结构体变量中)等与底层LCD硬件相关的函数的支持。另一个功能函数是ioctl(),ioctl()是设备驱动程序中对设备的I/O通道进行管理的函数,应用程序应用ioctl()系统调用来调用fb-get-fix(),fb-get-var(),fb-set-var()等方法来获得和设置结构体fb-info中var,fix和cmap等变量的信息。在fbmem.c中给出了ioctl()命令和fb-info中结构体fb-ops的成员函数的对应关系如下:

  FBIOGET-VSCREENINFOfb-get-var

  FBIOPUT-VSCREENINFOfb-set-var

  FBIOGET-FSCREENINFOfb-get-fix

  FBIOPUTCMAPfb-set-cmap

  FBIOGETCMAPfb-get-cmap

  FBIOPAN-DISPLAYfb-pan-display

  用户应用程序只需要调用FBIOXXXX来操作LCD硬件。

  嵌入式图形界面GUI的移植

  交叉编译和移植Qt/Embedded

  文中采用了Trolltech公司的Qt/Embedded2.3.6自由版作为目标板Linux图形界面库。在交叉编译前需要先修改Qt/Embedded的配置文件,将GCC,G++编译器和链接器设置为前文编译安装的交叉编译工具链。接着是设置环境变量,如下:

  exportPATH=/opt/host/armv4l/bin:$PATH

  exportQTDIR=$PWD

  exportQTEDIR=$QTDIR

  exportLD-LIBRARY-PATH=$QTDIR/lib:$LD-LI2

  BRARY-PATH

  然后配置Qt/Embedded将Qt/Embedded配置为动态链接库,并支持JPEG,JIF图像格式,像素位数支持4,8,16,24。

  ./configure-xplatformlinux-arm-g++-shared-system-jpeg-gif-qvfb-depths4,8,16,24

  最后交叉编译后,/qt-2.3.6/lib路径下的生成EmbeddedQt的3个动态SO库,分别是libqte.so.2,libqte.so.2.3,libqte.so.2.3.6,将这些库文件拷贝到目标板文件系统中(/s3c2410pro/root/usr/qt/lib)。与此同时在/qt-2.3.6/examples生成了Qt/Embedded的一些示例应用程序(/s3c2410pro/root/usr/qt/examples/)。可以将一部分或全部程序拷贝到目标板文件系统。

  这样当开发板启动以后,就可以在嵌入式系统下运行基于Qt/Embedded的应用程序了。

  交叉编译和移植Qtopia

  消费电子设备而开发的综合应用平台,它是基于Qt/Em2bedded图形界面库。Qtopia包括了窗口操作系统、游戏和多媒体、输入法、工作辅助应用程序等特性。

  同Qt/Embedded交叉编译一样,首先需要先修改Qtopia的配置文件,将GCC,G++编译器和链接器设置为 前文编译安装的交叉编译工具链。

  接着是设置Qtopia环境变量,因为Qtopia是基于Qt/Embedded库的,因此需要方才交叉编译的动态链接库的支持,需要同时设置Qt的环境变量。

  exportQTDIR=/linuette/host/Qt/embedded/qt-2.3.6

  exportLD-LIBRARY-PATH=/usr/lib:/lib:$QTDIR/lib:

  $LD-LIBRARY-PATH

  exportQPEDIR=/linuette/host/Qt/qpe/qpe-1.6.2

  exportPATH=/opt/host/armv4l/bin:$PATH

  exportTMAKEPATH=/usr/lib/tmake/lib/qws/linux-linuette-g++

  最后配置Qtopia将Qtopia配置为动态SO库形式:

  ./configure-xplatformlinux-arm-g++-shared

  编译make

  此时会出现/bin/uic:Commandnotfound的错误,这是因为没有指定Qt/Embedded的uic工具,uic的工具是Qt专门用来将ui(ui文件是Qt图形界面文件,支持所见即所得)文件生成.h和.cpp文件的。这里可以直接使用Qt/X11的uic工具,方法如下:在/qt-2.3.6/bin目录下建立到RedHat9.0自带的QtX11的uic工具的链接。可以使用RedHat9.0下Qtdesigner(界面与Delphi相类似)的应用程序开发嵌入式系统下的所见即所得的图形界面应用程序。

  编译通过后会在Qt/Embedded的路径/qt-2.3.6/lib下生成libqpe1.6.2的动态链接库,同样将这些库文件拷贝到目标板文件系统中(/s3c2410pro/root/usr/qt/lib)。在目标板文件系统目录/s3c2410pro/root/usr下新建qpe文件夹,将/qpe-1.6.2/apps,/qpe-1.6.2/pics,/qpe-1.6.2/docs,/qpe-1.6.2/sounds复制到该文件夹下。最后修改目标板Linux的/profile文件,设置Qtopia的环境变量:

  exportPATH=/usr/qpe/bin:$PATH

  exportQWS-SIZE=6403480

  exportPATH=/usr/qpe/bin:$PATH

  开发板启动后就会运行Qtopia图形界面了。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 基于IC555的可变PWM振荡器电路

  • 优化电路板布局的简单方法

  • 如何使用LED驱动器LM3915制作振动计

  • 分享一个电网倾角计电路

  • 电谐波图形均衡器示意图

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章