[[独自拡張]] *マウスのスクロールに対応する **参考サイト --[[はりぼて友の会:advance/mwheel:http://haribote.org/index.php?advance%2Fmwheel]] --[[B級なホイールマウスの研究(ミドルウェア編):http://www.asahi-net.or.jp/~wr7s-nkmr/MiddleWare/mouse/index.htm]] **初期化処理 スクロール機能を初期化をするには、マウスにデータを200、100、80の順に送れば良いみたいだ。しかし、それぞれ送る前にコマンド0xF3を送る必要があるため、実際には次の順でデータを送っていく。 0xf3 200 0xf3 100 0xf3 80 どのデータも、送信後は0xFAが返ってくる(と思う)ので、正しく送れたか確かめながらデータを送信して行く。 一通りデータを送った後、0xF2コマンドを送ってマウスのタイプを取得し、スクロールマウスかどうかを調べる。0x03, 0x04, 0x05が返ってきたらスクロールマウスのようだ。 ソースはmouse.cに書き加えた。 **ソース -mouse.c void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec) { int phase = 0, i; (中略) /* スクロール有効化 */ for (;;) { i = mouse_senddata(0xf3); // [共通]レート設定コマンド送信 if (i == 0xfa) { if (phase == 0) { i = mouse_senddata(200); } else if (phase == 1) { i = mouse_senddata(100); } else if (phase == 2) { i = mouse_senddata(80); if (i == 0xfa) { phase++; } break; } if (i == 0xfa) { phase++; } else { break; // 初期化失敗 } } else { break; // 初期化失敗 } } if (phase == 3 && mouse_senddata(0xf2) != 0x00) { mdec->scrollmode = 1; // スクロールマウスだった } else { mdec->scrollmode = 0; // スクロールマウスじゃなかった } return; } --ループを使って、ソースを短くする努力をしてみる。 -mouce.cに追加 int mouse_senddata(int data) /* マウスデバイスにデータを送る。 */ { wait_KBC_sendready(); io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE); wait_KBC_sendready(); io_out8(PORT_KEYDAT, data); io_cli(); data = io_in8(PORT_KEYDAT); io_sti(); return data; } --こちらもソースを短くするための関数。 -bootpack.h struct MOUSE_DEC { unsigned char buf[4], phase; int x, y, btn, scroll, scrollmode; }; --bufの配列を3から4に変更。 --スクロールの状態を格納するscroll変数を追加。 --スクロールマウスかどうかの情報を格納するscrollmode変数を追加。 -mouse.c int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat) { (中略) if (mdec->phase == 4) { /* スクロール対応マウスのみスクロール */ mdec->phase = 1; // mdec.buf[3]は、下位4ビットだけが有効な値である // とりあえず解析せずに値をしまう。 mdec->scroll = mdec->buf[3] & 0x0f; if (mdec->scroll & 0x08) { // マイナスの値だった mdec->scroll |= 0xfffffff0; } return 1; } } --スクロールの状態を解析する --ソースは出さないが、phase3でmdec->phaseを1にする部分とreturn 1の部分は、mdec->scrollmodeが0の時のみ実行されるように書き換えておくこと。