まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

富士通コンポーネントKB8811-251のスキャンコード

 また脱線。

 富士通コンポーネント(元 富士通高見澤)製のFKB8811-251。赤外線ワイヤレスのPS/2キーボード。10年くらい前に入手。赤外線受信機はマウス出力もある。赤外線を出すマウスもあったのだろうけど、私が買ったものにはついてなかった。

2012kybd251_1

 赤外線受信機側にCapsLock等のLEDがあるので、キーボード本体はキーに対応したコードを送るだけと思われる。

2012kybd251_2


 FKB8811で検索するとラック用のコンパクトキーボードとして出てくる。これをワイヤレスにしてマルチメディア関連のキーを追加したものらしい。この追加されたキーのスキャンコードが気になって調べた。

停止(■)	E0 3B / E0 F0 3B	なし
再生・一時停止(▶||)	E0 34 / E0 F0 34	なし
巻き戻し(|<<)	E0 15 / E0 F0 15	あり
早送り(>>|)	E0 4D / E0 F0 4D	あり
Vol-	E0 21 / E0 F0 21	あり
Mute	E0 23 / E0 F0 23	なし
Vol+	E0 32 / W0 F0 32	あり
App1	56 / F0 56	なし
App2	5E / F0 5E	なし
App3	8 / F0 8	なし
Email	18 / E0 18	なし
Internet	10 / E0 10	なし
ScreenSaver	65 / E0 65	なし
Sleep	E0 3F / E0 F0 3F	なし

PS/2キーボードの Power,Sleep,Wakeキー

またもや脱線。

 ELECOM TK-FCM008BK、これ112キーとあり、普通のPS/2キーボードにはないPower、Sleep、Wakeキーが付いている。500円台だったので買って調べてみた。

2012ps2

スキャンコード
キー名称 make / release
Power	E0 37 / E0 F0 37
Sleep	E0 3F / E0 F0 3F
Wake	E0 5E / E0 F0 5E
Powerキーは押すと電源OFFすることができる。ONはできない。PC本体が電源OFFの時にはPS/2キーボードに給電されていないからだ。しかしPowerキーの位置、危険な香り。

ELECOM メンブレン式キーボード 112キー PS2 スタンダードサイズ ブラック TK-FCM008BKELECOM メンブレン式キーボード 112キー PS2 スタンダードサイズ ブラック TK-FCM008BK

エレコム 2009-08-21
売り上げランキング : 3869

Amazonで詳しく見る
by G-Tools

記事タイトルPS/2キーボード変換器の製作(14) US配列でPS/2→USB変換OK

PS/2のスキャンコードをUSB UserIDまで変換できた。次にArduino Leonardoで扱っているコードに変換する。変換方法はほぼ同じで、テーブルを別に用意する。

https://gist.github.com/ab100bfb33a78ddf067d

PrtScr / ScrLock / Break まわりが難航した。ここはスキャンコードが面倒。
USBのコードをKeyboard.press()やKeyboard.release()で操作する時には充分に注意しないとスケッチの修正ができなくなる。Arduino IDEからソースをコンパイルする時にスケッチ画面に文字がタイプされてしまうからだ。

・Windows7(64bit)(英語キーボード配列の設定)に本アダプタと英語キーボードを接続し確認
・WindowsXP(日本語キーボード配列の設定)に本アダプタと日本語キーボードを接続し確認

○(1)PrintScreen / ALT+PrintScreen 正常動作
○(2)ScrLock正常動作(Excelで確認)
○(3)[目](App)キー正常動作
○(4)日本語入力/英数入力切り換え確認OK
○(5)接続したままPC本体電源ONでも動作OK。Windows7のパスワード入力も確認
×(6)[\ろ] キーと[¥]キーを\に対応させたいのだがうまくいかない(日本語キーボード接続時)
→これは無視してもよいか?

Arduino Leonardoのライブラリの制限で、PC側の[無変換][変換][かな]キーに対応するコードを送ることができない。外付けキーボードの[無変換][変換][かな]キーを別のキーに割り当てることは可能。

その他の問題点:
(a)アダプタを接続するたびにデバイスマネージャがデバイスドライバを探す。(WindowsXP)
Windows7ではドライバがインストールできなかったことを通知。でも気持ち悪い。
→できればArduino用のドライバを入れずに動かしたい

(b)キーボードのステータスがわからない。
→PC本体からの指示を受け取る手段がない。PS/2キーボード側に送信するプログラムを書いていない。
※本体接続のキーボードのランプは点灯する。

