&size(24){&color(darkgreen){無線LAN画像伝送評価キットの取り扱い説明書の修正};};
#navi(Wpa)
''CONTENTS''
#contents
----


** 3.3 SM501デバイスドライバ [#j6e294b8]

SM501のレジスタへのアクセスはioctlシステムコールを,
VRAMへのアクセスはLinuxのフレームバッファアーキテクチャの一部を用います。

Linuxフレームバッファアーキテクチャは,
Geert Uytterhoeven <geert@linux-m68k.org>
によって維持されているアーキテクチャで,最新バージョンは2001年5月10日です。
詳細については,「Appendix-A: Frame Buffer Devices」を参照願います。
(正確を期すため,原文のまま掲示しています。)

*** 3.3.1 レジスタへのアクセス [#h0df34bb]

SM501レジスタへのアクセスにはioctlを用います。
ioctlの使用にはターゲットアーキテクチャのヘッダファイルが必要です。
 # cp -R linux/include/asm-sh /usr/local/sh4-linux/include/asm

レジスタ値を読み込み,変更し,書き込むサンプルコードを以下に示します。
 int reg32;
 int value = 0xab;
 int mask = 0x0000ff00;
 
 // open device node
 int fd  = open("/dev/fb0", O_RDWR);
 
 // set MMIO address
 ioctl(fd, 0, address);
 
 // read register value
 ioctl(fd, 1, &reg32);
 
 // change register value
 reg32 &= ~mask;
 reg32 |= value << 8;
 
 // write register value
 ioctl(fd, 2, reg32);
レジスタ値変更の際,予約されているビットを変更しないように注意してください。

*** 3.3.2 画面解像度設定 [#s0bfa117]

画面解像度,ビデオタイミング信号,ドットクロック等は
SM501レジスタによって完全に制御されます。
レジスタ値を変更することによって画面解像度を動的に変更することが可能です。
画面解像度設定の際には以下の点に留意願います。
- ''レジスタ値変更操作中はタイミング信号の生成を無効化してください。'' &br;
これは不適切なタイミング信号による表示デバイスの破損を防止するための処置です。
- ''すべてのフレームバッファを非表示にしてください。'' &br;
解像度変更に伴って画面とVRAMの対応が変わるため,
予期しない映像が表示されます。
- ''画面情報はSM501レジスタから直接取得してください。'' &br;
ドライバの制限により,レジスタ値の変更が
フレームバッファアーキテクチャのvinfo, finfoなどの構造体に反映されません。
このため,これらの構造体からは正しい情報が取得できません。

*** 3.3.3 VRAMへのアクセス [#r82693f7]

SM501は7つのビデオプレーンを持っています。
本製品で使用するのは,以下の4つのプレーンです。
+ アルファプレーン
+ ビデオアルファプレーン
+ ビデオプレーン
+ グラフィックプレーン

詳細は添付のデータシートの1-12,1-23章を参照して下さい。

各プレーンにはフレームバッファのデバイスノードを通じてアクセスします。
フレームバッファの詳細はAppendix-Aを参照して下さい。
RGB565モードのグラフィックプレーン(fb0)にカラー画像data[3][w][h]を
描画するサンプルコードを以下に示します。
 int xres, yres, size, i, j, idx, r, g, b;
 unsigned char *ptr;
 
 int fd  = open("/dev/fb0", O_RDWR);
 size = xres * yres * 2;
 ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
 
 for (j = 0; j < yres; ++j)
   for (i = 0; i < xres; ++i) {
       idx = (x + i) * 2 + (y + j) * xres * 2;
       r = data[0][j][i] >> 3;
       g = data[1][j][i] >> 2;
       b = data[2][j][i] >> 3;
       *((unsigned short int *)(ptr + idx)) = (r << 11) | (g << 5) | b;
     }
 munmap(ptr, size);


*** 3.3.4 サンプルプログラム [#d9885a82]

本製品の動作を確認するためのサンプルプログラムが ''/usr/wpar/bin/'' に収録されています。
これらのプログラムは評価用ですので,お客様の製品に組み込んで使用することはできません。

- ''wpa_init'' '''n''' &br;
SM501レジスタを初期化します。
nの値によって画面解像度が 1)VGA, 2)SXGA, 3)XGA に設定されます。
wpa_init実行後はすべてのフレームバッファが非表示になります。
必要に応じてwpa_view(後述)を実行してください。
 # wpa_init 3

- ''wpa_cls'' '''n''' &br;
nによって指定されるフレームバッファをゼロクリアします。
nとして指定可能な値は0-3,5です。
 # wpa_cls 0

- ''wpa_mod'' '''addr reg32''' &br;
addrによって指定されるアドレスのレジスタ値をreg32に設定します。
addrとして指定可能な範囲は0x00000000 - 0x001fffffです。
reg32として指定可能な範囲は0x00000000 - 0xffffffffです。
 # wpa_mod 0x080000 0x76543210

- ''wpa_mod2'' '''addr''' &br;
addrによって指定されるアドレスのレジスタ値を表示します。
addrとして指定可能な範囲は0x00000000 - 0x001fffffです。
 # wpa_mod2 0x080000

- ''wpa_view'' '''n b''' &br;
nによって指定されるフレームバッファを表示(b = 1)または非表示(b = 0)にします。
nとして指定可能な値は0-3です。
 # wpa_view 1 1

- ''wpa_vctl'' '''tlx tly scale''' &br;
ビデオプレーンの表示原点を (tlx, tly) に,拡大率を scale に設定します。
指定可能範囲は画面解像度にしたがいます。
拡大率を0.5未満に設定すると帯域の問題によって,画面が乱れることがあります。
 # wpa_vctl 100, 100, 1.2

- ''wpa_actl'' '''tlx tly brx bry''' &br;
アルファプレーンの表示範囲を(tlx, tly) - (brx, bry)を対角線とする矩形領域に設定します。
指定可能範囲は画面解像度にしたがいます。
 # wpa_actl 100, 100, 199, 199

- ''wpa_cap'' '''b''' &br;
-- b = 1のときビデオプレーンのキャプチャ機能を有効化し,ビデオプレーンの色空間をYUVに設定します。
-- b = 0のときビデオプレーンのキャプチャ機能を無効化し,ビデオプレーンの色空間をRGB565に設定します。
 # wpa_cap 1

- ''wpa_draw'' '''n image.ppm''' &br;
nによって指定されるフレームバッファにimage.ppmというファイル名のPPMフォーマットの画像を描画します。
nとして指定可能な値は0-3,5です。
 # wpa_draw 0 wivicomlogo.ppm

- ''wpa_vidtune'' &br;
本体のボタンスイッチを用いてタイミング信号の調整を行います。
 # wpa_vidtune

- ''image_test'' &br;
すべてのフレームバッファへアクセス,およびLED点灯のテストプログラムです。
 # image_test

- ''gpio_test'' &br;
ボタンスイッチおよびディップスイッチの状態を取得するテストプログラムです。
 # gpio_test

サンプルプログラムを実行する際にはレジスタ値等を初期状態に戻すために再起動してください。
*** 3.3.5 メモリマップおよびレジスタ値 [#v2b8af27]

以下に,メモリマップとレジスタの設定例を挙げます。
詳細についてはデータシートの1-26から1-28章を参照願います。

&color(red){違うとこだけ};

''共通''
|80040|00016203|Video Display Control|
|80080|00010001|Video Alpha Display Control|
|80100|00010001|Alpha Display Control|
|80200|00010001|CRT Display Control|
|90000|000022d1|Capture Control|
|80000|07013101|Panel Display Control|
''VGA''
|80208|05000500|CRT FB Offset/Window Width|
''SVGA''
|80208|06400640|CRT FB Offset/Window Width|
''XGA''
|80208|08000800|CRT FB Offset/Window Width|


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS