Universal Foldable Keyboard のレビュー
結局 amazon.com (US) から買ってみました。ちゃんと技適マーク付きのが来ました。日本で買うより安いです。
説明書が入ってなくて、なんかよくわからんイラストだけです。IKEA の説明書みたいなやつと言えばわかる人にはわかるでしょう。
配列自体は変態配列で、たとえ US 配列でも普通のキーボードと比べて打ちやすくはないです。右側はキー数が多いせいでピッチが狭かったり、中央付近で折れる構造のために中央付近のキーがなんか変な感じがします。
よくできてるなと思ったところは
- 同時に2つペアリングができて、ボタン1発で切替えができる
- OS切替ボタンがあって、Windows/Android/iOS でキーマップが変わるようになっている
あたりです。
同時に2つペアリングするやつは、それぞれに別々の BLE アドレスがふられているので、近くにある別々の機器に同時にペアリングして、ボタンで切替えながら入力先を変更できるので、Windows/Mac で開発しながら、Android もデスクに置いて切替えて入力するみたいなことができて便利そうです。
Universal Foldable Keyboard の仕様
まぁレビューするために買ったんじゃないんですよ。BLE キーボードの参考実装として買ったのです。ということで以下技術的な仕様をレビューします。
GATT 構造のダンプ
以下のようになっています。Device Information の Firmware Revision に CSR uEnergy SDK 2.4.2 と入っていたので、CSR のチップなのでしょう。Unknown Service が2つありますが、CSR の DFU まわりのためのサービスのようです。
HID Information の Base USB Specification Version に 0x213 が入っていて異常です。HID のスペックは 1.11 が最新のはずなので、(BCD で) 0x111 とかが正しいと思うのですが、2.13 という謎のバージョンになっています。
Device Information Service の PnP ID は source=USB VID=0x45e PID=2060 version=272 でした。
Connection Parameter は
- 15ms - 15ms
- Slave Latency 33
- Supervision Timeout: 600
でした。
他には特に気になるところはありません。
Generic Attribute (0x1801) - Service Changed [I] (0x2A05) Client Characteristic Configuration (0x2902) Generic Access (0x1800) - Device Name [R W] (0x2A00) - Appearance [R] (0x2A01) - Peripheral Preferred Connection Parameters [R] (0x2A04) Human Interface Device (0x1812) - Report Map [R] (0x2A4B) External Report Reference (0x2907) - Report [N R] (0x2A4D) Client Characteristic Configuration (0x2902) Report Reference (0x2908) - Report [N R] (0x2A4D) Client Characteristic Configuration (0x2902) Report Reference (0x2908) - Report [R W WNR] (0x2A4D) Report Reference (0x2908) - Report [R W] (0x2A4D) Report Reference (0x2908) - HID Information [R] (0x2A4A) - Boot Keyboard Input Report [N R] (0x2A22) Client Characteristic Configuration (0x2902) - Boot Keyboard Output Report [R W WNR] (0x2A32) - HID Control Point [WNR] (0x2A4C) - Protocol Mode [R WNR] (0x2A4E) Battery Service (0x180F) - Battery Level [N R] (0x2A19) Client Characteristic Configuration (0x2902) Report Reference (0x2908) Unknown Service (a74df799-13fd-4f82-a45a-0340180eac97) - Unknown Characteristic [R W] (343f8f87-ec68-41a7-a97f-3141b2424e1d) Unknown Service (00001016-d102-11e1-9b23-00025b00a5a5) - Unknown Characteristic [R W] (00001013-d102-11e1-9b23-00025b00a5a5) - Unknown Characteristic [W] (00001018-d102-11e1-9b23-00025b00a5a5) - Unknown Characteristic [N R] (00001014-d102-11e1-9b23-00025b00a5a5) Client Characteristic Configuration (0x2902) Device Information (0x180A) - Firmware Revision String [R] (0x2A26) - PnP ID [R] (0x2A50) Scan Parameters (0x1813) - Scan Interval Window [WNR] (0x2A4F) - Scan Refresh [N] (0x2A31) Client Characteristic Configuration (0x2902)
HID ReportMap
Report Map を読み出して、人力でパースしました。自動的にパースしてダンプしてくれるツールってないんですかね? おかげで人力で結構 HID Report Map が読めるようになってしまいました。
概要としては
- report id = 1 が通常のキーボードのレポート
- ただし feature report の定義もある (詳細は不明)
- report id = 3 がメディアキーとかのレポート
- 音量とか再生ボタンとか
report id = 2 が抜けてますが、Report Map Characteristics に External Report Reference Descriptor がついており、Battery Level Characteristics の UUID が入っていました。そして Battery Level Characteristics に Report Reference Descriptor がついており、report id = 2 / input report として定義されていました。これって HID の Report Map の中には定義しなくていいんでしょうか? HOGP とかの仕様書を読んでもどうしてもよくわからないのですが…… HID にもバッテリー情報を送る決まりはありますが、それは関係ないんでしょうか。(というか BLE のバッテリー情報に主要OSが対応してないのでどうしよもないです)
feature report の仕様はよくわかりません。MS 提供のツールで、言語設定を上書きできるので、これの操作に使われているような気がしています。
05-01 Usage Page (Generic Desktop) 09-06 Usage (Keyboard) A1-01 Collection (Application) 85-01 Report ID (0x01) 05-07 Usage Page (Key Codes) 19-E0 Usage Minimum (224) 29-E7 Usage Maximum (231) 15-00 Logical Minimum (0) 25-01 Logical Maximum (1) 75-01 Report Size (1) 95-08 Report Count (8) 81-02 Input (Data, Variable, Absolute); Modifier data 95-05 Report Count (5) 75-01 Report Size (1) 05-08 Usage Page (Page# for LEDs) 19-01 Usage Minimum (1) 29-05 Usage Maximum (5) 91-02 Output (Data, Variable, Absolute) ; LED report 95-01 Report Count (1) 75-03 Report Size (3) 91-03 Output (Constant, Variable, Relative) ; padding 95-07 Report Count (7) 75-08 Report Size (8) 16-00-00 Logical Minimum (0) 26-FF-00 Logical Maximum (255) 05-07 Usage Page (Key Codes) 19-00 Usage Minimum (0) 2A-91-00 Usage Maximum (145) 81-00 Input (Data, Array, Absolute); Key arrays 05-0C Usage Page (Consumer) 0A-C0-02 Usage (0x02c0/704 ?) A1-02 Collection (Logical) 85-01 Report ID (0x01) 1A-C1-02 Usage Minimum (705) 2A-C6-02 Usage Maximum (710) 75-08 Report Size (8) 95-06 Report Count (6) B1-03 Feature (Content, Variable, Relative) C0 End Collection C0 End Collection 05-0C Usage Page (Consumer) 09-01 Usage (Consumer Control) A1-01 Collection (Application) 85-03 Report ID (0x03) 75-10 Report Size (16) 95-01 Report Count (1) 15-01 Logical Minimum (1) 26-FF-03 Logical Maximum (1023) 19-01 Usage Minimum (1) 2A-FF-03 Usage Maximum (1023) 81-60 Input (No Preferred, Null state) C0 End Collection
ドライバ
Windows に接続すると、専用のドライバが読みこまれることを確認しました。なんのためにそうなっているのかよくわかりませんが、明確に Windows の汎用 kbdhid ドライバとは違いがあります。
自作キーボードを Universal Foldable Keyboard に成り済まして検証する
だいぶあれ気ですが、PnP ID を偽称して Universal Foldable Keyboard に成り済まして消費電流を検証しました。Universal Foldable Keyboard を買ってやりたかった一番のことがこれです……
結果的に、汎用 kbdhid ドライバだと 800μA ぐらいの消費が、Universal Foldable Keyboard のドライバを読みこませることで 200μA まで減るということがわかりました。ドライバ内でなにかしら調節しているようです。チートかよ。
備考:Windows のドライバロード手順
デバイスが接続されると以下のディレクトリの .inf からデバイスドライバが検索される。BLE 接続後、しばらくプログレスバーが表示されるが、これを検索している時間分待たされるっぽい。
C:\Windows\System32\DriverStore\FileRepository
.inf の中に以下のような行がある。
%UniversalFoldableKeyboard.DeviceDesc% = UniversalFoldableKeyboard, HID\{00001812-0000-1000-8000-00805f9b34fb}_Dev_VID&02045e_PID&080c&Col01
ここのやつがデバイスとマッチするとドライバがロードされる。VID/PID は PnP ID、Col01 は HID の Report Map の中のコレクションの Report ID ?っぽいがよくわからない。Collection もうまく一致していないとロードされない。
一致するドライバがみつかると C:\Windows\INF 以下に oemNN.inf oemNN.PNF としてコピーされる。次回からはここの .inf が読まれるのですぐ接続される。