1. 概要

Blackfin BlueBootとは、ターゲット用ブート・ローダ(Blackfin Boot Loader)と、ホスト用アプリケーション(Blackfin BlueBoot Tools)で構成されたブート・システムの総称です。

通常、Blackfinに接続されたフラッシュ・ロムの書き換えを行なう場合、Analog Devices社製アプリケーションVisualDSP++を用いる必要があります。
しかし、VisualDSP++はホビー・ユーザにとって、高価なアプリケーションです。
BlueBootは、VisualDSP++を購入するに至らないようなホビー・ユーザにも、手軽にBlackfinを楽しめるように考えられています。

以下に特徴を示します。

Blackfinは、ブート方法を複数のブート・モードから選択する事ができます。
ブート・イメージは、通常、LDR形式が用いられ、Blackfinに搭載された内蔵ブート・ローダは、LDR形式を解釈してブートを実行します。
Blackfinの場合、UARTポートからブート・イメージを流し込んでブートできる他、SPIバスに接続したフラッシュROMからブートする事ができます。
組み込みシステムとして自律稼働する事を考えた場合、外付けSPIフラッシュROMにイメージを書き込むのが一般的でしょう。

2. 想定されている対象システム

以下に想定されている対象システムを示します。
基本的に何らかのCPUとFlashが搭載されたBoardが存在すれば、どんなシステムにも適用可能です。

    Board
    +--------------------------+
    |    CPU                   |
    |  +-----+        Flash    |
    |  |     |      +-------+  |
    |  |     |      |       |  |
    |  +-----+      |       |  |
    |               +-------+  |
    |                          |
    +--------------------------+
    

BlueBootは、簡単な手順で新しいプロセッサやフラッシュやボードに対応できるように設計されています。
新しいターゲットに対するポーティングを提供する場合、CPU、Flash、Boardに対する実装を追加します。
これらの3つの要素を組み合わせて新しいターゲット用のブート・イメージを生成します。
ちなみに、初期化はCPU、Flash、Boardの順序で実行されます。
以下に3つの概念的な説明を加えます。

2-1. CPU

CPUとは、ターゲット・システム上に搭載されたプロセッサを指します。
CPUには、初期化やUART送受信のインターフェースが提供されることを前提としています。

2-2. Flash

Flashとは、ターゲット・システム上に搭載されたフラッシュROMを指します。
Flashには、セクタ消去やページ書き込みや読み込みなどのインターフェースが提供されることを前提としています。

2-3. Board

Boardとは、恐らく何らかのCPUと何らかのFlash持つシステムですが、直接的に関係はしません。
CPUとFlash以外に何か初期化が必要な処理があれば記述します。

例えば、表示器を持つBoardの場合、何らかの表示を提供する事でユーザは安心するでしょう。
その他、ユーザからの入力を待って、アプリケーションを起動するなどの処理に使うこともできます。

3. ターゲット用ブート・ローダ

ターゲット用ブート・ローダとは、ターゲット上で動作する組み込みシステム用ブート・ローダ・プログラムを指します。
ターゲットに備えられたUARTを用い、ホスト用アプリケーションと通信する事ができるように設計されています。
ターゲット用ブート・ローダには、フラッシュ・ロムの書き込み機能が備えられています。
ホスト用フラッシュ・ライタと組み合わせて、ターゲットのフラッシュ・ロムを書き換える事ができます。

3-1. ターゲット用ブート・ローダのコマンド

BlueBootのほとんどの機能はターゲット側のコマンドによるものです。
BlueBootのホスト用フラッシュ書き込みアプリケーションは、ターゲットのコマンドを使って書き込み機能を実現しています。
このようにデザインする事で、単体の機能検証、他のツールへの発展、機能拡張を容易にする事ができます。
コマンドによる対話形式ですので、一般的に流通しているシリアル・コンソール・アプリケーションをそのまま使用する事もできます。

4. ホスト用アプリケーション

ホスト用アプリケーションとは、ターゲット・システムに搭載されたフラッシュ・ロムを書き換えることのできるアプリケーションです。
ターゲット用ブート・ローダとUARTを経由して通信し、ホスト上のバイナリをターゲットに転送します。

ボードを新規に設計した場合、Blackfinに接続されたフラッシュ・ロムには、当然ながら何のイメージも書き込まれていません。
また、当然ながらBlackfinに内蔵されたブート・ローダは、フラッシュ・ロムの書き込み機能を提供していません。

ここでBlueBootがフラッシュ・ロムを書き換える手順について示します。

4-1. 第1段階:ターゲットをUARTブート・モードに設定して起動する。

第1ステージ・ブート・ローダを流し込むために、ターゲットをUARTブート・モードに設定して起動します。

4-2. 第2段階:書き込みに使用する第1ステージ・ブート・ローダをUART経由で転送する。

