PSoC 4200 Prototyping Kit (23)

STmicroelectronics 社の STM32 シリーズでは、リセット時の BOOT0 / BOOT1 という 2 本の信号線の状態で

  • 内蔵フラッシュから起動するか
  • 内蔵システム ROM から起動するか
  • 内蔵 SRAM から起動するか

を選べるようになっています。
内蔵システム ROM にはブートローダが書き込まれており、USART / I2C / CAN / SPI / USB などの内蔵モジュールを介してブートすることが可能です。
どのデバイスからブートするかは、特定のピンの状態を読むのではなく、各デバイスにあらかじめ決められている有効な開始コードが送られてくるかどうかを順次ポーリングして決定しています。
NXP 社の LPC シリーズでは、リセット後は必ずシステム ROM から実行を開始し、特定のピンの状態を見てブートローダを強制起動するか、あるいは。有効なユーザプログラムが書き込まれていないのをチェックサム不一致により検出してブートローダを起動します。
「公式」フラッシュ書き込みアプリケーションの「FlashMagic」では、このリセット・ピンとブート・ピンを操作して自動的にターゲット・マイコンブートローダ・モードに設定する機能が付いています。
オープン・ソースのフラッシュ書き込みアプリケーションである「lpc21isp」や「lpcsp」にもこの「オートリセット機能」が組み込まれています。
これらのアプリケーションと同様のオートリセット機能を PSoC UART Bootloader Host に組み込むのが今回の「改造」の目的です。
オートリセット機能を実現するためには次の 4 つの作業が必要です。

  • CY7C65211 を「6 ピン UART モード」に設定
  • リセット・ピン、ブート・ピンへの配線
  • CDC ドライバを Cypress 製から Microsoft 製へ置き換える
  • UART Bootloade Host の改造

まず、デフォルトでは PSoC 4200 Prototyping Kit の USB-シリアル変換チップである CY7C65211 は TXD / RXD のみ有効な「2 ピン UART モード」になっているので、リセット・ピン / ブート・ピンの制御に使う DTR / RTS も有効になる「6 ピン UART モード」に設定する必要があります。
これには、「USB-Serial Software Development Kit (SDK)」に含まれる「USB-Serial Configuration Utility」を使います。
これはマニュアル "PSoC® 4 Prototyping Kit Guide" の第六章に説明があります。
ハードウェアについては下の図のように接続します。 部品面側から見た図 (Top View) になっています。

「本体」部分については全てのピンを描くと図が大きくなりすぎるので一部省略した形になっています。
ダイオードはシリコン・ダイオードあるいはショットキ・ダイオードを使用します。
ジャンパー・ポストとショート・プラグの組み合わせ、あるいは DIP スイッチなどで DTR / RTS の接続を切れるようにしておくと、「オートリセット」非対応のオリジナルの Bootloader Host を使っての書き込みも可能になります。 そうでないと、改造版の Bootloader Host がうまく動作しない場合に救済することができなくなります。
また、DTR / RTS を自由に設定できないターミナル・ソフトを使用しなければならない場合に、リセットがかかりっぱなしでユーザ・プログラムが起動しない状態になるのを回避するのにも役立ちます。
CDC ドライバの入れ替えに関しては、

Binding a USB-Serial Device to a Microsoft® CDC Driver — KBA91366

を参照してください。
「UART Bootloade Host の改造」に関しては、すでに独立した 1 個のアプリケーションである UART Bootloader Host GUI アプリケーションのソースファイルに数行追加してビルドするのが最も簡単です。
「AN68272.zip」を展開して得られた

AN68272\UART Bootloade Host GUI\UARTBootloaderHost_Source_Code\UARTBootloaderHost\

フォルダにある「Form1.cs」ファイルの OpenConnection() 関数の 304 行と 305 行の間に下のような 7 行を挿入します。
(2015 年 4 月 27 日追記: serialPort.DiscardInBuffer() メソッド呼び出しを追加して、リセット以前にユーザ・アプリケーションがシリアル出力したデータを受信バッファから除去し、エラーにならないようにしました。)

280:        public int OpenConnection()
281:        {
282:            int status = (int)ReturnCodes.CYRET_SUCCESS;
283:
284:            if (ConnectionStatus == false)
285:            {
286:                try
287:                {
288:                    serialPort.Open();
289:                    ConnectionStatus = true;
290:                }
291:                catch (Exception exc)
292:                {
293:                    ConnectionStatus = false;
294:                    status = (int)ReturnCodes.CYRET_ERR_COMM_MASK;
295:                    SetText(textBox_StatusLog, " Error in opening serial port: " + exc.Message + "\r\n");
296:
297:                    try
298:                    {
299:                        serialPort.Close();
300:                    }
301:                    catch
302:                    {
303:                    }
304:                }
                    serialPort.DtrEnable = true;
                    serialPort.RtsEnable = true;
                    Thread.Sleep(200);
                    serialPort.DtrEnable = false; 
                    Thread.Sleep(200);
                    serialPort.RtsEnable = false;
                    serialPort.DiscardInBuffer();
305:            }
306:            return status;
307:        }

ここで、左端の番号は説明のために追加した行番号であり、ソースファイルの一部ではありません。
行番号のない 6 行分を 304 行と 305 行の間に挿入します。
この変更を施して、Visual C# 2010 Express でビルドします。