しばらく英語キーボード配列のPCに接続して使ってみる。並行してUS→JP変換のテーブルを作成。

追記:
(6)は日本語キーボードのみの問題で、キーに対応するコードがArduino Leonardoから送れないため。
(a)はブートローダ差し替えでできそう。32U4はHWB端子を見てブートローダを起動するかどうかを判断するが、Arduinoのブートローダは関連するフューズビットを設定していないらしい。 

PIC32MXのCPUまわりのエラッタ

 複雑なLSIの仕様を満たさない動作はエラッタとしてメーカーから公開される。これには動作の不具合の説明と、それを回避するワークアラウンドが載っている。ワークアラウンドはたいてい機能制限や性能低下につながる。これらは改版によって対処され、生産されるLSIは改版後のものに順次切り換えられる。

最近遊んでるPIC32MXのエラッタを調べてみた。CPU周りだけ。

20120404現在

□PIC32MX1XX/2XX PIC32MX575/675/695/775/795 共通
・CPUが書き込み操作時に割り込みが発生すると、書き込み操作が中断されて、割り込み処理完了後に再開される。この時に書き込み操作が中断されず、二重書き込みになることがある。
対策:大抵の場合二重書き込みは悪い影響はないが、SPI,I2C,UART,PMPの通信ではデータを二重に送ることがある。これを回避するにはDMA転送を使うか、これらの周辺にデータを書くときには割り込みを禁止する。

□PIC32MX575/675/695/775/795
・プリフェッチ機能と命令キャッシュを有効にしている状態で、CPUがフラッシュメモリのデータをアクセスしている(命令フェッチではない)時に割り込みが発生するとデータバス例外が起きることがある。
対策:以下2つの方法がある。
1.CPUがフラッシュメモリのデータにアクセスする間は割り込みを使わないようなプログラムにする。
2.プリフェッチか命令キャッシュのどちらかを無効にする。
※2.は10%未満の性能インパクト

 現在秋月電子で入手できる28pinDIPのPIC32MX1XX/2XXは最大40MHz動作、PC32MX575/675/695/775/795は最大80MHz動作。どちらも割り込みが関係している。MIPS M4Kの問題だろうか?

microchip.com | errata

PIC32MX1XX/2XX Family Silicon Errata and Data Sheet Clarification A0 A1まで

10. Module: CPU

 During normal operation, if a CPU write operation is interrupted by an incoming interrupt, it should be aborted (not completed) and resumed after the interrupt is serviced. However, some of these write operations may not be aborted, resulting in a double write to peripherals by the CPU (the first write during the interrupt and the second write after the interrupt is serviced).

Work around

 Most peripherals are not affected by this issue, as a double write will not have a negative impact.
However, the following communication peripherals will double-send data if their respective transmit buffers are written twice: SPI, I2C, UART and PMP.

 To avoid double transmission of data, utilize DMA to transfer data to these peripherals or disable interrupts while writing to these peripherals.

PIC32MX575/675/695/775/795 Family Silicon Errata and Data Sheet Clarification A0 A1 A3まで

Work around

 To avoid a DBE, use one of the following two solutions:

1. Structure application code, such that interrupts are not used while the CPU is accessing data from Flash memory.
2. Disable either the Prefetch module or CPU cache functionality as follows (by default both are disabled  on a Power-on Reset (POR)):
a) To disable the Prefetch module, set the Predictive Prefetch Enable bits, PREFEN<1:0>, in  the Cache Control Register, CHECON<6:5>, to‘00’.
b) To disable CPU cache, set the Kseg0 bits, K0<2:0>, in the CP0 Configuration Register, Config<2:0>, to ‘010’.

Note: Disabling either the cache or Prefetch module will have minimum performance degradation, with a typical application realizing 10 percent or less performance impact.


44. Module: CPU ※PIC32MX1XX/2XX 10. Module: CPUと同じ


追記:New pic32mx7 errata

CUI32Stem届いた

 SeeedStudioで扱っているPIC32MXマイコンボードCUI32Stemが届いた。$29.95で日本向けの送料は無料。注文から約10日。急ぎの便もある。

SeeedStudio CUI32Stem

 あれえ、今注文したらピンヘッダが付いてるじゃない。

CUI32Stemは、80MHz/512K Flash/128K RAMのPIC32MX795F512Hを搭載した名刺サイズのマイコンボード。で、BASICインタプリタを搭載している。開発キットは特に必要なく、端末となるパソコンがあればOK。
その他の特徴は:
8 DMA Channels
3 SPI
4 I2C
6 UART (serial ports)
Full Speed USB 2.0 Device or Host mode
16 A/D channels, 10-bit resolution

