`

Ubuntu Framebuffer学习笔记

阅读更多

 

Ubuntu Framebuffer学习笔记

 

一、环境搭建

1. 直接在Ubuntu上运行Framebuffer

默认Ubuntu是直接进入X视窗,如果要使用Framebuffer,

需要修改内核引导参数:

$ sudo gedit /etc/default/grub

查找

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

把它改为

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash text vga=0x311" 

这里text表示进入文本模式,vga=0x311表示使用Framebuffer显示驱动,

0x311是指示色深和分辨率的参数

  |640x480 800x600 1024x768 1280x1024

----+-------------------------------------

256 | 0x301   0x303 0x305 0x307

32k | 0x310   0x313 0x316 0x319

64k | 0x311   0x314 0x317 0x31A

16M | 0x312   0x315 0x318 0x31B

如果使用vga=0x311参数,必须使用后面提到的vesafb模块,并且取消黑名单,

否则无法进入系统,需要光盘启动删除vga参数以还原

$ sudo update-grub

写入到/boot/grub/grub.cfg

$ sudo gedit /etc/initramfs-tools/modules

在其中加入:vesafb

$ sudo gedit /etc/modprobe.d/blacklist-framebuffer.conf

用#注释以下行

# blacklist vesafb

$ sudo update-initramfs -u

(生成新的initrd)

然后重启机器,即可进入Framebuffer

如果要切换回X11,可以输入:

$ startx

有时候/boot/grub/grub.cfg的引导参数不正确导致系统无法引导,

可以用光盘引导系统,挂载硬盘后直接修改/boot/grub/grub.cfg文件

这样就可以跳过update-grub这一步。然后还原原有的引导参数进入X Window

2. 使用qemu虚拟Linux

需要编译Linux内核和busybox。

此外还需要libncurses-dev和qemu。

由于qemu可以直接加载内核和initrd,指定引导参数,

所以不需要修改grub配置。

(1)编译内核和安装qemu

$ tar xjf linux-2.6.39.2.tar.bz2

$ cd linux-2.6.39.2/

$ make help

$ make i386_defconf

$ sudo apt-get install libncurses-dev

$ make menuconfig

$ make

$ sudo apt-get install qemu

$ qemu --help

$ qemu -kernel arch/x86/boot/bzImage

$ qemu -kernel arch/x86/boot/bzImage -append "noapic"

有时候内核会这样崩溃:

MP-BIOS BUG 8254 timer not connected

trying to set up timer as Virtual Wire IRQ

所以需要添加-append "noapic"参数

(2) 修改内核配置,然后重新编译内核。

注意,不同内核版本的配置不一样,

我的内核配置作如下改动(用空格切换为*,不要切换为M):

$ make menuconfig

Device Drivers  --->  

Graphics support  --->   

-*- Support for frame buffer devices  --->  

[*]   VESA VGA graphics support 

因为VESA支持彩色色深的显示。

默认是不选的,只能是黑白控制台。

Input device support  ---> 

[*]     Provide legacy /dev/psaux device 

有些库如SDL在识别USB接口的鼠标时会寻找/dev/input/mice和/dev/psaux,

我发现我编译的内核没有前者,所以用这个选项制造出/dev/psaux设备。

File systems  --->  

[*] Miscellaneous filesystems  --->

<*>   Compressed ROM file system support (cramfs) 

个人喜欢cramfs,不过不是必须的,可以用这个开关编译cramfs驱动,

测试initramfs是否正常

General setup  ---> 

[*]   Support initial ramdisks compressed using gzip 

[*] Embedded system

默认i86内核的配置不支持gzip压缩的cpio格式initrd,所以需要手动打开它。

最后重新编译内核:

$ make

(3) 编译busybox

$ tar xjf busybox-1.18.5.tar.bz2

$ cd busybox-1.18.5/

$ make defconfig

$ make menuconfig

设置修改如下:

Busybox Settings  --->  

Build Options  --->

[*] Build BusyBox as a static binary (no shared libs)  

$ make 

$ make install

默认文件安装在当前目录的_install目录下。

(4) 制作cpio封包gzip压缩的initrd

$ cd ../busybox-1.18.5/_install/

$ mkdir proc sys dev etc etc/init.d tmp root usr lib

$ gedit etc/init.d/rcS

#!/bin/sh

mount -t proc none /proc

mount -t sysfs none /sys

/sbin/mdev -s

$ chmod +x etc/init.d/rcS

$ cd ../../linux-2.6.39.2/

$ gedit prerun.sh

#!/bin/sh

cd ../busybox-1.18.5/_install

find . | cpio -o --format=newc > ../rootfs.img

cd .. 

gzip -c rootfs.img > rootfs.img.gz

cd ../linux-2.6.39.2/

$ . prerun.sh

$ gedit run.sh

#!/bin/sh

qemu -kernel ./arch/i386/boot/bzImage -initrd ../busybox-1.18.5/rootfs.img.gz  -append "root=/dev/ram rdinit=/sbin/init vga=0x312 noapic"

注意这里用rdinit=,如果用init=就成了initramfs(内核会报告找不到合适的文件系统)

关于vga=的参数设置见前面(决定色深和分辨率)

$ . run.sh

编译程序,然后用上面写的prerun.sh打包进rootfs.img.gz,然后运行run.sh跑qemu即可。

如果程序是动态链接,需要特定的动态库,

可以把依赖的动态库复制到_install/lib目录下,打包到rootfs.img.gz中。

(5) 进入qemu的效果如下:

 


 

二、Framebuffer的应用开发

1. 基于/lib/fb*设备和mmap

这种方法灵活性差,开发比较费时。

这里有个示例代码:

http://www.kde.gr.jp/~ichi/qt/emb-framebuffer-howto.html

代码如下:

 

	#include <stdlib.h>
	#include <unistd.h>
	#include <stdio.h>
	#include <fcntl.h>
	#include <linux/fb.h>
	#include <sys/mman.h>

	int main()
	{
		int fbfd = 0;
		struct fb_var_screeninfo vinfo;
		struct fb_fix_screeninfo finfo;
		long int screensize = 0;
		char *fbp = 0;
		int x = 0, y = 0;
		long int location = 0;
		fbfd = open("/dev/fb0", O_RDWR);
		if (!fbfd) {
			printf("Error: cannot open framebuffer device.\n");
			exit(1);
		}
		printf("The framebuffer device was opened successfully.\n");
		if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {
			printf("Error reading fixed information.\n");
			exit(2);
		}
		if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
			printf("Error reading variable information.\n");
			exit(3);
		}
		printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel );
		screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
		fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
						   fbfd, 0);
		if ((int)fbp == -1) {
			printf("Error: failed to map framebuffer device to memory.\n");
			exit(4);
		}
		printf("The framebuffer device was mapped to memory successfully.\n");
		x = 100; 
		y = 100;
		for ( y = 100; y < 300; y++ )
			for ( x = 100; x < 300; x++ ) {
				location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
						   (y+vinfo.yoffset) * finfo.line_length;
				if ( vinfo.bits_per_pixel == 32 ) {
					*(fbp + location) = 100;  
					*(fbp + location + 1) = 15+(x-100)/2;
					*(fbp + location + 2) = 200-(y-100)/5; 
					*(fbp + location + 3) = 0;
				} else  {
					int b = 10;
					int g = (x-100)/6;
					int r = 31-(y-100)/16;
					unsigned short int t = r<<11 | g << 5 | b;
					*((unsigned short int*)(fbp + location)) = t;
				}
			}
		munmap(fbp, screensize);
		close(fbfd);
		return 0;
	}

 

(已经在Ubuntu和qemu上测试过)

 

2. 基于DirectFB

DirectFB好像可以加快Framebuffer的绘画速度。

官方有5个示例代码

http://directfb.org/index.php?path=Development%2FTutorials

DirectFB有支持字体、图片和输入插件,

不过在编译前需要事先安装相关的开发库。

(已经在Ubuntu和qemu上测试过)

 

3. 基于SDL

SDL支持Framebuffer,因为它底层使用了DirectFB。

Ubuntu的SDL可以在Framebuffer下使用,如果自己编译SDL的代码,

需要事先编译DirectFB

(已经在Ubuntu和qemu上测试过)

 

4. 基于GTK+2

项目主页在:

http://www.gtk.org/

GTK+2通过Cairo库的DirectFB后端支持Framebuffer。

而且gtk库在编译时需要填加特定参数

./configure --prefix=$PREFIX --with-gdktarget=directfb --without-x

然后进行编译。

不过GTK+2的编译比较麻烦,而且directfb上GTK+2的开发代码尚不稳定。

测试的可执行文件在/bin/gtk-demo

(在Ubuntu上跑似乎有问题——不知道怎么拖动窗口和退出;未在qemu上测试)

 

5. 基于Qt

下载在

ftp://ftp.qt.nokia.com/qt/source/

一般需要自己编译

$ tar xzf qt-everywhere-opensource-src-4.8.0-tp.tar.gz

$ cd qt-everywhere-opensource-src-4.8.0-tp/

$ ./configure -shared -static -opensource -embedded generic

虽然-embedded这个参数没有出现在./configure --help里,

但它在这里是有效的。这里不需要添加--prefix参数

$ sudo make -j 4

$ sudo make install

默认装在/usr/local/Trolltech目录下。

示例代码和编译的二进制文件在demos/embedded目录下。

进入framebuffer下的文本模式,

然后运行sudo ./xxx -qws

运行时如果提示:

Qt/Embedded data directory is not owned by user 0:/tmp/qtembedded-0

可以运行:

sudo chown root:root /tmp/qtembedded-0

如果要在qemu上跑,需要复制/lib/fonts目录下的字体

(可以在Ubuntu上跑,在qemu上跑似乎有点问题——未解决)

 

 

  • 大小: 145.9 KB
分享到:
评论

相关推荐

    framebuffer显示JPEG或BMP图片

    标题中提到的 "framebuffer显示JPEG或BMP图片" 揭示了关于Linux环境下framebuffer...文档提供的源码是一个很好的学习材料,可以通过分析和运行这些代码来加深对Linux环境下framebuffer设备操作和图像解码处理的理解。

    Linux Framebuffer 俄罗斯方块

    总的来说,Linux Framebuffer 俄罗斯方块展示了如何在Linux环境下利用底层硬件特性开发图形应用,对于学习Linux驱动编程、嵌入式系统开发以及游戏编程来说,是一个很好的实践案例。通过研究和理解这个项目,开发者...

    framebuffer

    在计算机图形学和操作系统中,`framebuffer`(帧缓冲区)是一个重要的概念,它扮演着显示系统核心组件的角色。帧缓冲区是一个内存区域,用于存储屏幕上的每一个像素的颜色值,这些颜色值随后被转化为实际的图像显示...

    Linux Framebuffer显示demo——jpeg图像显示

    Linux Framebuffer应用编程——jpeg显示在RGB888 Lcd显示屏 包含源代码.c文件,运行在Arm9开发板的可执行文件,一张jpg图像(分辨率800*533) 相关原理详见【正点原子文档】I.MX6U嵌入式Linux C应用编程指南V1.4 ...

    android 下读取framebuffer的内容

    在Android系统中,framebuffer(帧缓冲区)是操作系统用于存储屏幕显示内容的数据结构。它是一个内存区域,包含了屏幕上每一个像素的颜色值。当系统需要更新屏幕时,会将图像数据写入framebuffer,然后由显卡将其...

    LINUX ubuntu的学习

    在开始Ubuntu的学习之旅前,首先需要了解如何安装Ubuntu。Ubuntu提供有多种安装方式,包括传统的光盘安装、USB启动安装和网络在线安装。安装过程中,你需要选择合适的分区方案,如全盘安装或双系统并存。安装完成后...

    在树莓派下framebuffer+spi驱动

    在树莓派上进行硬件开发是一项有趣的挑战,特别是在与显示设备交互时。在这个场景中,我们...这个过程涉及硬件接口的配置、驱动程序的编写以及用户空间的应用程序设计,是学习嵌入式系统和Linux驱动开发的良好实践。

    framebuffer驱动全篇

    Framebuffer驱动全篇主要涉及的是Linux系统中对显卡驱动的实现,特别是通过Framebuffer设备来抽象显卡硬件,使得应用程序可以更...通过深入学习这一领域的知识,开发者可以更有效地实现和优化Linux系统的图形显示功能。

    基于framebuffer的摄像程序

    在这种场景下,"基于framebuffer的摄像程序"是一个关键解决方案。本项目通过修改luvcview源代码,实现了在framebuffer设备上直接显示摄像头捕获的图像,从而为无图形系统的嵌入式环境提供了照相和录像的能力。 首先...

    linux framebuffer打开图片

    linux framebuffer编程,显示BMP图片

    framebuffer绘图

    通过学习并实践这个资源提供的例子,你可以深入理解framebuffer的工作原理,掌握如何在没有图形界面的环境下进行图形编程,这对于开发低级图形应用、游戏、系统监控工具等很有帮助。此外,这些知识也能为你在嵌入式...

    framebuffer BMP图像显示

    在嵌入式Linux系统中,framebuffer是一种基本的图形设备驱动程序,它为操作系统提供了一个直接访问硬件显存的接口,使得我们可以在没有图形窗口系统(如X Window System)的情况下进行图形显示。在这个主题中,我们...

    android framebuffer 测试程序

    通过深入学习和使用这个"android framebuffer 测试程序",开发者可以更好地理解和优化Android系统的显示性能,提升用户体验。同时,对于那些需要进行底层系统开发或设备驱动编程的工程师,这也将是一份宝贵的参考...

    全面的framebuffer详解

    Linux操作系统中的FrameBuffer是一种提供给用户态进程直接写屏能力的驱动程序接口。在2.2.x版本的内核中首次引入,它允许用户态进程通过抽象的设备来进行直接的屏幕操作。这种机制模仿了显卡的功能,并将显卡的硬件...

    FrameBuffer 应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

    Framebuffer 是一种显示驱动接口,在 Linux 系统中用于抽象并屏蔽不同显示设备的硬件细节。它通过设备文件(如 /dev/fbX)提供一块显示内存,使应用程序无需关心物理显存的细节。应用程序通过 mmap 将显示缓冲区映射...

    GTK+ for the Linux Framebuffer

    ### GTK+ for the Linux Framebuffer:关键技术点及应用解析 #### 引言 GTK+(GIMP工具包)是一款广泛使用的图形用户界面开发框架,它为开发者提供了丰富的UI组件库来构建美观、易于使用的应用程序。起初,GTK+是...

    嵌入式framebuffer编程实例

    在嵌入式Linux系统中,Framebuffer(帧缓冲)是一种硬件抽象层,用于处理图形输出到显示设备,如LCD或TFT屏幕。它提供了一个直接访问显示内存的接口,允许开发者进行低级图形操作,而无需依赖高级图形库。在本实例中...

    framebuffer.pdf

    ### uClinux下的framebuffer设备驱动开发指南 #### 一、framebuffer设备概述 framebuffer是一种重要的硬件设备,主要用于提供图形界面支持。它为应用程序提供了一个接口,使得开发者无需深入了解底层驱动细节,就...

Global site tag (gtag.js) - Google Analytics