第1ステージ・ブート・ローダとは、ボード上に存在するCPU、Flash、Boardのその他のコンポーネントを操作する事のできるブート・ローダです。
第1ステージ・ブート・ローダは、フラッシュ・ロムに書き込まず、UARTから流し込んでそのまま実行させます。

フラッシュ・ロムの書き換え機能は、この第1ステージ・ブート・ローダが持ちます。
ホスト側からターゲット側にUART経由で第1ステージ・ブート・ローダを転送する事で、ボード上のBlackfinは自動的に第1ステージ・ブート・ローダを実行します。

4-3. 第3段階:ブート・ローダのブートを待つ。

UART経由で流し込んだ第1ステージ・ブート・ローダのブートを待ちます。
ターゲットに搭載されたフラッシュ・ロムなどに依存しますが、通常は数秒もあればブートが完了します。

4-4. 第4段階:流し込んだブート・イメージと対話しながら、SPIフラッシュROMへの書き込みを実行する。

第1ステージ・ブート・ローダの実行が開始された時点で、各種フラッシュ・ロムコマンドを実行できるようになります。
ホスト側のフラッシュ・ロム書き換えアプリケーションbluebootは、ユーザから指定されたアプリケーション・バイナリから必要な消去セクタ数、書き込みページ数を自動的に算出し、第1ステージ・ブート・ローダと対話してアプリケーション・バイナリをターゲット上のフラッシュ・ロムに書き込みます。

BlueBoot Toolsは、書き込みと同時に読み込みも実行し、比較検証まで実行します。

5. ブート・ローダとアプリケーションを統合する

BlueBootに付属しているターゲット用ブート・ローダは、ターゲットに書き込み機能を提供するものです。
先に示したように、通常はターゲットをUARTブート・モードにして第1ステージ・ブート・ローダを流し込み使用します。

このブート・ローダの機能を流用して、アップデートなどの機能に仕立てる事もできます。
フラッシュ・ロムに書き込むアプリケーションに、あらかじめBlueBootの第1ステージ・ブート・ローダの機能を統合しておきます。

こうする事で、ターゲットのブート・モードを切り替える事なく、フラッシュ・ロムの更新が可能になります。

6. ライセンス

ライセンスは、MITライセンスです。

    /*
     * ===============================================================
     * Blackfin BlueBoot - The Flash Writer and The Boot Loader
     * ===============================================================
     * Copyright (c) 2012-2014 Shinichiro Nakamura
     *
     * Permission is hereby granted, free of charge, to any person
     * obtaining a copy of this software and associated documentation
     * files (the "Software"), to deal in the Software without
     * restriction, including without limitation the rights to use,
     * copy, modify, merge, publish, distribute, sublicense, and/or
     * sell copies of the Software, and to permit persons to whom the
     * Software is furnished to do so, subject to the following
     * conditions:
     *
     * The above copyright notice and this permission notice shall be
     * included in all copies or substantial portions of the Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
     * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
     * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     * OTHER DEALINGS IN THE SOFTWARE.
     * ===============================================================
     */
    

7. よくある質問

書き込みステップが2段階になっているのは何故ですか?

BlueBootで言うブート・ローダとは、フラッシュ書き込み機能を持ったブート・ローダです。
ホスト上のBlueBoot Toolは、ターゲット上のブート・ローダと通信してフラッシュ書き込みを実現しています。

BlueBootは、第1段階でターゲットに適応したブート・ローダをUARTブート・モードで流し込みます。
第2段階でターゲット上で動作しているブート・ローダと対話しながら、フラッシュ書き込みを行います。

システムのアップデート機能に流用する事はできますか?

はい。
お客様のアプリケーションにBlueBootのブート・ローダの機能を予め組み込んでおくことで実現できます。

通常、外付けフラッシュ・ロムからのブートが選択されていると思います。
この場合、UART経由でのブート・ローダ流し込みを省略し、そのままフラッシュ書き込み機能を実行する事ができます。

ブート・ローダの転送時にAuto Baudが失敗と出ます。

ターゲットがUARTブート・モードに設定されているか確認して下さい。
UARTブート・モードに設定されているにも関わらず失敗する場合、ターゲットをリセットしてやり直してみて下さい。

フラッシュ・ロムの書き込み時にフラッシュ情報取得に失敗します。

転送したブート・ローダが使用しているシリアル・ポート・ボーレートとBlueBoot Toolで設定しているシリアル・ポート・ボーレートが一致しているかどうか確認して下さい。
ブート・ローダを転送した時点で、ターゲット上でブート・ローダが動作しているはずですから、一般的なシリアル端末ソフトウェアを使って動作を確認するのも一つの手です。
ちなみに、シリアル・ポート・ボーレートが異なる場合でもブート・ローダの転送が可能なのは、UARTブート・モードで自動的にボーレートを検出するメカニズムを持っているためです。

