もうちょっと、がんばろう。
$ fbset
mode "1680x1050"
geometry 1680 1050 1680 1050 16
timings 0 0 0 0 0 0 0
rgba 5/11,6/5,5/0,0/16
endmode
この部分。
1ピクセルは16bitなんだけど、その16bitがどういう成分かの説明になっている。
順番に、赤が5bit、緑が6bit、青が5bit、透過は無し。
いわゆる、RGB565、という形式だ。
さて、ここでいつも迷うのが、エンディアンだ。
2byteとなると、データの上位バイトと下位バイトというものが出てくる。
上位バイト→下位バイト、となるか、下位バイト→上位バイト、となるか、だ。
まあ、やってみよう。
#include <stdio.h>#include <string.h>
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define FB "/dev/fb0"
#define WIDTH (1680)#define HEIGHT (1000)#define PP (2)int main(int argc, const char *argv[]){int fb;
int loop;
const data[] = { 0xf8, 0x00 };
fb = open(FB, O_RDWR);if(fb == -1) {
perror("cannot open fb.");
return -1;
}write(fb, data, 2);return 0;
}
0xF8、0x00の順に書き込み。
ビットで書けば「 1111 1000 0000 0000」なので、ビッグエンディアンだったら赤になるはず。
・・・青いピクセルが画面左上に出てきた。
ってことは、リトルエンディアンか。
data[]を0x00、0xF8に入れ替えて・・・
?? 画面に何も出ないぞ??
・・・恥ずかしいミスを修正しました。
#include <stdio.h>#include <string.h>
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define FB "/dev/fb0"
#define WIDTH (1680)#define HEIGHT (1000)#define PP (2)int main(int argc, const char *argv[]){int fb;
int loop;
const unsigned char data[] = { 0x00, 0xf8 };fb = open(FB, O_RDWR);if(fb == -1) {
perror("cannot open fb.");
return -1;
}for(loop = 0; loop < WIDTH; loop++) {
write(fb, data, 2);}return 0;
}
そういえば、Cって型無しでもコンパイルエラーにならないんだったな。
intで処理されていたのでだめだったのだ。
それはさておき、実際に使うんだったら、
const unsigned short data = 0xf800;
みたいにするだろうし、RGB565(r, g, b)みたいなマクロを作っておくか、カラー番号を作っておいてテーブルにしてしまうとか、そんな感じになるんじゃなかろうかね。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。