電源はUSBコネクタまたは電源端子から(スイッチ切り換え)。USBはホストモードもある(スイッチ切り換え、コネクタ未実装)。
電源LEDは赤。動作中を示すHertBeat用の緑LEDはpin RE0に接続されている。
タクトスイッチはRESETとpin RE7に接続されているPROGボタンがある。
システムクロックは8MHzのX'tal。RTCC用の水晶はついていない。

開発元:
OVERTONE Labs

Wiki:
seeed wiki CUI32Stem

使い方:
StickOS™ BASIC User's Guide, v1.90

2012CUI32stem


ではMacOSXに接続して遊んでみよう。mini-BのUSBケーブルでCUI32Stemを接続し、ターミナルを開く。
ls /dev/tty.* でシリアルポートを確認し、screenコマンドで接続する。
例:screen /dev/tty.usbmodem621
リターンキーを一回押すとプロンプトが出てくる。あとはBASIC。

ではprogボタンを押すと現在のtick値を表示するプログラムを作ってみる。

 
  10 dim prog as pin re7 for digital input
  20 while 1 do
  30   if prog==0 then
  40     print ticks
  50   endif 
  60 endwhile 
行番号とともに打ち込んだ後、run。基板上のprogボタンを押すと表示される。

次はFizzBuzz。サブルーチンには引数を渡せる。


  10 dim i
  20 for i = 1 to 100
  30   gosub fizzbuzz i
  40 next 
  50 end 
 100 sub fizzbuzz n
 110   if n%3==0 then
 120     if n%5==0 then
 130       print "FizzBuzz"
 140     else 
 150       print "Fizz"
 160     endif 
 170   elseif n%5==0 then
 180     print "Buzz"
 190   else 
 200     print n
 210   endif 
 220 endsub 
ちょっと試してみたが面白い。昔BASICで遊んだことのある人はすぐ慣れると思う。BASICの文法は変数の宣言が必要で、式はC言語に似てて、ちょっと厳格になった感じ。また変数はすべて配列扱いで通常は変数名[0]が参照される。

そうねえ、印象としてはむき出しのプチコン。
 

PS/2キーボード変換器の製作(13) ハードウェアはできたが……

ハードウェアはできた。Daviciマイコンボードに6Pのmini-DINコネクタを接続、CLKとDATAをプルアップしてケース収納。
2012key01
2012key02
2012key03

 あとはPS/2のスキャンコードをUSB-UIDに変換(済)、Arduino Leonardoのkeyboard.press()に変換、さらに日本語キーボードの配列に変換するだけなのだが、問題点発覚。

以前調査した、Arduino IDE1.0.1でのコード変換部分。
Arduino IDE1.0.1/Leonardで足らないUSBキーを追加する
[HID.cpp]
	uint8_t i;
	if (k >= 136) {			// it's a non-printing key (not a modifier)
		k = k - 136;
	} else if (k >= 128) {	// it's a modifier key
		_keyReport.modifiers |= (1<<(k-128));
		k = 0;
	} else {				// it's a printing key
		k = pgm_read_byte(_asciimap + k);
		if (!k) {
			setWriteError();
			return 0;
		}
		if (k & 0x80) {						// it's a capital letter or other character reached with shift
			_keyReport.modifiers |= 0x02;	// the left shift modifier
			k &= 0x7F;
		}
	}
 上記ソースはkeybord.press()でコードを変換している箇所。与えられた数値が0x00〜0x7fを印字可能なキー、0x80〜0x87をモディファイアキー、0x88〜を表示不能な特殊キーとみなしている。0x00〜0x7fは const uint8_t _asciimap[128] で定義されてあるテーブルで変換される。0x88以上は、その値から0x88を引いた数値がUsageIDとしてUSB経由で送信される。つまり、ファンクションキーF7は #define KEY_F7 0xC8 と定義されているが、実際は0xC8ー0x88=0x40が送信される。
 ここで漏れてしまうキーは、UIDが0x78より大きいもので、日本語キーボード関連で影響がありそうなものは
