帰ってきたGPD Pocketの中

"Dキー"の入力が渋いので返品修理を受けたGPD Pocket。
Facebookのユーザページを見ていたところ、ロットによってはハードウェアの変更が入っているようなので、開けてみてみた。
f:id:nobu_macsuzuki:20170801133048j:plain
おー、しっかり更新されて、バッテリーコネクタの補強がただのスペーサからネジ止めカバーになっていた。
待てば海路のなんとやらで、よかったよかった。

GPD Pocketの日本語化でお悩みの貴兄に

まさかとは思うが、念のためにまとめ。
基本はここに書かれているWindows8 / 8.1の日本語化と一緒だ。
初回起動時に日本語を選択すれば、この作業は必要ない"はず"だ。
"はず"と書くのは、一度他の言語などで起動されたOSは、なぜか初期化しても"必要ないはず"の通りにはならない。
その場合には、上記の"Add Language"と日本語言語パックの導入が必要だ。


何度かやってみると"ようこそ"の画面などが日本語化しないことがあるので、その場合には"ようこそ"画面などが英語のままの場合を適用するとよい。


それと、起動時に日本語入力がデフォのほうがよい方は、日本語-Microsoft IMEがデフォルトでなく、起動時に英語入力になってしまう場合も適用すべし。

ガジェットリスト更新

Vaio Tap 11(Haswell Pentium-Y) -> Vaio Tap 11(Haswell i5-Y) -> Cube i5(Skylake m3) -> Surface Pro 3(Haswell i5) -> Surface Pro 4(Skylake i5)と、4度目の2 in 1の更新。
更新するたびに前の機種はebayなどで売り払っているので、差額はわずか。
今回の差額も$50ほどになりそうだ。
スタートから累計しても$700+なので、新品でSurface Pro 4を買うほどではない。
なかなかなわらしべ長者だ。

Virtual BoxでLinux Mint 18.1 on GPD Pocketーその2、うまく行きました

こちらで紹介した、VirtualBoxを入れるとGPD Pocketが正常にシャットダウンをしなくなる件だが、一度GPD Pocketを初期化をしたところ、ちゃんとシャットダウンをするようになった。
最近のOSの場合には画面が消えてからも中の小人さんたちが頑張って働いていて、実際に電源断するのはだいぶ後だ。
初期化する前は、VirtualBoxをインストールした後にGPD Pocketをシャットダウンすると、電源ボタンの白色LEDが消えずにずっと点いたままだったのだ。
これが初期化後は、20秒ほどで消えるようになった。
おそらくどれかのドライバがちゃんと入っておらず、そのせいでOSが落ちなかったのだろう。
ということで、同様の症状でお悩みの貴兄は、デバイスマネージャで片っ端からドライバの手動更新をかけてみるとよいだろう。

GPD Pocketをリイメージ、クリーンインストールしたらWiFiが接続しないとお悩みの貴兄に

果たして"きれいな躰"に戻ったGPD Pocket、ふと気が付くとWiFiに接続しない。
バイスマネージャーで見てみると、ドライバはちゃんと入っているようだ。
ググってみると、RS2が適用されている場合にはスクリプトを入れる必要があるようだ。
GPD Winのものがそのまま使えるので、これを入れればよい。
https://mega.nz/#!VUhTWCja!_geaVwKq3tgTkFoFlviUrbPgbhH88WdCAtg3TN88bqk

GPD Pocket お帰りなさい&ケースいらっしゃい

f:id:nobu_macsuzuki:20170723153954j:plain
こちらで郷里に返したGPD Pocketだが、一か月ぶりに帰ってきた。
着くまでに一週間、着いてから修理着手まで丸二週間、一日で修理、一日で発送、到着まではわずかに三日だった。
まだ件の"D"キーは若干渋いものの、前に比べればはるかに改善したので良いとしよう。
まだIndieGoGo向けの発送対応で忙しいところに、修理対応してくれたのはありがたい。


修理の内容なのだが・・・

  • リイメージしたOSはそのまま
  • ディスプレイ側の筐体にあった小さな傷もそのまま
  • キーボード脇に貼ったフェルトがテープごとなくなっている、貼った形跡すら残っていない

なので、下側筐体を入れ替えたようだ。
確かに修理前は"D"キーと筐体がこすれるような渋さがあった。
下側筐体とキーマットのクリアランスに問題があったのかもしれない。


さてその一か月の間にケースなぞ買ってみた。
MacBook同様の総アルミの筐体は傷には弱い。
Facebookのユーザページを見ていたところ、Nexus 7の純正スリーブがよく合う、しかも今なら激安、との情報があった。
果たしてGPD Pocketとほぼ同時に到着した。
なかなか良い感じだ。

EZ-USBでUSB HID

再びEZ-USB、目標のUSB HIDだ(再び既視感・・・)

まず例題にあるサンプルにある"hid_kb"を"フラッシュ"できるようにしてみよう。