フラッシュ・ロムへの書き込みが期待通りに行われているか確認できますか?

BlueBoot Toolを使って書き込みを行った場合、書き込みの後で読み込みを行って比較検証を行っています。
基本的にBlueBoot Toolがエラーを返さなければ、フラッシュ・ロムへの書き込みが期待通りに完了していると考えて問題ありません。

必要があれば、ブート・ローダのflash readコマンドを使ってデータを読み出す事もできます。
逐次コマンドを使って期待した結果であるかどうかを確認する事もできます。

フラッシュ・ロムへの書き込みプロトコルがバイナリ・ベースでないのは何故ですか?遅くなる気がするのですが?

BlueBootのブート・ローダは、汎用のシリアル端末ソフトウェアでも使用できるように設計されています。
ブート・ローダがフラッシュ・ロムに対するページ・リードやページ・ライトをテキスト・ベースでプリミティブに機能を提供する事で、設計をシンプルにすると同時に検証を容易なものにしています。

仮にバイナリ・ベースのプロトコルを採用した場合、フラッシュ・ロムに対するページ・リードやページ・ライトを汎用のシリアル端末ソフトウェアで確認する事は困難でしょう。
このような背景から、BlueBootではテキスト・ベースのプロトコルが採用されています。

新しくボードを作ったのですが、このツールを使うことはできますか?

はい。

target/common/includeにあるcpu.hとflash.hとboard.hに対する実装を提供して下さい。
これら3つの実装を提供する事で新しいターゲットに対応したブート・ローダを実現できます。
ホスト側のBlueBoot Toolは、ターゲットから情報を取得して動作するため、そのまま動作します。

GUIに自分のボードの写真や設定を追加する事はできますか?

はい。

GUIアプリケーションのインストール先にconfigというディレクトリがあります。
そのディレクトリにあるconfig_list.txtにボード名を記載して下さい。

加えて、ボード名と同名のディレクトリを追加し、その中にボード名.txtというファイルを作ります。
内部に以下のパラメータに対する設定を与えて下さい。

パラメータ名とパラメータの間は=記号で結びます。
スペースは挿入しないで下さい。

    パラメータ    記載内容
    ----------------------------------------------------------------
    serial.baudrate       使用するボーレート
    serial.flowcontrol    フロー制御するかどうか(0=しない、1=する)
    serial.delay          1バイト送信する度に挿入される待ち時間
    board.name            ボード名称
    board.vendor          ボード供給元
    board.thumbnail       サムネイルのファイル名
    board.url             ボード情報元URL
    cpu.name              CPU名
    flash.name            フラッシュ・ロムの名称
    flash.page_bytes      フラッシュ・ロムのページ・バイト数
    flash.page_count      フラッシュ・ロムのページ数
    flash.sector_bytes    フラッシュ・ロムのセクタ・バイト数
    flash.sector_count    フラッシュ・ロムのセクタ数
    file.bootloader       LDRブート・ローダのファイル名
    file.application      LDRアプリケーションのファイル名
    ----------------------------------------------------------------
    
    記述例
    ----------------------------------------------------------------
    #
    # BlueTank
    # http://shinta-main-jp.blogspot.jp/
    #

    #
    # serial
    #
    serial.baudrate=57600
    serial.flowcontrol=0
    serial.delay=1000

    #
    # board
    #
    board.name=BlueTank
    board.vendor=CuBeatSystems
    board.thumbnail=config/bluetank/bluetank.bmp
    board.url=config/bluetank/bluetank.html

    #
    # cpu
    #
    cpu.name=BF592

    #
    # flash
    #
    flash.name=M25P16
    flash.page_bytes=256
    flash.page_count=8192
    flash.sector_bytes=65536
    flash.sector_count=32

    #
    # file
    #
    file.bootloader=config/bluetank/bluetank.ldr
    file.application=config/bluetank/bluetank.ldr
    ----------------------------------------------------------------
    

Blackfin以外にも使えますか?

同じようなメカニズムを持つプロセッサで使用できるかもしれませんが、Blackfin BlueBootとしては感知しません。

シリアル・ポートの項目にあるフロー・コントロールとは何ですか?

ターゲット側のシリアル・ポートが受信可能状態を示す配線を行っている場合に使用可能なのが、ここで言うフロー・コントロールです。
Blackfinの場合、プロセッサ内蔵のブート・ローダを使用する場合にフロー制御可能になるように設計する事が推奨されています。

ターゲットによっては、ハードウェア側でフロー・コントロールに対応していない事もあります。
その場合は、フロー・コントロールを使用しない設定にして下さい。

シリアル・ポートの項目にあるディレイとは何ですか?