[ろ](0x87)、[かたかな/ひらがな](0x88)、[¥](0x89)、[変換](0x8a)、[無変換](0x8b)、[かたかな](0x92)、[ひらがな](0x93)、[全角/半角](0x94)。
特に最後の[全角/半角](0x94)は日本語キーボードと認識している場合どうしたものか。USB-HIDをそのまま送出する方法を探すしかないのか。

 ターゲットとなるPCがキーボードを日本語配列と認識している場合、ALT+[`]が[全角/半角]と同等か調査し、もし違っていればUSB-UIDを直接送出する方法を探す。

追記: 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('`');
    delay(10);
    Keyboard.release('`');
    Keyboard.release(KEY_LEFT_ALT);
 
WindowsXPにてこれで日本語入力が切り替わることを確認。助かった。MacOSXではそのままALT+`扱い。 

PS/2テンキーボード FMV-NTKB1の調査

ちょっと脱線。昔、USBポートのなかった頃のノートPCのオプションでPS/2接続のテンキーボードがあったのだが、この挙動が謎だった。スキャンコードを観測できるようになって、コードの割り当てがまったく違うことがわかった。

2012tenkey

富士通 FMV-NTKB1 テンキーボード

キー名称 make/releaseコード

NumLock 01 / 81
7home 02 / 82
4← 03 / 83
1End 04 / 84
/ 06 / 86
8↑ 07 / 87
5 08 / 88
2↓ 09 / 89
0Ins 0A / 8A
* 0B / 8B
9PgUp 0C / 8C
6→ 0D / 8D
3PgDn 0E / 8E
.Del 0F / 8F
- 10 / 90
+ 11 / 91
Enter 13 / 93

キーリピートなし

 要は専用のオプションだったってことですね。

PIC32MX搭載のマイコンボード

PIC32MX搭載のマイコンを調べてみた。国内で買えるものはまだ少ない。

□Pinguino PIC32MX (80/256/32)
PIC32 Pinguino - PIC32MX440F256H dev board - $31.46

・PinguinoというArduino類似の開発環境が使える。

□CUI32Stem PIC32MX795F512H(80/512/128)
CUI32Stem $29.95

CUI32Stem Wiki
OVERTONE Labs
StickOS™ BASIC User's Guide, v1.90

・StickOSが使える。BASICが使える。

□CUI32 PIC32MX440F512H(80/512/32)
CUI32 PIC32MX Development Stick $39.95

・CUI32Stemの以前の版っぽい。

□UBW32 PIC32MX795 (80M/512K/128K)

□chipKIT Arduino互換のIDEを提供 国内でも販売

chipKIT

PIC32MX795 (80/512/128)
chipKIT Max32™ Prototyping Platform 
chipKIT Max32 Arduino-Compatible Prototyping Platform 5900円
 
PIC32MX320F128 (80/128/16) 
chipKIT Uno32™ Prototyping Platform 
chipKIT Uno32 Arduino-Compatible Prototyping Platform 3400円

PS/2キーボード変換器の製作(12) Scancode→USB UID変換

作業メモ:
https://gist.github.com/3056964
 

 scancodeからUSB-UserIDへの変換ができた。256バイトのテーブルを使って通常と拡張モード(0xE0)付きのスキャンコードを変換。可変長で扱いが面倒なスキャンコードをUSB-UserIDの固定長にした。
USB-UserIDは0x70に続く2バイトで表現。先頭のbit15はキーを離した時に1、とした。
 また、CTRL,SHIFT,ALT,GUI(META)キーの状態取得、Caps/Num/Scrのロック状態を取得。

 残りは特殊なキー[PrtScn]と[Pause/break]の取り扱い。特に[PrtScn]はalt併用状態をどう扱うか。
ここまでやれば英語キーボードの変換は一応済となる。

 あとはUSB-UserIDから日本語キーボード配列向けのUSB-UserIDに変換するテーブルを作成、ケース組み込み。

PS/2キーボード 特殊なキーのスキャンコード

 スキャンコードが安定して取得できるようになったので、特殊なキーについて確認した。

拡張:E0 リリース:F0

[PrtScn]
E0 12 E0 7C / E0 F0 7C E0 F0 12

[Alt]+[PrtScn]
84 / F0 84

[PrtScn]とその他[Ctrl]、[Shift]、[Meta(Windows)]を組み合わせても[Alt]優先。

※Windowsでのハードコピーが[PrtScn]と[Alt]+[PrtScn]なのはこの組み合わせしか区別がないから

[Pause/Break]
E1 14 77 E1 F0 14 F0 77

[Ctrl]+[Pause/Break]
E0 7E E0 F0 7E

[Pause/Break]を押すとすべてのキーリピートが止まる。

[App](windowsキーと一緒に追加されたマウスの右クリック相当のやつ)
E0 2F / E0 F0 2F


調査はMicrosoft Keyboard Elite(US版)でやったのでリファレンス的には問題ないだろう。

記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