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基板がマウスの右クリック、左クリックとして動作する。

EZ-USB FX2LPでLチカ

引き続きEZ-USB FX2LP。
早速ウゴウゴルーガ
まずは定番のLチカだ(あれ、なんだか既視感が・・・)

プロジェクトを作成

  • Keil uVision 2を起動する、最近開いたプロジェクトが開く場合には、"Project" -> "Close Project"で閉じる
  • "Project" -> "New Project..."を選択する
  • 適当なプロジェクトフォルダーを作り、プロジェクトファイルを保存する、筆者は(開発キットのルート)\Firmwareの下に"Blink"フォルダーを作り、プロジェクト名を"Blink"とした
  • "Select Device for Target 'Target 17"というウィンドウが開くので、"Cypress Semiconductor" -> "EX-USB FX2"を選択する

ライブラリー、ビルドオプションを設定する

  • "Project" -> "Components, Environment and Books"を選択する
  • 開いたウィンドウで"Folder Extentions"タブを選択する
    • "Use Settings from TOOLS.ini"のチェックボックスを外す
    • "BIN"が"C:\Keil\C51\BIN\"となっていることを確認
    • "INC"に"(開発キットのルート)\Target\Inc\;C:\Keil\C51\INC\"を追加
    • "LIB"に"C:\Keil\C51\LIB\"を追加
    • "OK"で設定を抜ける
  • "Project" -> "Option for Target'Target 1'"を選択する
    • "Output"タブの"Create HEX File"にチェックを入れる
    • "B51 Locate"タブの"Use Memory Layout from Target Dialog"のチェックを外し、"Code Range"を0x80に、"Xdata Range"を0x1000にする
    • "OK"で設定を抜ける

Lチカを実装

  • "File" -> "New..."を選択
  • 開いたテキストファイルに以下を実装
#define ALLOCATE_EXTERN
#include "fx2.h"
#include "fx2regs.h"

main()
{
	OEA = 0xFE; // set PA7 to PA1 as output, PA0 as input
	IOA = 0x00;

	while(TRUE)
	{
		if (IOA & 0x01 == 0x01) // if PA0 is "H"
			IOA = 0xFF; // set all other A port pins to "H"
		else
			IOA = 0x00; // set all other A port pins to "L"
	}
}
  • "File" -> "Save"を選択して保存する、筆者はファイル名を"blink.c"とした
  • "Project" -> "Components, Environment and Books"を選択する
  • "Project Components"タブで、"Add Files"ボタンを押し、上記で保存したファイルを指定して"Add"を押す

ビルド

  • "Project" -> "Build Target"を選択

これでCyControl.exeでフラッシュできるFWが出来上がる。
ファームウェアは"プロジェクト名.hex"となる。
早速CyControl.exeで焼いてみる。

実機に焼く

  • EZ-USB FX2LPのボードをPCに接続
  • (開発キットのルート)\Windows Applications\Application Source files\c_sharp\controlcenter\bin\Releaseの"CyControl.exe"を起動
  • "Program" -> "FX2" -> "RAM"で先ほどビルドしたFWを選択

PA0のピンは弱くプルアップされているので、この状態でPA7 - PA1はすべて"H"になっているはずだ。
LEDのアノードをPA1につなぐと点灯する。
PA0にGNDをつなぐと、LEDが消える。

EZ-USB FX2LPの開発環境を構築する

さて先日までPIC32の開発をしていたのだが、今さらPIC32では用に足りないことが分かった。
今回はHSのUSBターゲットが必要で、PIC32はFSまでしか対応していないのだ、orz。
ということで仕切り直して、EZ-USBに切り替えた。
筆者は過去にFX2を使ってUSBターゲットデバイスを実装したことがあるので、なーに、簡単簡単。
しかしそこはそれ、忘却曲線は急峻なうえ、この手のものはあちこちに地雷が埋まっている。
なかなか一筋縄では行かなかった。
しかも、PICに比べるとEZ-USBはコミュニティが小さいので、なかなか厄介であった。


まず開発に使うデバイスだが、CypressのFX2LPの開発キットCY3684はなかなかお値段がよろしい。
安いものはないかと物色していると、こんなものを発見した。

