概要
その1 で Linux が動いたので、画面周りを見ていこう。
画面周り
/dev/fb0
/dev/fb0 が存在するので、これを取得してみる。
user@brain:~$ cat /dev/fb0 > fb0.dat
user@brain:~$ ls -ls
total 756
752 -rw-r--r-- 1 user user 768000 Aug 7 19:44 fb0.dat
4 drwxrwxr-x 2 user user 4096 Aug 7 19:03 lxterminal
user@brain:~$
768,000 バイトなので 800x480x16bpp ですね、はい。
頭にテキトーな 16bpp BMP ヘッダを付けて確認。
fb.bmp
+00: 42 4D 42 B8 0B 00 00 00 00 00 42 00 00 00 28 00
+10: 00 00 20 03 00 00 20 FE FF FF 01 00 10 00 03 00
+20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+30: 00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
+40: 00 00
フレームバッファの情報を取得
ちょちょいとコードを書いて確認する。
fb.c
#include <linux/fb.h>
#include <stdio.h>
#include <sys/fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
int main()
{
const int fd = open("/dev/fb0", O_RDWR);
if (fd != -1)
{
struct fb_var_screeninfo si;
ioctl(fd, FBIOGET_VSCREENINFO, &si);
printf("%d x %d x %dbpp\n", si.xres_virtual, si.yres_virtual, si.bits_per_pixel);
close(fd);
}
return 0;
}
結果
user@brain:~/work$ gcc fb.c
user@brain:~/work$ ./a.out
800 x 480 x 16bpp
user@brain:~/work$
フレームバッファに書き込む
マップトファイルで画面をクリアしてみる。
fb2.c
#include <memory.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <linux/fb.h>
#include <linux/omapfb.h>
int main()
{
const int fd = open("/dev/fb0", O_RDWR);
if (fd != -1)
{
uint16_t* p = (uint16_t*)mmap(NULL, 800 * 480 * 2, PROT_WRITE, MAP_SHARED, fd, 0);
if (p)
{
memset(p, 0, 800 * 480 * 2);
}
close(fd);
}
return 0;
}
動作OK。これで色々遊べそうだ。