Linux系统中通过Framebuffer驱动程序来控制图形显示,Framebuffer被设计为一个独立于硬件的API,让用户空间软件仅使用Linux 内核自己的基本设施及其设备文件系统接口即可访问Framebuffer。本博客记录riotboard使用buildroot构建framebuffer 以及test 程序的过程。
1 代码下载与编译
buildroot 使用2018.11.x版本,下载:
git clone https://git.busybox.net/buildroot -b 2018.11.x
下载后进入目录,先执行riotboard_defconfig
sudo make riotboard_defconfig
再执行:
sudo make menuconfig
在Graphic libraries and applications (graphic/text)目录下选中以下三项:
Graphic libraries and applications (graphic/text) --->
...
[*] fbgrab
[*] fbtest
[*] fbv
...
执行编译
sudo make
编译error 1 :
./../misc/create_inode.c:399:18: error: conflicting types for ‘copy_file_range’
static errcode_t copy_file_range(ext2_filsys fs, int fd, ext2_file_t e2_file,
解决方案: 将create_inode.c中 所有的copy_file_range改成copy_file_chunk。
编译error2 :
include/linux/compiler-gcc.h:114:30: fatal error: linux/compiler-gcc6.h: No such file or directory
解决方案:在uboot-2015.10目录创建compiler-gcc6.h文件:
sudo touch ./output/build/uboot-2015.10/include/linux/compiler-gcc6.h
文件中添加的内容:
#ifndef __LINUX_COMPILER_H
#error "Please don't include <linux/compiler-gcc5.h> directly, include <linux/compiler.h> instead."
#endif
#define __used __attribute__((__used__))
#define __must_check __attribute__((warn_unused_result))
#define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
/* Mark functions as cold. gcc will assume any path leading to a call
to them will be unlikely. This means a lot of manual unlikely()s
are unnecessary now for any paths leading to the usual suspects
like BUG(), printk(), panic() etc. [but let's keep them for now for
older compilers]
Early snapshots of gcc 4.3 don't support this and we can't detect this
in the preprocessor, but we can live with this because they're unreleased.
Maketime probing would be overkill here.
gcc also has a __attribute__((__hot__)) to move hot functions into
a special section, but I don't see any sense in this right now in
the kernel context */
#define __cold __attribute__((__cold__))
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
#ifndef __CHECKER__
# define __compiletime_warning(message) __attribute__((warning(message)))
# define __compiletime_error(message) __attribute__((error(message)))
#endif /* __CHECKER__ */
/*
* Mark a position in code as unreachable. This can be used to
* suppress control flow warnings after asm blocks that transfer
* control elsewhere.
*
* Early snapshots of gcc 4.5 don't support this and we can't detect
* this in the preprocessor, but we can live with this because they're
* unreleased. Really, we need to have autoconf for the kernel.
*/
#define unreachable() __builtin_unreachable()
/* Mark a function definition as prohibited from being cloned. */
#define __noclone __attribute__((__noclone__))
/*
* Tell the optimizer that something else uses this function or variable.
*/
#define __visible __attribute__((externally_visible))
/*
* GCC 'asm goto' miscompiles certain code sequences:
*
* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
*
* Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
*
* (asm goto is automatically volatile - the naming reflects this.)
*/
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
#define __HAVE_BUILTIN_BSWAP32__
#define __HAVE_BUILTIN_BSWAP64__
#define __HAVE_BUILTIN_BSWAP16__
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
以后就没有遇到编译error了,大概花了四个小时左右编译成功。
2 系统烧写测试
如何把编译好的系统烧写到TF卡中可以参考上一篇文章RIoTBoard开发板系列笔记(六)—— buildroot构建系统镜像。
系统启动后进入到/usr/bin/目录:
cd /usr/bin/
给板子上接上显示器,执行Framebuffer test程序:
./fb-test
test程序运行成功后会有log输出:
# ./fb-test
fb-test 1.1.0 (rosetta)
fb res 1024x768 virtual 1024x768, line_len 2048, bpp 16
屏幕上会有test 图案出现:
3 参考文章
http://t.zoukankan.com/dakewei-p-10573446.html
https://github.com/UDOOboard/uboot-imx/issues/12