PSM(4) | FreeBSD Kernel Interfaces Manual | PSM(4) |
名称
psm — PS/2 マウススタイルポインティングデバイスドライバ書式
options KBD_RESETDELAY=Noptions KBD_MAXWAIT=N
options PSM_DEBUG=N
options KBDIO_DEBUG=N
device psm
/boot/device.hints 中で:
hint.psm.0.at="atkbdc"
hint.psm.0.irq="12"
解説
psm ドライバは、PS/2 マウススタイルのポインティングデバイスのサポートを行います。現在、システムには、1 つの psm デバイスノードしか存在できません。 PS/2 マウスポートがキーボードコントローラの補助のポートに設置されているので、キーボードコントローラドライバ、 atkbdc もカーネルで設定されていなければなりません。現在、 irq 番号を変更する規定がないことに注意してください。基本的な PS/2 スタイルのポインティングデバイスには、2 つまたは 3 つのボタンがあります。いくつかのデバイスには、ローラまたはホイールおよび追加ボタンがあるかもしれません。
デバイス分解能
PS/2 スタイルのポインティングデバイスには、通常いくつかの等級分けされた分解能、すなわち移動の感度があります。一般的にそれらは、1 インチあたり 25、 50、100、200 パルスです。いくつかのデバイスには、より細かな分解能があるかもしれません。現在の分解能は、実行時に変更できます。 psm ドライバでは、ユーザが最初にドライバフラグ ( ドライバの設定 を参照) で分解能を設定するか、または ioctl(2) コマンド MOUSE_SETMODE ( IOCTL を参照) によって後で変更できるようになっています。通知レート
デバイスがホストシステムに移動とボタン状態の通知を行なう頻度、すなわち通知レートの設定も変更可能です。一般的に、PS/2 スタイルのポインティングデバイスは、毎秒 10、20、40、60、80、100、200 回の通知をサポートしています。 60 か 100 が多くのデバイスのためのデフォルト値であると思われます。移動がなく、ボタンの状態も変更していないとき、デバイスは、ホストシステムに何も送らないことに注意してください。通知レートは、ioctl 呼び出しによって変更することができます。操作レベル
psm ドライバは、3 つ操作レベルがあります。現在の操作レベルは、ioctl 呼び出しで設定できます。レベル 0 では、基本的なサポートが行なわれます。デバイスドライバは、アタッチされたデバイスの水平方向と垂直方向の移動と最大 3 個までのボタンの状態を通知します。移動と状態は、一連の固定長データパケットにコード化されます ( データパケット形式 を参照)。これは、操作のデフォルトレベルで、ユーザプログラムによってオープンされるとき、ドライバは、最初にこのレベルとなります。
操作レベル 1、`拡張' レベル、は、もしあればローラ (またはホイール) および 11 個までのボタンをサポートします。ローラの移動は、Z 軸に沿った移動として通知されます。このレベルでは、8 バイトのデータパケットがユーザプログラムに送られます。
操作レベル 2 では、ポインティングデバイスからのデータは、そのままユーザプログラムに渡されます。逆に、ユーザプログラムからのコマンドは、そのままポインティングデバイスに渡され、ユーザプログラムは、状態の妥当性とエラー復旧に対して責任があります。最新の PS/2 タイプのポインティングデバイスは、しばしば独自のデータの形式を使用します。そのために、ユーザプログラムは、このレベルでドライバを操作するとき、特定のデバイスからの形式に関する詳細な知識があることが期待されます。このレベルは、`ネイティブ' レベルと呼ばれます。
データパケット形式
psm ドライバから読み込まれたデータパケットは、それぞれの操作レベルで異なった形式になっています。PS/2 マウススタイルのポインティングデバイスからのデータパケットは、操作レベル 0 では 3 バイトです:
- バイト 1
-
- ビット 7
- 1 は、垂直移動カウントでのオーバフローを示します。
- ビット 6
- 1 は、水平移動カウントでのオーバフローを示します。
- ビット 5
- 垂直移動カウントが負であるなら設定されます。
- ビット 4
- 水平移動カウントが負であるなら設定されます。
- ビット 3
- 常に 1 です。
- ビット 2
- 中ボタンの状態。押されるなら設定されます。中ボタンがないデバイスでは、このビットは、常に 0 です。
- ビット 1
- 右ボタンの状態。押されるなら設定されます。
- ビット 0
- 左ボタンの状態。押されるなら設定されます。
- バイト 2
- 2 の補数での水平移動カウント。 -256 から 255 まで。符号ビットは、最初のバイトにあることに注意してください。
- バイト 3
- 2 の補数での垂直移動カウント。 -256 から 255 まで。符号ビットは、最初のバイトにあることに注意してください。
レベル 1 では、データパケットは、 mouse(4) で定義されるように標準形式 MOUSE_PROTO_SYSMOUSE でコード化されます。
レベル 2 のネイティブレベルでは、データパケットのサイズと形式には標準がありません。
アクセラレーション (加速)
psm ドライバは、ポインティングデバイスの移動をいくらか `加速' することができます。利用者がより速くデバイスを動かせば動くほど、ポインタは、画面上でより遠くに移動します。ドライバには、加速の効果を左右する内部変数があります。その値は、ドライバフラグか ioctl 呼び出しで変更できます。ドライバの設定
カーネル設定オプション
psm ドライバを制御するために次のカーネル設定オプションがあります。それらは、カーネル設定ファイルで設定されます ( config(8) 参照)。- KBD_RESETDELAY=X, KBD_MAXWAIT=Y
- psm ドライバは、ブートプロセスの間にポインティングデバイスをリセットしようと試みます。時々リセットの後でデバイスが応答するまでに長い時間がかかることがあります。これらのオプションは、最終的に待つのをあきらめる前にドライバがどれくらい長い間待つべきかを制御します。ドライバは、多くても X * Y ミリ秒待ちます。ドライバが利用者のポインティングデバイスを検出できないように思えるなら、利用者は、これらの値を増加したいかもしれません。デフォルト値は、 X に対しては、200 ミリ秒で Y に対しては、5 ミリ秒です。
- PSM_DEBUG=N, KBDIO_DEBUG=N
- デバッグレベルを N に設定します。デフォルトのデバッグレベルは、0 です。デバッグのログに関しては、 診断 を参照して下さい。
ドライバフラグ
psm ドライバは、次のドライバフラグを受け付けます。 /boot/device.hints にそれらを設定してください (下記の EXAMPLES を参照)。- ビット 0..3 RESOLUTION (分解能)
-
このフラグは、ポインティングデバイスの分解能を指定します。 0 から 4 でなければなりません。値が大きければ大きいほど、デバイスが選択する分解能は、より細かくなります。このフィールドによって選択される実際の分解能は、デバイスのモデルに従って異なります。一般的な分解能は、次の通りです:
- 1 (low)
- 25 インチ毎のパルス (ppi)
- 2 (medium low)
- 50 ppi
- 3 (medium high)
- 100 ppi
- 4 (high)
- 200 ppi
このフラグを 0 のままにすれば、デバイス (それが何であろうと) のデフォルトの分解能が選択されます。
- ビット 4..7 ACCELERATION (アクセラレーション (加速))
- このフラグは、加速効果の量を制御します。このフラグの値が小さければ小さいほど、より感度がある移動となります。許容される最小値は、1 であり、したがって最も感度が高い設定の値となります。このフラグを 0 に設定することは、完全に加速効果を無効にします。
- ビット 8 NOCHECKSYNC
-
psm ドライバは、そのバイトのビットパターンをチェックすることによって、データパケットの最初のバイトを検出しようとします。この方法は、ほとんどの PS/2 ポインティングデバイスで動作するはずですが、よく知られているデバイスでそれほど互換性がない一部のデバイスに干渉するかもしれません。利用者のポインティングデバイスが期待どおりに機能していないと考えられるなら、カーネルは、頻繁に次のメッセージをコンソールに印刷します。
psmintr: out of sync (xxxx != yyyy).
同期チェックを無効にするようにこのフラグを設定し、それが助けになるか調べてください。
- ビット 9 NOIDPROBE
- psm ドライバは、ポインティングデバイスのモデルを識別しようとしないで、モデル特有の初期化を実行しません。デバイスは、常にそのような初期化のない標準的な PS/2 マウスのように振る舞うはずです。ホイールや追加ボタンのような特別の機能は、 psm ドライバでは、認識されません。
- ビット 10 NORESET
- このフラグが設定されているとき、 psm ドライバは、デバイスを初期化するときにポインティングデバイスをリセットしません。他の OS が実行された後に FreeBSD のカーネルが起動すると、ポインティングデバイスは、以前の OS の設定を引き継ぐことになります。しかしながら psm ドライバがその設定を知る方法がないので、デバイスとドライバは、正しく動作しないかもしれません。このフラグは、正常な状況下で決して必要とならないはずです。
- ビット 11 FORCETAP
- いくつかのパッドデバイスは、ユーザがデバイスの表面を `タップ (軽くたたく)' するとき、 ( 警告 を参照) まるで 4 番目のボタンが押されたかのように通知します。このフラグによって、 psm ドライバは、デバイスがこのように振る舞うと仮定します。フラグがなければ、ドライバは、ALPS GlidePoint モデルに対してのみこの振る舞いを仮定します。
- ビット 12 IGNOREPORTERROR
- このフラグによって、 psm ドライバは、PS/2 マウスポートをプローブするとき、ある種のエラー状態を無視します。それは、正常な状況下で決して必要とならないはずです。
- ビット 13 HOOKRESUME
- いくつかのラップトップコンピュータに内蔵している PS/2 ポインティングデバイスは、節電モードからシステムの `レジューム' 直後にどういうわけか操作できませんが、とはいえ、最終的には利用可能になります。 I/O を実行することによってデバイスを刺激すれば、すぐにデバイスを起こす助けとなるという通知があります。このフラグは、 psm ドライバの 1 部分のコードが `レジューム' イベントをフックし、デバイスでいくつかの無害な I/O 操作を働かせることを有効にします。訳注: 「フック」入力やメッセージを横取りして独自処理を行うこと
- ビット 14 INITAFTERSUSPEND
- このフラグは、上記の問題に対してより強烈な動きを加えます。それは、 psm ドライバに `レジューム' イベントの後にポインティングデバイスをリセットして再初期化を起こさせます。
ローダ調整変数
Synaptics タッチパッドの拡張サポートは、ブート時に hw.psm.synaptics_support を 1 を設定することによって、有効にすることができます。これは、guest デバイス (スティック) と特別のボタンからパケットを操作するために psm を有効にします。同様に、IBM/Lenovo TrackPoint の拡張されたサポートは、ブート時に hw.psm.trackpoint_support を 1 を設定することによって、有効にすることができます。ブート時に hw.psm.tap_enabled を 0 に設定することによって、tap と drag の gesture を無効にすることができます。現在、これは、無効にされた拡張サポートがある Synaptics タッチパッドでのみサポートされます。ブートの後に、同じ名前で sysctl を設定し、 /etc/rc.d/moused を使用して moused(8) を再開することによって、振る舞いを変更することができます。
IOCTL
マウスドライバのための ioctl(2) コマンドがいくつかあります。これらのコマンドと関連する構造体および定数は、 < sys/mouse.h> に定義されています。コマンドの概要は、 mouse(4) にあります。このセクションは、 psm ドライバに特有の機能について説明します。
- MOUSE_GETLEVEL int *level
- MOUSE_SETLEVEL int *level
-
これらのコマンドは、
psm ドライバの操作レベルを扱います。
- MOUSE_GETHWINFO mousehw_t *hw
-
次の構造体で、アタッチされた (取り付けられた) デバイスに関するハードウェア情報を返します。
typedef struct mousehw { int buttons; /* ボタンの数 */ int iftype; /* I/F のタイプ */ int type; /* マウス/トラックボール/パッド... */ int model; /* I/F 依存のモデル ID */ int hwid; /* I/F 依存のハードウェア ID */ } mousehw_t;
buttons フィールドは、ドライバでボタンの数を保持します。 psm ドライバは、現在 Logitech の 3 ボタンのマウスを検出して、それに応じて通知することができます。他のメーカの 3 ボタンのマウスは、正しく通知されるかどうか分かりません。しかしながら、それは、ドライバの操作に影響しません。
iftype は、常に MOUSE_IF_PS2 です。
type は、デバイスタイプを区別します: MOUSE_MOUSE, MOUSE_TRACKBALL, MOUSE_STICK, MOUSE_PAD または MOUSE_UNKNOWN です。ドライバは、実際のところめったにデバイスタイプを識別できないので、ユーザは、このフィールドに頼り過ぎるべきではありません。
model は、操作レベル 0 で、常に MOUSE_MODEL_GENERIC です。それは、より高い操作レベルで MOUSE_MODEL_GENERIC または MOUSE_MODEL_XXX 定数の 1 つになります。この場合もやはり psm ドライバがこのフィールドに適切な値を設定するかどうか分かりません。
hwid は、デバイスによって返された ID 値です。既知の ID は、次に含まれます:
- 0
- マウス (Microsoft, Logitech および他の多数のメーカ)
- 2
- Microsoft Ballpoint マウス
- 3
- Microsoft IntelliMouse
- MOUSE_SYN_GETHWINFO synapticshw_t *synhw
-
Synaptics Touchpad (タッチパッド) に関連している特別の情報を検索します。サポートされたデバイスがデタッチされたときだけ、利用可能です。
typedef struct synapticshw { int infoMajor; /* メジャーハードウェアリビジョン */ int infoMinor; /* マイナハードウェアリビジョン */ int infoRot180; /* タッチパッドは回転 */ int infoPortrait; /* タッチパッドは縦方向 */ int infoSensor; /* センサモデル */ int infoHardware; /* ハードウェアモデル */ int infoNewAbs; /* newabs 形式をサポート */ int capPen; /* ペン検出可能 */ int infoSimplC; /* 単純コマンドをサポート */ int infoGeometry; /* タッチパッド寸法 */ int capExtended; /* 拡張パケットをサポート */ int capSleep; /* サスペンド/レジューム可能 */ int capFourButtons; /* 4 つのボタンあり */ int capMultiFinger; /* 複数の finger 検出可能 */ int capPalmDetect; /* palm 検出可能 */ int capPassthrough; /* guest パケット通過可能 */ int capMiddle; /* 物理的な中央ボタンがある */ int nExtendedButtons; /* N 個の追加ボタンがある */ int nExtendedQueries; /* N 個の拡張問い合わせをサポートする */ } synapticshw_t;
この構造のフィールドに関する詳しい情報に関しては、 Synaptics TouchPad Interfacing Guide を参照してください。
- MOUSE_GETMODE mousemode_t *mode
-
このコマンドは、マウスドライバの現在の操作パラメータを取得します。
typedef struct mousemode { int protocol; /* MOUSE_PROTO_XXX */ int rate; /* 通知レート (秒単位), 不明なら -1 */ int resolution; /* MOUSE_RES_XXX, 不明なら -1 */ int accelfactor; /* アクセラレーション (加速) 係数 */ int level; /* ドライバ操作レベル */ int packetsize; /* データパケットの長さ */ unsigned char syncmask[2]; /* 同期ビット */ } mousemode_t;
protocol は、操作レベル 0 と 2 では、 MOUSE_PROTO_PS2 です。操作レベル 1 では、 MOUSE_PROTO_SYSMOUSE です。
rate は、デバイスが移動通知をホストコンピュータに送る状態通知のレート (通知/秒) です。一般的にサポートされた値は、10、20、40、60、 80、100 と 200 です。いくつかのマウスは、他の任意の値も受け付けるかもしれません。
ポインティングデバイスの resolution (分解能) は、 MOUSE_RES_XXX 定数の 1 つか正の値でなければなりません。この値が大きければ大きいほど、マウスが選択するより細かな分解能になります。 MOUSE_RES_XXX 定数によって選択された実際の分解能は、マウスのモデルに従って異なります。一般的な分解能は、次の通りです:
- MOUSE_RES_LOW
- 25 ppi
- MOUSE_RES_MEDIUMLOW
- 50 ppi
- MOUSE_RES_MEDIUMHIGH
- 100 ppi
- MOUSE_RES_HIGH
- 200 ppi
accelfactor フィールドは、アクセラレーション (加速) 機能 ( アクセラレーション (加速) 参照) を制御するために値を保持します。それは、0 以上でなければなりません。それが 0 であるなら、アクセラレーション (加速) は、無効にされます。
packetsize フィールドは、データパケットの長さを指定します。それは、操作レベルとポインティングデバイスのモデルに依存しています。
- level 0
- 3 バイト
- level 1
- 8 バイト
- level 2
- デバイスのモデルに依存します
配列 syncmask は、データパケットの最初のバイトを検出するためにビットマスクとパターンを保持します。 syncmask[0] は、1 つのバイトと倫理積 (AND) を行うビットマスクです。結果が syncmask[1] と等しいなら、そのバイトは、データパケットの最初のバイトである可能性が高いです。最初のバイトを検出するこの方法が 100% の信頼性がないので、単に助言的な手段として解釈すべきであることに注意してください。
- MOUSE_SETMODE mousemode_t *mode
-
このコマンドは、マウスドライバの現在の操作パラメータを
mode で指定されるように変更します。
rate,
resolution,
level と
accelfactor だけが修正できます。他のフィールドに値を設定することは、エラーも発生しませんし、効果もありません。
フィールドの現在の設定を変更したくないなら、そこに -1 を入れてください。また、利用者は、 resolution と rate に 0 を入れることができ、そうするとフィールドのデフォルト値が選択されます。
- MOUSE_READDATA mousedata_t *data
- MOUSE_READSTATE mousedata_t *state
-
これらのコマンドは、現在
psm ドライバによってサポートされていません。
- MOUSE_GETSTATUS mousestatus_t *status
- このコマンドは、 mouse(4) で説明されるようにボタンの現在の状態と移動のカウントを返します。
関連ファイル
- /dev/psm0
- `非ブロッキング' デバイスノード
- /dev/bpsm0
- `ブロッキング' デバイスノード
使用例
psm ドライバをインストールするためには、利用者は、カーネル設定ファイルに
device atkbdc
device psm
を追加して、次の行を /boot/device.hints に書き込む必要があります。
hint.atkbdc.0.at="isa"
hint.atkbdc.0.port="0x060"
hint.psm.0.at="atkbdc"
hint.psm.0.irq="12"
利用者が次の文を /boot/device.hints に追加するなら、
hint.psm.0.flags="0x2000"
利用者は、`レジューム' イベントの後にポインティングデバイスを活性化するためにオプションのコードを追加します。
hint.psm.0.flags="0x24"
上記の行は、デバイス分解能を高く (4)、アクセラレーション係数を 2 に設定します。
診断
デバッグレベル 0 では、ブートのプロセスの間に次の行を除いて、ほとんどの情報は、ログに登録されません:
psm0: device ID X
ここで X は、見つけられたポインティングデバイスで返されたデバイス ID コードです。既知の ID については、 MOUSE_GETINFO を参照して下さい。
デバッグレベル 1 では、ドライバが補助ポート (マウスポート) をプローブしている間に詳しい情報がログに登録されます。メッセージは、LOG_DEBUG レベルのときに LOG_KERN ファシリティでログに登録されます ( syslogd(8) を参照)。
psm0: current command byte:xxxx kbdio: TEST_AUX_PORT status:0000 kbdio: RESET_AUX return code:00fa kbdio: RESET_AUX status:00aa kbdio: RESET_AUX ID:0000 [...] psm: status 00 02 64 psm0 irq 12 on isa psm0: model AAAA, device ID X, N buttons psm0: config:00000www, flags:0000uuuu, packet size:M psm0: syncmask:xx, syncbits:yy
最初の行は、補助ポートがプローブされる直前のキーボードコントローラのコマンドバイト値を示します。それは、電源を入れる時にマザーボード BIOS がどのようにキーボードコントローラを初期化したかによって、通常、40、45、47 または 65 です。
2 行目は、補助ポートインタフェースでキーボードコントローラのテストの結果を示します。 0 は、エラーがないことを示します。しかしながら、いくつかのコントローラは、たとえポートがシステムに存在しなくてもエラーを通知しないことに注意してください。
3 行目から 5 行目は、ポインティングデバイスのリセット状態を示します。機能するデバイスは、FA AA <ID>の順序で返すはずです。この ID コードは、上で説明されています。
7 行目は、現在のハードウェアの設定を示します。これらのバイトは、次のようにフォーマットされます:
- バイト 1
-
- ビット 7
- 予約済み。
- ビット 6
- 0 - ストリームモード、1 - リモートモード。ストリームモードでは、ポインティングデバイスは、状態が変化するときは、いつもデバイス状態を送ります。リモートモードでは、ホストコンピュータは、状態が送られるように要求しなければなりません。 psm ドライバは、デバイスをストリームモードにします。
- ビット 5
- ポインティングデバイスが現在有効であれば設定されます。そうでなければ 0 です。
- ビット 4
- 0 - 1:1 スケーリング、1 - 2:1 スケーリング。 1:1 スケーリングがデフォルトです。
- ビット 3
- 予約済み。
- ビット 2
- 左ボタンの状態。押されているならセット。
- ビット 1
- 中ボタンの状態。押されているならセット。
- ビット 0
- 右ボタンの状態。押されているならセット。
- バイト 2
-
- ビット 7
- 予約済み。
- ビット 6..0
- 分解能コード: 0 から 3。分解能コードの対する実際の分解能は、デバイスによって異なります。
- バイト 3
- デバイスが移動通知をホストコンピュータに送る状態通知レート (通知/秒)。
psm ドライバがユーザプログラムによってオープンされるまでポインティングデバイスは、有効にならないことに注意してください。
残りの行は、デバイス ID コード、検出されたボタンの数および内部の変数を表示します。
デバッグレベル 2 では、より詳細な情報がログに登録されます。
関連項目
ioctl(2), syslog(3), atkbdc(4), mouse(4), mse(4), sysmouse(4), moused(8), syslogd(8) Synaptics TouchPad Interfacing Guide, http://www.synaptics.com/.作者
psm ドライバは、かなり多くの人々によって行われた仕事に基づいています。いくらかの名前を挙げると , , , , , と が含まれます。このマニュアルページは、
<yokota@FreeBSD.org>によって書かれました。警告
多くのパッドデバイスは、ユーザがパッドの表面を `タップ (軽くたたく)' するならまるで最初の (左) のボタンが押されたかのように振る舞います。対照的に、いくつかのパッド製品、例えば、ALPS GlidePoint と Interlink VersaPad のあるバージョンは、4 番目のボタンのイベントとしてタップ動作を処理します。ALPS GlidePoint、Synaptics Touchpad、IBM/Lenovo TrackPoint、と Interlink VersaPad は、サスペンド状態から復旧するために INITAFTERSUSPEND フラグを必要とすることが報告されています。このフラグは、これらのデバイスの 1 つが psm ドライバによって検出されるとき、自動的に設定されます。
MouseSystems 製のいくつかの PS/2 マウスモデルは、適切に動作するために高分解能モードにする必要があります。ドライバフラグを使用して分解能を設定してください。
いったん、データストリームとの同期がずれると、パケットの最初のバイトに再び同期するための保証された方法はありません。しかしながら、利用者が XFree86 サーバを使用して、X サーバが moused(8) を通してマウスにアクセスしていない、問題を抱えてているなら、利用者は、X サーバを仮想端末に切り替え X サーバに戻ることによって X サーバは、マウスと同期できるかもしれません。マウスを移動させないで任意のボタンをクリックしても動作するかもしれません。
バグ
ioctl コマンドの MOUSEIOCREAD は、削除されました。どっちみち、それは、機能していませんでした。Synaptics タッチパッドの拡張サポートを有効にすることは、特に guest デバイスがある Synaptics ハードウェアのいくつかの (より新しい) モデル上で応答速度で問題を起こすと報告されました。
March 18, 2013 | FreeBSD |