56ピンのCY7C68013Aを搭載していて、なにやらE2PROMのようなものもある。
早速購入、PCに接続・・・おや認識しないぞ?
実はこれはSaleaが以前販売していたUSB接続ロジックアナライザーのクローンらしい。
なのでamazonでも"ロジックアナライザ"などと書いてあるのね、納得。
ちなみにそちらに興味がある方はこちらを見てみるとよい。
回路図も入手できた、後人のためにGoogle Driveに保管しておく、https://drive.google.com/open?id=0B2jNhsdZggc5YXBBMnBZYVV6NkE
果たして、唯一あるジャンパがFW用のE2PROMの接続をしているらしい。
ぶちっとな、とぶっこ抜く。
これで、素のEZ-USB FX2LPとして動作するようになった。


次に開発ツールだが、これはCY3684のものがそのまま使える・・・はずだ。
こちらからダウンロードできる、http://www.cypress.com/file/135301
これを展開・実行すると、参照実装やマニュアル、ユーティリティー、ドライバからなる開発キットと、Keil uVision 2 IDEがインストールされる。
ジャンパをぶっこ抜いたEX-USB FX2LPボードをつなぐと、ドライバーが・・・導入されない。
慌てずデバイスドライバで見てみるとVIDが0x04B4、PIDが0x8613という見慣れた不明なデバイスがいるはずだ。
これを右クリックして、ドライバの更新をする。
ドライバは、(開発キットのルート)\Drivers\Win8.1\x64の下にいるものがWindows 10 64bit版なら使える。
ドライバが導入されれば、"Cypress FX2LP No EEPROM Device"という見慣れたUSBデバイスが、デバイスマネージャーで見つかるようになる。


動作確認だ。
(開発キットのルート)\Windows Applications\Application Source files\c_sharp\controlcenter\bin\Releaseの"CyControl.exe"を起動する。
昔からあったEZ-USB Control Centerの縮小版だ。
すでにEnumerateされている"Cypress FX2LP No EEPROM Device"が表示されているはずだ。
"Program" -> "FX2" -> "RAM"を選び、ファイルダイアログから(開発キットのルート)\Firmware\Bulksrcの下の"bulksrc.hex"を選択する。
すると先ほどのUSBデバイスが"Cypress FX2LP Sample Device"に化けるはずだ。
これがEZ-USB独特のRe-enumerateと呼ばれるもので、FWをPC経由で更新して、別のデバイスとしてHot Plugさせることができるのだ。
右側のペインの"Data Transfer"を選択し、左側のペインのツリーから"Cypress FX2LP Sample Device" -> "Configuration" -> "Interface 0" -> "Alternate Setting 0" -> "Bulk out endpoint (0x02)"を選んで、"Transfer Data-OUT"を押すと、Endpoint 0x02にバルク転送で512byteの0x00が転送される。
うまく動作していれば、"BULK OUT transfer completed"が表示される。

PIC32でUSB HID

再びPIC32、目標のUSB HIDだ。

