2013/10/13

[rpi]画面に何か出してみよう (2)

もうちょっと、がんばろう。

$ 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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。