You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

303 lines
9.9 KiB

  1. # PS/2 マウスサポート :id=ps2-mouse-support
  2. <!---
  3. original document: 0.13.17:docs/feature_ps2_mouse.md
  4. git diff 0.13.17 HEAD -- docs/feature_ps2_mouse.md | cat
  5. -->
  6. PS/2 マウス (例えばタッチパッドあるいはトラックポイント)を複合デバイスとしてキーボードに接続することができます。
  7. トラックポイントを接続するには、トラックポイントモジュールを入手し (つまり、Thinkpad キーボードから部品を取って)、モジュールの各ピンの機能を特定し、コントローラとトラックポイントモジュールの間に必要な回路を作成する必要があります。詳細については、Deskthority Wiki の[トラックポイントハードウェア](https://deskthority.net/wiki/TrackPoint_Hardware)ページを参照してください。
  8. PS/2 デバイスの接続は、USART(最善)、割り込み(次善)、 または busywait(非推奨)の3つのやり方が有ります。
  9. ## トラックポイントとコントローラ間の回路 :id=the-circuitry-between-trackpoint-and-controller
  10. 動作させるには、DATA と CLK のふたつのラインを 4.7k の抵抗で 5V にプルアップしてやる必要があります。
  11. ```
  12. DATA ----------+--------- PIN
  13. |
  14. 4.7K
  15. |
  16. MODULE 5+ --------+--+--------- PWR CONTROLLER
  17. |
  18. 4.7K
  19. |
  20. CLK ------+------------ PIN
  21. ```
  22. ## Busywait バージョン :id=busywait-version
  23. 注意: これは非推奨です。ギクシャクした動きや、未送信の入力が発生するかもしれません。可能であれば、割り込みまたは USART バージョンを使ってください。
  24. rules.mk で:
  25. ```makefile
  26. PS2_MOUSE_ENABLE = yes
  27. PS2_USE_BUSYWAIT = yes
  28. ```
  29. キーボードの config.h で:
  30. ```c
  31. #ifdef PS2_USE_BUSYWAIT
  32. # define PS2_CLOCK_PORT PORTD
  33. # define PS2_CLOCK_PIN PIND
  34. # define PS2_CLOCK_DDR DDRD
  35. # define PS2_CLOCK_BIT 1
  36. # define PS2_DATA_PORT PORTD
  37. # define PS2_DATA_PIN PIND
  38. # define PS2_DATA_DDR DDRD
  39. # define PS2_DATA_BIT 2
  40. #endif
  41. ```
  42. ## 割り込みバージョン :id=interrupt-version
  43. 以下の例はクロックのために D2 を、データのために D5 を使います。クロックには任意の INT あるいは PCINT ピンを、データには任意のピンを使うことができます。
  44. rules.mk で:
  45. ```makefile
  46. PS2_MOUSE_ENABLE = yes
  47. PS2_USE_INT = yes
  48. ```
  49. キーボードの config.h で:
  50. ```c
  51. #ifdef PS2_USE_INT
  52. #define PS2_CLOCK_PORT PORTD
  53. #define PS2_CLOCK_PIN PIND
  54. #define PS2_CLOCK_DDR DDRD
  55. #define PS2_CLOCK_BIT 2
  56. #define PS2_DATA_PORT PORTD
  57. #define PS2_DATA_PIN PIND
  58. #define PS2_DATA_DDR DDRD
  59. #define PS2_DATA_BIT 5
  60. #define PS2_INT_INIT() do { \
  61. EICRA |= ((1<<ISC21) | \
  62. (0<<ISC20)); \
  63. } while (0)
  64. #define PS2_INT_ON() do { \
  65. EIMSK |= (1<<INT2); \
  66. } while (0)
  67. #define PS2_INT_OFF() do { \
  68. EIMSK &= ~(1<<INT2); \
  69. } while (0)
  70. #define PS2_INT_VECT INT2_vect
  71. #endif
  72. ```
  73. ## USART バージョン :id=usart-version
  74. ATMega32u4 で USART を使うには、クロックのために PD5 を、データのために PD2 を使う必要があります。それらのいずれかが利用できない場合は、割り込みバージョンを使う必要があります。
  75. rules.mk で:
  76. ```makefile
  77. PS2_MOUSE_ENABLE = yes
  78. PS2_USE_USART = yes
  79. ```
  80. キーボードの config.h で:
  81. ```c
  82. #ifdef PS2_USE_USART
  83. #define PS2_CLOCK_PORT PORTD
  84. #define PS2_CLOCK_PIN PIND
  85. #define PS2_CLOCK_DDR DDRD
  86. #define PS2_CLOCK_BIT 5
  87. #define PS2_DATA_PORT PORTD
  88. #define PS2_DATA_PIN PIND
  89. #define PS2_DATA_DDR DDRD
  90. #define PS2_DATA_BIT 2
  91. /* 同期、奇数パリティ、1-bit ストップ、8-bit データ、立ち下がりエッジでサンプル */
  92. /* CLOCK の DDR を入力としてスレーブに設定 */
  93. #define PS2_USART_INIT() do { \
  94. PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT); \
  95. PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT); \
  96. UCSR1C = ((1 << UMSEL10) | \
  97. (3 << UPM10) | \
  98. (0 << USBS1) | \
  99. (3 << UCSZ10) | \
  100. (0 << UCPOL1)); \
  101. UCSR1A = 0; \
  102. UBRR1H = 0; \
  103. UBRR1L = 0; \
  104. } while (0)
  105. #define PS2_USART_RX_INT_ON() do { \
  106. UCSR1B = ((1 << RXCIE1) | \
  107. (1 << RXEN1)); \
  108. } while (0)
  109. #define PS2_USART_RX_POLL_ON() do { \
  110. UCSR1B = (1 << RXEN1); \
  111. } while (0)
  112. #define PS2_USART_OFF() do { \
  113. UCSR1C = 0; \
  114. UCSR1B &= ~((1 << RXEN1) | \
  115. (1 << TXEN1)); \
  116. } while (0)
  117. #define PS2_USART_RX_READY (UCSR1A & (1<<RXC1))
  118. #define PS2_USART_RX_DATA UDR1
  119. #define PS2_USART_ERROR (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
  120. #define PS2_USART_RX_VECT USART1_RX_vect
  121. #endif
  122. ```
  123. ## 追加の設定 :id=additional-settings
  124. ### PS/2 マウス機能 :id=ps2-mouse-features
  125. 以下の PS/2 マウスプロトコルによってサポートされる設定を有効にします。
  126. ```c
  127. /* デフォルトのストリームモードの代わりにリモートモードを使います (リンクを見てください) */
  128. #define PS2_MOUSE_USE_REMOTE_MODE
  129. /* マウスあるいはタッチパッドでスクロールホイールあるいはスクロールジェスチャーを有効にします */
  130. #define PS2_MOUSE_ENABLE_SCROLLING
  131. /* 一部のマウスでは、スクロールマスクを設定する必要があります。デフォルトは 0xFF です。*/
  132. #define PS2_MOUSE_SCROLL_MASK 0x0F
  133. /* ホストに送信する前に、動きに変換を適用します (リンクを見てください) */
  134. #define PS2_MOUSE_USE_2_1_SCALING
  135. /* ps2ホストを初期化した後の待機時間 */
  136. #define PS2_MOUSE_INIT_DELAY 1000 /* Default */
  137. ```
  138. ps2_mouse.h をインクルードして、以下の関数を呼び出すこともできます。
  139. ```c
  140. void ps2_mouse_disable_data_reporting(void);
  141. void ps2_mouse_enable_data_reporting(void);
  142. void ps2_mouse_set_remote_mode(void);
  143. void ps2_mouse_set_stream_mode(void);
  144. void ps2_mouse_set_scaling_2_1(void);
  145. void ps2_mouse_set_scaling_1_1(void);
  146. void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution);
  147. void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate);
  148. ```
  149. ### 細かい調整 :id=fine-control
  150. マウスの感度と速度を変更するには以下の定義を使います。
  151. 注意: 同じ効果のために `ps2_mouse_set_resolution` も使うことができます (ほとんどのタッチパッドではサポートされません)。
  152. ```c
  153. #define PS2_MOUSE_X_MULTIPLIER 3
  154. #define PS2_MOUSE_Y_MULTIPLIER 3
  155. #define PS2_MOUSE_V_MULTIPLIER 1
  156. ```
  157. ### スクロールボタン :id=scroll-button
  158. トラックポイントを使っている場合は、スクロールのためにそれを使えるようにしたいでしょう。
  159. 押された時にマウスを移動させる代わりにスクロールさせる「スクロールボタン」を有効にすることができます。
  160. この機能を有効にするには、以下のようにスクロールボタンマスクを設定する必要があります:
  161. ```c
  162. #define PS2_MOUSE_SCROLL_BTN_MASK (1<<PS2_MOUSE_BTN_MIDDLE) /* Default */
  163. ```
  164. スクロールボタン機能を無効にするには:
  165. ```c
  166. #define PS2_MOUSE_SCROLL_BTN_MASK 0
  167. ```
  168. 利用可能なボタンは:
  169. ```c
  170. #define PS2_MOUSE_BTN_LEFT 0
  171. #define PS2_MOUSE_BTN_RIGHT 1
  172. #define PS2_MOUSE_BTN_MIDDLE 2
  173. ```
  174. ボタン定数を `|` で結合したマスクでボタンを組み合わせることができます。
  175. スクロールボタンマスクを設定したら、スクロールボタンの送信間隔を設定する必要があります。
  176. これは、スクロールボタンが離された場合に、スクロールボタンがホストに送信されるまでの間隔です。
  177. この時間が経過すると、マウスはスクロールして送信されなくなります。
  178. ```c
  179. #define PS2_MOUSE_SCROLL_BTN_SEND 300 /* Default */
  180. ```
  181. スクロールボタンの送信を無効にするには:
  182. ```c
  183. #define PS2_MOUSE_SCROLL_BTN_SEND 0
  184. ```
  185. 以下の定義でスクロールの細かい制御がサポートされます:
  186. ```c
  187. #define PS2_MOUSE_SCROLL_DIVISOR_H 2
  188. #define PS2_MOUSE_SCROLL_DIVISOR_V 2
  189. ```
  190. ### マウスとスクロールの軸の反転 :id=invert-mouse-and-scroll-axes
  191. X 軸と Y 軸を反転するには、以下を config.h に配置します:
  192. ```c
  193. #define PS2_MOUSE_INVERT_X
  194. #define PS2_MOUSE_INVERT_Y
  195. ```
  196. スクロールの軸を逆にするには、以下を config.h に配置します:
  197. ```c
  198. #define PS2_MOUSE_INVERT_H
  199. #define PS2_MOUSE_INVERT_V
  200. ```
  201. ### マウスの軸の回転 :id=rotate-mouse-axes
  202. デバイスの出力を時計回りに 90 か 180 か 270 度変換します。
  203. デバイスの向きを補正する場合は、出力を逆の方向に同じ量だけ回転します。例えば、通常のデバイスの向きが北向きの場合、以下のように補正します:
  204. ```c
  205. #define PS2_MOUSE_ROTATE 270 /* 東向きのデバイスの向きの補正*/
  206. ```
  207. ```c
  208. #define PS2_MOUSE_ROTATE 180 /* 南向きのデバイスの向きの補正*/
  209. ```
  210. ```c
  211. #define PS2_MOUSE_ROTATE 90 /* 西向きのデバイスの向きの補正*/
  212. ```
  213. ### デバッグ設定 :id=debug-settings
  214. マウスをデバッグするには、`debug_mouse = true` を追加するか、ブートマジックを使って有効にします。
  215. ```c
  216. /* マウスレポートをデバッグするには */
  217. #define PS2_MOUSE_DEBUG_HID
  218. #define PS2_MOUSE_DEBUG_RAW
  219. ```
  220. ### 動作フック :id=movement-hook
  221. ホストに送信される前にキーマップでマウスの動作を処理します。使用例として、
  222. ノイズのフィルタリング、加速の追加、レイヤーの自動アクティブ化が含まれます。
  223. 使用するには、キーマップで次の関数を定義します:
  224. ```c
  225. void ps2_mouse_moved_user(report_mouse_t *mouse_report);
  226. ```