まず例題にあるサンプルにある"hid_basic"を試してみる。

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

  • MPLAB X IDEを起動
  • "File" -> "Open Project..."を選択
  • インストールパス(デフォルトでは、C:\microchip\hamony\v1_11")の下の"app\usb\device\hid_basic\firmware"を開き、プロジェクトフォルダーの"hid_basic.X"を開く

サンプルプロジェクトの設定の変更

  • "Projects"ペインで、"hid_basic"プロジェクトを右クリックして、"Set as Main Project"を選択
  • "Projects"ペインで、"hid_basic"プロジェクトを右クリックして、"Set Configuration" -> "pic32mx_usb_sk3_int_dyn"を選択

これでプロジェクトのデバイスやMHCのBSP情報などが更新される、判れば簡単簡単(これまた1日を要した・・・orz)

MPLAB Harmony Configuratorの設定

  • "Tools" -> "Embedded" -> "MPLAB Harmony Configurator"を選択
  • "Options" -> "BSP Configuration" -> "Use BSP?"をチェック
  • 下に"Select BSP To Use For PIC32MX470F512L"が出るので、サブツリーを開いて、"PIC32MX USB Starter Kit 3"にチェックが入っていることを確認
  • 上のセーブボタンを押す
  • 上の"Generate Code"ボタンを押す

ビルド

"Production" -> "Build Main Project"を選択

実機に焼く

  • PIC32 Starter Kit III(SK3)をPCにつなぐ
  • "Run Main Project"ボタンを押す
  • フラッシャーの選択画面が出るので、"Microchip Starter Kits" -> "Starter Kits(PKOB)"を選択する

PIC32をUSB HIDとして接続させる

実はここまでの作業では、PIC32に接続しているのではなく、ボードの裏側にフラッシュ、デバッグ用に搭載されているPIC24に接続している。
上記の作業でPIC32のFWが更新され、USB HIDとして動作するようになっているので、接続を変更する。

  • PIC32 SK3をPCから外す
  • PIC32 SK3からUSB mini Bケーブルを外して、代わりにUSB micro Bケーブルをつける、コネクターは基板裏面にある

初めに基板のPKOBのLEDが点灯し、しばらく経つとPIC32の電源のLEDとLED3が点灯、PCのデバイス認識が終わるとLED2も点灯するはずだ。
PCのデバイスマネージャーで見てみるとVIDが0x04D8、PIDが0x003Fのデバイスが認識されているはずだ。
これがUSB HIDとして認識されたPIC32 SK3だ。

テストソフトの起動

C:\microchip\hamony\v1_11\app\usb\device\hid_basic\binに"GenericHIDSimpleDemo.exe"なるexeファイルがあるので、起動する。
"Connect"ボタンを押すと、PIC32 SK3と接続する。
"Toggle LED"ボタンを押すとLED1とLED2が交互に点く。
SW1を押しながら"Get Pushbutton State"を押すと、その横のラベルが"State: Pressed"となる。


この動作の実装はapp.cに書かれているので、こいつを最初はいじくり倒すのがよいだろう。

PIC32でLチカ

引き続きPIC32。
早速ウゴウゴルーガ
まずは定番のLチカだ。

プロジェクトを作成

  • MPLAB X IDEを起動
  • "File" -> "New Project..."を選択
  • "Categories"は"Microchip Embedded"、"Project"は"32-bit MPLAB Harmony Project"を選択して"Next"を押す
  • "Harmony Path"にインストールパス(デフォルトでは、C:\microchip\hamony\v1_11")を選択
  • "Project Location"はデフォルトでも良いが、ここには例題プロジェクトも入っているので、いやな人は適当なフォルダーを選択
  • "Project Name"はなんでもよい、今回は"Blink"
  • "Target Device"で、PIC32 Starter Kit III (SK3)で使用されているPIC32MX470F512Lを選択
  • "Finish"を押す

MPLAB Harmony Configuratorの設定

プロジェクトを作成するとMPLAB Harmony Configuratorが開く。
後で開きたい場合には、"Tools" -> "Embedded" -> "MPLAB Harmony Configurator"を選ぶ。

  • "Options" -> "BSP Configuration" -> "Use BSP?"をチェック
  • 下に"Select BSP To Use For PIC32MX470F512l"が出るので、サブツリーを開いて、"PIC32MX USB Starter Kit 3"にチェックが入っていることを確認
  • 上のセーブボタンを押す
  • 上の"Generate Code"ボタンを押す

これでボード特有の設定や、API、変数が定義される、判れば簡単簡単(1日を要した・・・orz)

Lチカを実装

  • MPLAB X IDEの"Projects"ペインから"Source Files" -> "app" -> "app.c"を開く
  • "APP_Initialize"に以下のコードを追加
BSP_Initialize();
  • "APP_Tasks"の "case APP_STATE_INIT:"を以下のように変更
        case APP_STATE_INIT:
        {
           /*
            bool appInitialized = true;
       
        
            if (appInitialized)
            {
            
                appData.state = APP_STATE_SERVICE_TASKS;
            }
            */
            if (BSP_SwitchStateGet( BSP_SWITCH_1 ) == BSP_SWITCH_STATE_PRESSED)
                BSP_LEDToggle( BSP_LED_1 );
            break;
        }
  • 変更を保存

ビルド

"Production" -> "Build Main Project"を選択

実機に焼く

  • PIC32 SK3をPCにつなぐ
  • "Run Main Project"ボタンを押す
  • フラッシャーの選択画面が出るので、"Microchip Starter Kits" -> "Starter Kits(PKOB)"を選択する