この開発キットに入っている参照実装はCY3684用のものだ。
このキットにはスイッチや7セグLEDがついているのだが、これらはI2Cで接続されているのだ。
これらを扱うものはコンパイルはできるが、今回使っているEZ-USB FX2LP基板に焼くとチップが動作しなくなってしまうのだ。
なので、今回はまずサンプルの"hid_kb"を基板に焼けるようにする。
つまりI2C周りのコードを全て削除してしまう。

サンプルプロジェクトを開く

  • (開発キットのルート)\Firmware\hid_kbの下の"hid_kb.Uv2"をダブルクリックして、Keil uVision 2を起動する

I2Cを使用する部分をコメントアウトする

	EZUSB_InitI2C();			// Initialize EZ-USB I2C controller
     EZUSB_ReadI2C(BTN_ADDR,0x01,&buttons);	// Read button states

      EZUSB_WriteI2C(LED_ADDR, 0x01, &leds);
      EZUSB_WaitForEEPROMWrite(LED_ADDR);

こりだけ。
ビルドして、EZ-USB FX2LPの基板に焼いてみる。
バイスマネージャーでVIDが"0x04B4"、PIDが"0x1005"のキーボードがいれば、そいつです。


さて、これではあまりにも面白くない。
動作も確認できない。
そうだ、思い切ってマウスにしてやろう。

USBデバイススクリプターを書き換える

  • Keil uVsion 2で"dscr.a51を開く

これはUSBデバイススクリプターが8051のアセンブラで書かれたものだ。
下の方にスクロールしていくと、"HIDReportDscr"という、HIDデバイスのでスクリプターがある。
これを以下のように書き換える。

HIDReportDscr:
        db 05h, 01h     ; 	Usage Page (Generic Desktop),
	db 09h, 02h     ; 	Usage (Mouse),
	db 0A1h, 01h    ; 	Collection (Application),
	db 09h, 01h     ;           Usage (Pointer), 
	db 0A1h, 00h	;	    Collection (Physical),
	db 95h, 03h     ;               Report Count (3),
	db 75h, 01h     ;               Report Size (1),
	db 05h, 09h	;	        Usage Page (Buttons),
	db 19h, 01h	;	        Usage minimum (1)
	db 29h, 03h	;	        Usage maximum (3)
	db 15h, 00h     ;               Logical minimum (0),
	db 25h, 01h     ;               Logical maximum (1),	
	db 81h, 02h     ;               Input (Data, Variable, Absolute), (3 button bits)
	db 95h, 01h     ;               Report Count (1),
	db 75h, 05h     ;               Report Size (5),
	db 81h, 01h     ;               Input (Constant)
	db 75h, 08h	;		Report Size (8)
	db 95h, 02h	;               Report Count (2)              
	db 05h, 01h     ;               Usage Page (Generic Desktop),
	db 09h, 30h     ;               Usage (X),
	db 09h, 31h     ;               Usage (Y),
	db 16h, 01h,80h     ;               Logical Minimum (-127),
	db 26h, 0ffh,7Fh     ;               Logical Maximum (+127),	
	db 81h, 06h     ;               Input (Data, Variable, Relative), (2 position bytes - X & Y)
	db 0C0h         ;            End Collection
	db 0C0h         ;        End Collection
HIDReportDscrEnd:

これでなんとマウスになってしまう。
嘘だと思うなら、ビルドしてフラッシュしてみるがよい。
さっきと同じVID、PIDのマウスがデバイスマネージャーにあるはずだ!


これだけでは面白くないので、右クリックと左クリックも実装しよう。

ボタンを読み出す関数を実装する

  • "periph.c"に以下のread_buttonを実装する
BYTE read_buttons (void)
{
	BYTE PortA, Buttons;
    PortA = IOA;

	switch (PortA)
	{
	    case 0xFE:   //PA0 is "L"
		    Buttons = 0x01;
			break;
		case 0xFD:   //PA1 is "L"
		    Buttons = 0x02;
			break;
		default:
		    Buttons = 0x00;
		    break;
	}

	return Buttons;
}

PA0を左クリックに、PA1を右クリックにマッピングした。
どちらのピンもGNDに下げられると、そのボタンを押したと検出するようにする。

ボタンの値をレポートするようにTD_Pollを変更する

  • "periph.c"の"TD_Poll()"を以下のように変更する
void TD_Poll(void)             // Called repeatedly while the device is idle
{
	if( !(EP1INCS & 0x02) )	// Is the EP1INBUF available,
	{
	    buttons = read_buttons();
		if ((oldbuttons - buttons) != 0)	//Change in button state
		{
			EP1INBUF[0] = buttons;
			EP1INBUF[1] = 0x00; // X is 0
			EP1INBUF[2] = 0x00; // Y is 0
			EP1INBC = 3;
		}
		oldbuttons = buttons;
	}
}

後はビルドしてフラッシュすればEZ-USB FX2LP基板がマウスの右クリック、左クリックとして動作する。