シリアル・ポートで1バイト送信する度に挿入される待ち時間を指します。
ターゲット側がフロー・コントロールに対応していない場合、ディレイを挿入することで適切に動作させる事ができます。

8. エラーメッセージ

8-1. ブート・ローダ書き込み時のエラー

Serial open error

シリアル・ポートが開けなかった場合に発生します。
使用可能なシリアル・ポートが選択されているかどうかを確認して下さい。

Serial write error

シリアル・ポートへの書き込みに失敗した場合に発生します。
通常、このエラーが発生する事はありません。

Auto baud failed

Blackfinプロセッサによる「ボーレート自動検出」が失敗した場合に発生します。
ターゲットがUARTブート・モードになっているかどうかを確認して下さい。

File open error

指定されたブート・ローダ・ファイルが開けなかった場合に発生します。
指定されたブート・ローダ・ファイルが存在するかどうかを確認して下さい。

File seek error

指定されたブート・ローダ・ファイルのファイル・シークに失敗した場合に発生します。
通常、このエラーが発生する事はありません。

User canceled

ユーザによる処理中止要求があった場合に発生します。

8-2. アプリケーション書き込み時のエラー

Serial open error

シリアル・ポートが開けなかった場合に発生します。
使用可能なシリアル・ポートが選択されているかどうかを確認して下さい。

Serial write error

シリアル・ポートへの書き込みに失敗した場合に発生します。
通常、このエラーが発生する事はありません。

File open error

指定されたアプリケーション・ファイルが開けなかった場合に発生します。
指定されたアプリケーション・ファイルが存在するかどうかを確認して下さい。

File seek error

指定されたアプリケーション・ファイルのファイル・シークに失敗した場合に発生します。
通常、このエラーが発生する事はありません。

Flash information response error

ターゲット側で実行されているブート・ローダにフラッシュ・ロム情報の取得を要求したにも関わらず、応答が得られなかった場合に発生します。
実行されているブート・ローダが内部で使用しているボーレートと、ホスト側アプリケーションで指定しているボーレートが一致している事を確認して下さい。

Flash information status error

ターゲット側から取得したフラッシュ・ロム情報が期待した内容と異なっていた場合に発生します。
ターゲット側で実行されているブート・ローダのバージョンと、ホスト側で実行されているアプリケーションのバージョンが著しく異なる場合に発生します。
ブート・ローダとアプリケーションのバージョンを確認し、必要に応じてどちらか、もしくは両方のバージョンを更新して下さい。

Flash erase response error

ターゲット側で実行されているブート・ローダにフラッシュ・ロム・セクタ消去の実行を要求したにも関わらず、応答が得られなかった場合に発生します。
ターゲット側でデータを取りこぼしている恐れがある場合、ホスト側アプリケーションで指定されているディレイ値を増やして再度実行して下さい。

Flash erase status error

フラッシュ・ロム・セクタ消去を実行したにも関わらず、期待した結果が得られなかった場合に発生します。
通常、このエラーが発生する事はありません。

Flash write response error

フラッシュ・ロム・ページ書き込みを要求したにも関わらず、応答が得られなかった場合に発生します。
ターゲット側でデータを取りこぼしている恐れがある場合、ホスト側アプリケーションで指定されているディレイ値を増やして再度実行して下さい。

Flash write status error

フラッシュ・ロム・ページ書き込みを実行した結果、期待した結果が得られなかった場合に発生します。
ターゲット側でデータを取りこぼしている恐れがある場合、ホスト側アプリケーションで指定されているディレイ値を増やして再度実行して下さい。

Flash compare response error

フラッシュ・ロム・ページ読み込みを要求したにも関わらず、応答が得られなかった場合に発生します。
ターゲット側でデータを取りこぼしている恐れがある場合、ホスト側アプリケーションで指定されているディレイ値を増やして再度実行して下さい。

Flash compare status error

フラッシュ・ロム・ページ読み込みを実行し、書き込んだデータと比較した結果、データが一致しなかった場合に発生します。
通常、このエラーが発生する事はありません。

Flash write user cancled

ユーザによる処理中止要求があった場合に発生します。

9. LDR情報表示機能でサポートされている形式

現在、以下の形式がサポートされています。

上記形式以外の場合、GUI画面上にLDR情報は表示されません。
上記に含まれない形式であっても、フラッシュ・ロムへの書き込みを実行する事は可能です。

10. 謝辞

このプロジェクトは堀江誠一さんの指南により実現する事ができたものです。
氏の深い洞察力と指導力に感謝致します。

このプロジェクトは金子システム株式会社のBlackfin搭載DSP基板があったので実現する事ができました。
同社の優れた製品とサービスに感謝致します。

11. 改訂履歴

12. ダウンロード


戻る