EE ノート a EE-240 アナログ・デバイセズの DSP、プロセッサ、開発ツール用テクニカル・ノート http://www.analog.com/jp/ee-notes、http://www.analog.com/jp/processorsにはさま ざまな情報を掲載しています。 ADSP-BF533 Blackfin®のブート・プロセス 著者: Hiren Desai Rev 4 –2008 年 9 月 29 日 はじめに この EE ノートでは、ADSP-BF531、ADSP-BF532、ADSP-BF533 Blackfin®プロセッサのブート・プロセスについて説 明します。シリコン・レビジョン・レベル間の相違を示してあります。 この EE ノートでは次について説明します。 ブート・モード ローダ・ファイルのヘッダー情報 初期化コード(Init コード) マルチアプリケーション(multi-DXE)管理 ブート・プロセス ブートとは、外部メモリ・デバイス(または外部ホスト)に格納されているアプリケーション・コード/データを Blackfinプロセッサの種々の内部メモリおよび外部メモリにロードするプロセスを意味します。このプロセスは、 Blackfinメモリのアドレス 0xEF00 0000~0xEF00 03FFに格納されている内蔵ブートROMにより制御されます。 図 1に、ソース・コードから最終ターゲット・スタンドアロン・システムまでの操作シーケンスを示します。 .ASM, .C, .CPP Source Files .DOJ(s) Assembler and/or Compiler .DXE(s) Linker Loader .LDR Target System ADSP-BF53x Processor Booting Upon RESET External Memory 図1.ADSP-BF531/BF532/BF533 スタンドアロン・システム ©2004-2008 Analog Devices, Inc All rights Reserved. アナログ・デバイセズはお客様の製品設計、製品の使用、製品の応用、またはアナログ・デバイセズの協力に起因するいかなる種類の特許侵害に対しても責任を持 ちません。すべての商標およびロゴ はその所有者に帰属します。アナログ・デバイセズのアプリケーションおよび開発ツール技術者が作成する情報の質と信頼性に ついては厳密を期していますが、アナログ・デバイセズのすべての EE ノートの内容の技術的な品質に関しては何ら保証するものではありません。 Notes. a ブート・モード(シリコン・レビジョン0.3)* Blackfinプロセッサは、EBIUの非同期バンク 0 を経由したフラッシュ/PROMまたはSPIインターフェースを介したSPI デバイス(メモリまたはホスト)からブートすることができます。表 1に、RESET信号の非アサート時のBMODE[1:0] ピンの状態により選択されるADSP-BF531/BF532/BF533 プロセッサのブート・モードを示します。 BMODE[1:0] Description (See also Specific Blackfin Boot Modes) 00 Executes from external 16-bit memory connected to ASYNC Bank0 (bypass Boot ROM) 01 Boots from 8/16-bit flash/PROM 10 Boots from a SPI host in SPI Slave mode 11 Boots from a 8/16/24-bit addressable SPI memory in SPI Master mode with support for Atmel AT45DB041B, AT45DB081B, and AT45DB161B DataFlash® devices 表1.Blackfin ADSP-BF531/BF532/BF533 のブート・モード *シリコンの旧レビジョンでサポートされていたブート・モードについては、アペンディックス:ブート・モード対シリコン・レビジョンを参照 してください。 図 1に示すように、ローダ・ユーティリティ(elfloader.exe)が入力実行可能ファイル(.DXE)を解釈して、先頭に ヘッダーが付いた複数のブロックから構成されるローダ・ファイル(.LDR)*を生成します。このローダ・ファイルは、 外部メモリ/デバイスに書き込まれます。このヘッダーは、ブート時に内蔵ブートROMにより読み出され、解釈され ます。 *スイッチ・ローダ・ファイルについては「VisualDSP++® Loader Manual for 16-Bit Processors [1]」を参照してください。 Loader File is programmed/burned into the External Memory/Device ADSP-BF531/BF532/BF533 Processor 10-Byte Header for Block 1 Block 1 Flash/PROM or SPI 10-Byte Header for Block 1 L1 Memory 10-Byte Header for Block 2 Block 2 Block 1 Block 1 Block 3 10-Byte Header for Block 2 Block 2 10-Byte Header for Block 3 10-Byte Header for Block 3 App. Code/ Data Block 3 Block 3 ........... 10-Byte Header for Block n 10-Byte Header for Block n 0xEF00 0000 Block n On-Chip Boot ROM Block n SDRAM …………….. Block 2 Loader File 図2. ADSP-BF531/BF532/BF533 のブート・プロセス スクラッチパッド・メモリ(0xFFB0 0000~0xFFB0 0FFF)へのブートはサポートされていません。スクラ ッチパッド・メモリへのブートを行うと、プロセッサは内蔵ブート ROM 内でハングアップします。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 2/28 a ヘッダー情報 図 3 に示すように、ローダ・ファイル内の各 10 バイト・ヘッダーは、4 バイトADDRESSフィールド、4 バイト COUNTフィールド、2 バイトFLAGフィールドから構成されています。 10-Byte Header for Block 1 Block 1 32-Bit ADDRESS 10-Byte Header for Block 2 Block 2 32-Bit COUNT 10-Byte Header for Block 3 16-Bit FLAG Block 3 …………….. 10-Byte Header for Block n 図3.10 バイト・ヘッダーの内容 ローダ・ファイル内で各ブロックの先頭に付く 10 バイト・ヘッダーには、ブート・プロセス時に内蔵ブート ROM により使用される次の情報が含まれています。 ADDRESS (4 バイト)―メモリ内でブロックがブートされるターゲット・アドレス COUNT (4 バイト)―ブロック内のバイト数 FLAG (2 バイト)―ブロック・タイプとコントロール・コマンド: 15 14 13 12 FINAL 0 - Non-Last Block 1 - Last Block 11 10 9 8 7 6 5 4 3 2 1 0 ZEROFILL 0 - Non-Zero Fill Block 1 - Zero-Fill Block PFLAG 3:0 PF number for SPI slave booting RESVECT 0 - ADSP-BF531/BF532 1 - ADSP-BF533 INIT 0 - Non-Init Block 1 - Init Block IGNORE 0 - Non-Ignore Block 1 - Ignore Block 図4.FLAG ワードの各コントロール・ビット ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 3/28 a FLAG ビットには次が含まれます。 ビット 0: ZEROFILL―ブロックがゼロを持つバッファであることを表示します。ZEROFILL ブロックに はペイロード・データはありません。これらは、メモリ内の ADDRESS から開始される COUNT バイトを ゼロにすることを内蔵ブート ROM に指示します。これにより、大きなゼロ・バッファを持つアプリケ ーションに対して圧縮したローダ・ファイルが生成されます。これは、ブート時に大きなバッファをゼ ロにすることが要求されることがある ANSI-C 準拠のプロジェクトにも非常に役立ちます。 ビット 1: RESVECT―ブート後のリセット・ベクタを表示します。すべての ADSP-BF531/BF532/BF533 派生品は同じブート ROM を使います。ADSP-BF531/BF532 ではこのビットに 0 を、ADSP-BF533 では 1 を、それぞれ設定します。ブートが完了すると、内蔵ブート ROM はこのビットを使って、ADSPBF533 ではアドレス 0xFFA0 0000 へ、ADSP-BF531/BF532 ではアドレス 0xFFA0 8000 へ、それぞれ ジャンプします。 ハードウェア・リセットの後、RESVECT ビットに応じてリセット・ベクタ(EVT1 レジスタ)に 0xFFA0 0000 または 0xFFA0 8000 が設定されます。SYSCR レジスタビット 4 (ソフトウェア・リ セット時にブートなし)がセットされ、かつソフトウェア・リセットが発行されると、プロセッサは EVT1 レジスタ内に設定されたアドレスに分岐します。このリセット・ベクタはランタイム時に別 のアドレスに再設定できるため、ソフトウェア・リセットの後にアプリケーションは 0xFFA0 0000 または 0xFFA0 8000 以外のアドレスへ分岐することができます。ランタイム時にリセット・ ベクタを変更する場合には、EVT1 レジスタ内のリセット・ベクタ・アドレスが有効な命令アドレ スであることを確認してください。このアドレスとしては、内部命令メモリ、SDRAM メモリ、非 同期メモリが可能です。EVT1 レジスタにはデフォルト値はありません。このレジスタの値は、リ セットが発行された後も保持されます。BMODE = 00 の場合、内蔵ブート ROM がバイパスされる ため、EVT1 レジスタを初期化した後にソフトウェア・リセットを発行する必要があります。 ビット 3: INIT―初期化ブロック(Init Block)は、実際のアプリケーション・コードがブートする前に実 行されるコード・ブロックです。内蔵ブートROMがInit Blockを検出すると、そのブロックを内部メモ リ内でブートさせ、そのブロックに対してCALLを実行します(Initコードの終わりにはRTSが必要)。Init コードを実行した後、一般にアプリケーション・コードで上書きされます。図 5を参照してください。 ビット 4: IGNORE―メモリ内でブートしないブロックを表示します。ブートROMに、ブート・ストリ ームのCOUNTバイトをスキップするように指示します。マスター・ブート・モードでは、ブートROM はソース・アドレス・ポインタを変更することだけが可能です。スレーブ・ブート・モードでは、ブー トROMはペイロード・データを廃棄する必要があります。現在のVisualDSP++®ツールは、グローバ ル・ヘッダーのIGNOREブロックのみをサポートしています(現在は 4 バイトのDXE Count、マルチアプ リケーション(multi-DXE)の管理のセクション参照)。 ビット 8:5: PFLAG―これらのビットは、SPIスレーブ・モード・ブート(BMODE = 10)に使用されます。 PFLAGは、BlackfinプロセッサからマスタSPIホストへのホスト・ウエイト(HWAIT)信号に使用されるPFx 番号を表示します。この値としては、ADSP-BF531/BF532/BF533 プロセッサに対して 1~15 (0x1~0xF) を使用することができます。このPFストローブの使い方の詳細については、マスタ・ホスト経由のSPI スレーブ・モード・ブート(BMODE = 10)のセクションを参照してください。 ビット 15: FINAL―このブロックの後でブート・プロセスが完了することを表示します。FINAL ブロッ クを処理した後、内蔵ブート ROM は EVT1 レジスタに格納されているリセット・ベクタ・アドレスへ ジャンプします。プロセッサはまだスーパーバイザ・モードにあるため、コード実行のために L1 メモ リにジャンプしたとき最下位の割り込み順位(IVG15)にあります。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 4/28 a ADSP-BF531/BF532/BF533 プロセッサは ADSP-BF535 プロセッサとは異なり、セカンド・ステージ・ローダ を必要としません。10 バイト・ヘッダーの FLAG フィールドは、セカンド・ステージ・ローダなしでシン グル・ステージ・ブート・シーケンスを実行するために必要なすべての情報を ADSP-BF531/BF532/BF533 プロセッサに提供します。 初期化コード(Initコード) Init コードは、実際のアプリケーションがブートされる前にコードの実行を可能にする機能です。このコードは、 SDRAM コントローラの初期化、または PLL 設定の変更、SPI ボー・レートの変更、高速なブート時間への EBIU ウ エイト状態の変更などの多くの目的に使用することができます。Init コードは、elfloader の–Init Init_Code.DXE コマンドライン・スイッチを使ってローダ・ファイル・ストリームの先頭に追加されます。ここで、 Init_Code.DXE はユーザ定義のカスタム Init コード実行可能形式です。 ADSP-BF531/BF532/BF533 Processor Flash/PROM or SPI Device Header for Init Block L1 Memory Init Block Init Block A Header for L1 Block L1 Block Header for SDRAM Block SDRAM Block App. Code/ Data ........ Header for Block n Block n 0xEF00 0000 On-Chip Boot ROM SDRAM ADSP-BF531/BF532/BF533 Processor Flash/PROM or SPI Device After Init Code Execution Header for Init Block L1 Init Block L1 Block A Init Block Header for L1 Block L1 Block Header for SDRAM Block SDRAM Block App. Code/ Data ........ Header for Block n 0xEF00 0000 Block n On-Chip Boot ROM SDRAM SDRAM Block 図5.Init コードの実行/ブート ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 5/28 a INIT ビットがセットされたブロックを内蔵ブート ROM が検出すると、まず Blackfin メモリでブートし、次にター ゲット・アドレスへ CALL を発行することによりそれを実行します。このため、RTS 命令を使って Init コードを終 了させて、プロセッサがブート・プロセスの残りを実行するために内蔵ブート ROM へ確実に戻るようにする必要が あります。 Initコードにより変更されるすべてのプロセッサ・レジスタを待避させ、Initコードのリターンの前にこれら のレジスタを回復させるのはユーザの責任で行う必要があります。少なくとも、すべてのInitコードで、 ASTATレジスタ、RETSレジスタ、すべてのRxとPxレジスタを待避させることが推奨されます。Blackfinプ ロセッサでは、スクラッチパッド・メモリに十分なスタック・スペースを確保しています(0xFFB0 0000~ 0xFFB0 0FFF)。Initコードでは、スタック・ポインタSPを使ってプッシュ命令とポップ命令を実行するこ とができます。リスト 1に、SDRAMコントローラのセットアップを行うInitコード・ファイルの例を示しま す。 #include <defBF532.h> .section program; /********************************************************************/ [--SP] = ASTAT; // Save registers onto Stack [--SP] = RETS; [--SP] = (R7:0); [--SP] = (P5:0); /********************************************************************/ /*******Init Code Section********************************************/ /*******SDRAM Setup************/ Setup_SDRAM: P0.L = lo(EBIU_SDRRC); P0.H = hi(EBIU_SDRRC); // SDRAM Refresh Rate Control Register R0 = 0x074A(Z); W[P0] = R0; SSYNC; P0.L = lo(EBIU_SDBCTL); P0.H = hi(EBIU_SDBCTL); R0 = 0x0001(Z); W[P0] = R0; SSYNC; // SDRAM Memory Bank Control Register P0.L = lo(EBIU_SDGCTL); P0.H = hi(EBIU_SDGCTL); // SDRAM Memory Global Control Register R0.H = 0x0091; R0.L = 0x998D; [P0] = R0; SSYNC; /********************************************************************/ (P5:0) = [SP++]; // Restore registers from Stack (R7:0) = [SP++]; RETS = [SP++]; ASTAT = [SP++]; /********************************************************************/ RTS; リスト 1. Init コードの例 一般に、Init コードはシングル・セクションで構成され、ブート・ストリーム内のシングル・ブロックで表されます。 このブロックではもちろん、INIT ビットがセットされています。それでも、Init ブロックは複数のセクションから 構成することもできます。その場合、複数のブロックがブート・ストリーム内で Init コードを表します。最後のブ ロックでのみ INIT ビットがセットされます。elfloader ユーティリティで、これらのブロックの最後が Init コードの エントリ・アドレスへ分岐することが保証されます。これが elfloader にとって厳し過ぎる場合は、最終ブロックの INIT ビットをクリアしたままにして、後でブロックを追加発行してください。この追加ブロックで INIT ビットは セットしますが、ペイロード・データは与えません(COUNT = 0)。内蔵ブート ROM に、指定したアドレスへの CALL 命令の実行を指示します。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 6/28 a Init コード.DXE ファイルはそれらの固有 VisualDSP++プロジェクトで構築されますが、標準プロジェクトとは異な ります。Init コードは、呼出し可能なサブ関数のみを提供するため、アプリケーションというよりはライブラリに似 ています。Init コードは常に、通常のアプリケーション・コードの先頭になります。したがって、Init コードの構成 が 1 個かまたは複数のブロックであるかに無関係に、ブート ROM にブート・プロセスを終了させる FINAL ビッ ト・インジケータにより終了させられることはありません。 マルチアプリケーション(multi-DXE)の管理 プリブート初期化の他に、Initコード機能はブート管理にも使用することができます。elfloaderコマンドラインに複 数の実行可能形式(.DXEファイル)が指定されると、ローダ・ファイル(.LDR)は複数のアプリケーションを格納する ことができます。elfloaderは、複数のブート・ストリームを生成し、各実行可能形式が順次続き、InitコードDXEが 先頭にロードされます(図 6参照)。 1st Boot Stream 10-Byte Header for Count 4-Byte Count for Init Code DXE Init Code 10-Byte Header for Count 2nd Boot Stream 10-Byte Header for Block 1 st 4-Byte Count for 1 DXE Block 1 st 1 DXE Application 10-Byte Header for Block 2 Block 2 3rd Boot Stream 10-Byte Header for Count nd 4-Byte Count for 2 2 nd DXE DXE Application 10-Byte Header for Block 3 Block 3 ………………. 10-Byte Header for Count 4th Boot Stream rd 4-Byte Count for 3 DXE rd 3 DXE Application Etc.. ………………………. Loader File 図6.multi-DXE ローダ・ファイルの内容 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 7/28 a ADSP-BF531/BF532/BF533 ローダ・ファイル(.LDR)構造を使うと、外部メモリ内に格納されている複数の実行可能 形式(DXE アプリケーション)の境界を指定することができるため、特定の DXE アプリケーションでブートすること ができます。.LDR ファイル内で解析され配置された各.DXE ファイルの前には、IGNORE ブロックがあります。現 在、この IGNORE ブロックは 4 バイト・カウント値で構成されており、DXE アプリケーション内に含まれるバイト 数(ヘッダーも含む)を表しています。すなわち、次の DXE アプリケーションまでのオフセットです。将来、 IGNORE ブロックは 4 バイト・カウント値の他の情報も保持するために使われます。各 IGNORE ブロックの前は 10 バイト・ヘッダーであることに注意してください。 このDXEカウント情報を使うと、.LDRファイル内で全DXEアプリケーションに分岐することができるため、ブート 用に選択したDXEアプリケーションに到達することができます。リスト 2に、8 ビット・フラッシュ内の複数のDXE アプリケーションで分岐する方法を示すInitコードの例を示します。.LDRファイルに 1 つのInitコードDXEと 2 つの DXEアプリケーションが含まれるとすると、Initコードは.LDRファイル内でジャンプして、2 番目のDXEアプリケー ションでブートします。 #include <defbf533.h> .section program; [--SP] = ASTAT; // save registers onto Stack [--SP] = RETS; [--SP] = (r7:0); [--SP] = (p5:0); [--SP] = LC0; [--SP] = LT0; [--SP] = LB0; /******************************/ BOOT_DXE: R0.H = 0x2000; // R0 = start of ASYNC Bank 0 R0.L = 0x0000; P1 = 2; // Number of DXEs to jump over (CANNOT BE ZERO!!) // After first iteration, R0 will point to DXE1 // After second iteration, R0 will point to DXE2 LSETUP(ADD_DXE_COUNT_BEGIN, ADD_DXE_COUNT_END) LC0 = P1; ADD_DXE_COUNT_BEGIN: R1 = 0xA; // Skip over 10 bytes for the 1st 10-byte header R1 = R1 << 1; // Multiply by 2 since we are booting from a 16-bit // flash (compensate for zero padding) R0 = R0 + R1; P0 = R0; // P0 points to 4-Byte DXE COUNT R0 = W[P0++](Z); // R0 = xx | Bits[7:0] of DXE COUNT R1 = W[P0++](Z); // R1 = xx | Bits[15:8] of DXE COUNT R1 = R1 << 8; R2 = W[P0++](Z); // R2 = xx | Bits[23:16] of DXE COUNT R2 = R2 << 16; R3 = W[P0++](Z); // R3 = xx | Bits[31:24] of DXE COUNT R3 = R3 << 24; R0 = R0 | R1; // R0 = Bits[15:0] of DXE COUNT R2 = R2 | R3; // R2 = Bits[31:16] of DXE COUNT R3 = R0 | R2; // R3 = DXE COUNT R0 = P0; R0 = R0 + R3; // Modify pointer by the DXE COUNT so now R0 points P0 = R0; // to next DXE ADD_DXE_COUNT_END: NOP; /******************************/ DONE: LB0 = [SP++]; // Restore Regs ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 8/28 a LT0 = [SP++]; LC0 = [SP++]; (p5:0) = [SP++]; (r7:1) = [SP++]; RETS = [SP++]; RETS = [SP++]; ASTAT = [SP++]; RTS; //----->DO NOT RESTORE R0<------// Modify SP by one for R0 case // Pop off the real value of RETS リスト 2.multi-DXE ブートの Init コード例 データ・レジスタ R0 は Init コードの終わりで回復されていないことに注意してください。これは、R0 がフラッシ ュ/PROM ブートの外部ポインタであるためです(BMODE = 01)。プロセッサが RTS 命令の後で内蔵ブート ROM に 戻ると、内蔵ブート ROM は R0 に格納されているロケーションからブートを継続します。同様に、ブート・モード が SPI ブートに設定された場合(BMODE = 11)、外部ポインタが R3 に格納されます。このため、SPI ブートの場合、 multi-DXE アプリケーションの Init コード内で R3 は回復されません。 この EE ノートに添付されているのは、ADSP-BF533 EZ-KIT Lite®ボードを使用する multi-DXE ブート例(BF533 Ez Kit Multiple DXE Boot.zip)です。ZIP ファイルには、2 つのブリンク・アプリケーション・プロジェクトと 1 つの Init コード・プロジェクトが含まれています。RESET 後に、内蔵ブート ROM は Init コードでブートします。 Init コードは、その後 PF8 (SW4 プッシュ・ボタン)または PF9 (SW5 プッシュ・ボタン)がアサートされるのを待ちま す。PF8 がアサートされると、DXE1 でブートして実行されます。PF9 がアサートされると、DXE2 でブートして実 行されます。DXE1 は、ボード上の LED を交互にブリンクさせるアプリケーションで、DXE2 はボード上のすべて の LED をブリンクさせるアプリケーションです。 特定のBlackfinブート・モード ここまでは、ADSP-BF531、ADSP-BF532、ADSP-BF533プロセッサのブート・プロセスの概要を説明してきました。 このEEノートの残りの部分では、ハードウェア・インターフェース、ローダ・ファイル構造、予測されるピン動作 のような各ブート・モードに関連する情報について説明します。外部16ビット・メモリ(BMODE = 00)からの実行に ついては、「Running Programs from Flash on ADSP-BF533 Blackfin Processors (EE-239) [3]」で説明しています。 次のセクションでは、ADSP-BF533 EZ-KIT Lite ボードの ASM ブリンク例と Init コードを使用します。この例はこの EE ノートに添付されています。 下記の各ブート・モードでは、アドレス 0xFF80 7FF0~0xFF80 7FFF (L1 データ・バンク A の最後の 16 バイト)は予約されています。このメモリ範囲は、ローダ・ファイル内で各ブロックのヘッダー情報を格納 するために内蔵ブート ROM が使います。ブート後には、このメモリ範囲はランタイム時にアプリケーショ ンから使うことができます。シリコン・レビジョン 0.1 と 0.2 についてはアペンディックスを参照してくだ さい。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 9/28 a 8 ビット・フラッシュ/PROMブート(BMODE = 01) BlackfinプロセッサのEBIUは 16 ビット幅であるため(ADDR[0]はありません)、8 ビット・フラッシュ/PROMはデー タ・バス(D[7:0])の下位 8 ビットのみを使用します。図 7に、Blackfinプロセッサと 8 ビット・フラッシュ/PROMの ピン間接続を示します。 ADSP-BF533 VDDEXT 8-Bit Flash/PROM 10KΩ _______ AMS(0) ____ AOE ____ AWE ADDR[N+1:1] DATA[7:0] ____ AMS ___ OE__ ___ R/W or WR ADDR[N:0] DATA[7:0] 図7.Blackfin プロセッサと 8 ビット・フラッシュ/PROM との間の接続 リスト 3 に、IntelHexフォーマットで生成された 8 ビット・フラッシュ/PROMのローダ・ファイルを示します(この EEノートに添付されているexample.zip)。ローダ・ファイルの構造を説明するために、複数のセクションに分割 しています。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 10/28 a Intel Hex Overhead ADDRESS of 10-Byte Header COUNT of 10-Byte Header FLAG of 10-Byte Header DXE Count 10-Byte Header for Init Code DXE Count Block Init Code DXE Count Block 10-Byte Header for Block 1 of Init Code DXE :020000040000FA 10-Byte Header for Block 2 of Init Code DXE :0A0000004080A0FF04000000120061 :04000A005C00000096 :20000E000000A0FF460000000200660167014005C00408E1180A48E1C0FF80E14A070097D7 Block 1 of Init Code DXE :20002E00240008E1140A48E1C0FF80E101000097240008E1100A48E1C0FF00E18D9940E16F :10004E009100009324008004000527012601100072 :0C005E000000A0FF020000000A00660184 Block 2 of Init Code DXE :0A006A004080A0FF040000001200F7 :0400740088020000FE 10-Byte Header for DXE1 Count Block :200078000000A0FF7E02000002808161113E08E1082048E1E0FF00E1D00040E1A0FF00927A :2000980000E1D20040E1A0FF0092009200E1F60040E1A0FF009200E1F80040E1A0FF00925D :2000B80000E1FA0040E1A0FF009200E1FC0040E1A0FF009200E1FE0040E1A0FF009200E1BA DXE1 Count Block :2000D800000140E1A0FF009200E1020140E1A0FF009200E1040140E1A0FF009200E106015F 10-Byte Header for Block 1 of DXE1 :2000F80040E1A0FF009200E1080140E1A0FF009200E10A0140E1A0FF00924EE1B0FF0EE14F :2001180000047E3208E1CC0148E1A0FF583E08E13C2048E1E0FF00E1C00040E1A0FF0092BF :2001380080E1008040009F0011007B0108E1CC0148E1A0FF50002000FF2F002008E13007FE :2001580048E1C0FF0095104A009708E1080748E1C0FF80E10000104A00923090709000200C :200178001100002000200020002000200020002000200020002080E1000081E10100A2E0D0 :20019800062001900A90110801020850100008E1300748E1C0FF0095004A009708E10807FC :2001B80048E1C0FF80E10000004A009230907090002008E1300748E1C0FF0095084A00979C Block 1 of DXE1 :2001D80008E1080748E1C0FF80E10000084A00923090709000200000000048E1C0FF08E131 :2001F800040A00E1B07B40E1B07B0093240048E1C0FF08E1080A00E1B07B40E1B07B0093FC :20021800240048E1C0FF08E1000A0082796008560097240049E1272009E1040000600897F5 :20023800240049E1272009E1060080E1FFFF0897240010000000FFE3D2FF08E1300748E1F3 :20025800C0FF00E100000097240008E1340748E1C0FF00600097240008E1400748E1C0FFEC :20027800009501E1000F08560097240049E1272009E105000C9923E1C0001C55FB61AA6027 :200298009A5494560A9B2400D243056000E3260008E1000748E1C0FF009521E10001485416 :2002B800010C0318AA60056021E100024854010C0318FA61056021E100044854010C03183D :2002D8009A61056021E100084854010C0410050CD81BDF2F0D60DD2F0AE100004AE18003BB :0802F800A2E00220000010004A :00000001FF リスト 3.IntelHex ローダ・ファイルの例 リスト 3のローダ・ファイルは、シリコン・レビジョン 0.3 に対してビルドしたものです。シリコン・レビ ジョン 0.2 以下に対してビルドされたローダ・ファイルは少しローダ・ファイル構造が違っています。 このローダ・ファイルをBlackfinプロセッサのASYNCバンク 0 に接続された 8 ビット・フラッシュに書き込むと、 Blackfinから見たメモリの値(ロケーション 0x2000 0000 から開始)は 図 8の様に見えます。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 11/28 a 0x20000000 xx 0x40 0x20000002 xx 0x00 0x20000004 xx 0x80 0x20000006 xx 0x20000008 Data Data [15 : 8] [7 : 0] 0x2000001C xx 0x2000001E xx 0x00 0x20000020 xx 0xA0 0xFF 0x20000022 xx 0xFF xx 0x04 0x20000024 xx 0x46 0x2000000A xx 0x00 0x20000026 xx 0x00 0x2000000C xx 0x00 0x20000028 xx 0x00 0x2000000E xx 0x00 0x2000002A xx 0x00 0x20000010 xx 0x12 0x2000002C xx 0x02 0x20000012 xx 0x00 0x2000002E xx 0x00 0x20000014 xx 0x5C 0x20000030 xx 0x66 0x20000016 xx 0x00 DXE Count 0x20000032 xx 0x01 Block 1 of 0x20000018 xx 0x00 Block 0x20000034 xx 0x67 Init Code 0x2000001A xx 0x00 0x20000036 xx 0x01 DXE ……………. …… …… ADDRESS COUNT ADDRESS ADDRESS Data Data [15 : 8] [7 : 0] FLAG 0x00 ADDRESS COUNT FLAG 図8.Blackfin メモリ・ウインドウから見た 8 ビット・フラッシュ/PROM メモリの値 図 9 に、8 ビット・フラッシュ/PROMブートのブート・シーケンスの開始を示します。 ADDRESS COUNT FLAG 10-Byte Header for Init Code DXE Count Block Initial core byte read from location 0x0 of the flash to determine 8-bit flash (0x40) or 16-bit flash (0x60). Note that each read of an 8-bit flash will have the data in the least significant byte of the 16-bit bus. 図9. 8 ビット・フラッシュ・ブート・シーケンスのタイミング図 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 12/28 a 16 ビット・フラッシュ/PROMブート(BMODE = 01) 図 10 に、Blackfinプロセッサと 16 ビット・フラッシュ/PROMとの間のピン間接続を示します。 ADSP-BF533 VDDEXT 16-Bit Flash/PROM 10KΩ _______ AMS(0) ____ AOE ____ AWE ____ AMS ___ OE __ ___ R/W or WR ADDR[N+1:1] ADDR[N:0] DATA[15:0] DATA[15:0] 図10.Blackfin プロセッサと 16 ビット・フラッシュ/PROM との間の接続 このEEノートに添付されている例から 16 ビット・フラッシュ/PROMのローダ・ファイルを生成する場合、リスト 3 に示す内容と全く同じですが、DXEカウント・ブロックの 10 バイト・ヘッダーのアドレスが、8 ビット・フラッシ ュ/PROMの場合の 0xFF80 0040 の代わりに 0xFF80 0060 となる点が異なります。このため、ローダ・ファイル の先頭バイトは 0x40 の代わりに 0x60 になります。内蔵ブートROMは、この先頭バイトを使って、8 または 16 ビ ットのいずれのフラッシュ/PROMが接続されているかを判断します。先頭バイトが 0x60 の場合 16 ビット・フラッ シュ/PROMと見なし、先頭バイトが 0x40 の場合 8 ビット・フラッシュ/PROMと見なします。 このローダ・ファイルをBlackfinプロセッサのASYNCバンク 0 に接続された 16 ビット・フラッシュに書き込むと、 Blackfinプロセッサから見たメモリの値(ロケーション 0x2000 0000 から開始)は 図 11の様に見えます。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 13/28 a 0x20000000 0x00 0x60 0x20000002 0xFF 0x80 0x20000004 0x00 0x04 0x20000006 0x00 0x00 0x20000008 0x00 0x12 ADDRESS Data [15 : 8] Data [7 : 0] 0x2000005E 0x00 0x00 10-Byte ……………. …… …… Header for 0x20000066 0x00 0x0A 0x20000068 0x01 0x66 0x2000002A 0x00 0x60 10-Byte Header for COUNT FLAG 0x2000000A 0x00 0x5C DXE Count 0x2000000C 0x00 0x00 Block 0x2000000E 0x00 0x00 ADDRESS 0x20000010 0xFF 0xA0 0x20000012 0x00 0x46 0x20000014 0x00 0x00 0x20000016 0x00 0x02 FLAG 0x20000018 ……………. 0x01 …… 0x66 …… Block 1 of 0x2000005C 0x00 0x10 ADDRESS ADDRESS Data Data [15 : 8] [7 : 0] COUNT Init Code DXE Block 2 of Init Code Block 2 of Init Code ……………. …… …… 0x20000072 0x00 0x12 0x20000074 0x02 0x88 0x20000076 0x00 0x00 Count 0x20000078 0x00 0x00 10-Byte ……………. …… …… Header for 0x20000080 0x80 0x02 0x20000082 0x61 0x81 ……………. …… …… 0x200002FE 0x00 0x10 DXE1 Count DXE1 Block 1 of DXE1 Block 1 of DXE1 図11.Blackfin メモリ・ウインドウから見た 16 ビット・フラッシュ/PROM メモリの値 16 ビット・フラッシュ/PROMのローダ・ファイル構造(図 11)は、シリコン・レビジョン 0.3 以降でのみサ ポートされています。ADSP-BF531/BF532/BF533 のシリコン・レビジョン 0.2 以前では、8 ビット・ブー トのみをサポートしています。したがって、シリコン・レビジョン 0.2 以前で 16 ビット幅を選択する と、出力ローダ・ファイルは、16 ビット・フラッシュ/PROMからの 8 ビット・ブートを"シミュレート" するためゼロを埋め込んだファイルになります。このローダ・ファイルをフラッシュ/PROMメモリに書 き込むと、データ・バスの上位 8 ビット(DATA[15:8])にゼロを埋め込んだ 図 8のように見えます。 図 12 に、16 ビット・フラッシュ/PROMブートのブート・シーケンスの開始を示します。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 14/28 a Note that each read of a 16-bit flash will populate the full 16-bit bus. ADDRESS COUNT F. 10-Byte Header for Init Code DXE Count Block ADDRESS COUNT F. 10-Byte Header for Block 1 of Init Code DXE Block 1 of Init Code DXE… …….. Initial core byte read of flash location 0x0 determines 8-bit flash (0x40) or 16-bit flash (0x60). 図12.16 ビット・フラッシュ・ブート・シーケンスのタイミング図 プロセッサはフラッシュのロケーション 0x0 から初期コア・バイト読み出しを行って、フラッシュのメモ リ幅を判断します。FIFO からブートするときは、先頭バイト(ローダ・ファイル内の先頭の 10 バイト・ヘ ッダーの一部)は 2 回送信される必要があります。1 回はこの初期コア読み出し、もう 1 回は実際のブー ト・シーケンスです。 マスタ・ホスト経由のSPIスレーブ・モード・ブート(BMODE = 10) SPI スレーブ・モード・ブートの場合、ADSP-BF531/BF532/BF533 は SPI スレーブ・デバイスに設定され、ホストを 使ってプロセッサをブートさせます。 このブート・モードは、ADSP-BF531/BF532/BF533 プロセッサのシリコン・レビジョン 0.2 以前ではサポー トされていません。 図 13 に、このモードに必要なピン間接続を示します。ホストはローダ・ファイル・ストリームのアクノリッジを必 要とせずに、Blackfinプロセッサをブートさせます。ホストは、ローダ・ファイル(ASCIIフォーマット)から 1 バイト ずつ送信するように設定する必要があります。このセットアップでは、PFxがBlackfinプロセッサからマスター・ホ スト・デバイスへのホスト・ウエイト(HWAIT)信号になります。この信号は、ブート・プロセスの所定区間(特にinit コード実行時とゼロ・フィル・ブロック時)にホストを“ホールド・オフ”させるためにBlackfinプロセッサが使用する 信号になります。 PFxがアサートされると(ハイ・レベル)、マスター・ホスト・デバイスはBlackfinプロセッサへの バイトの送信を中断する必要があります。PFxがデアサートされたら(ロー・レベル)、マスター・ホスト・デバイス はバイトの送信を中断されたところから再開します。スレーブは先頭ブロックの処理を完了するまでPFxピンを駆動 しないため、HWAIT信号をプルダウンする抵抗を使用してください。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 15/28 a ADSP-BF533 (Slave SPI Device) Host (Master SPI Device) SPICLK _____ S_SEL SPICLK _____ SPISS MOSI MOSI MISO MISO FLAG / Interrupt (HWAIT) PFx 10KΩ GND 図13.ホスト(SPI マスタ)と Blackfin プロセッサ(SPI スレーブ)との間の接続 ホストは、バイトを送信する前に Blackfin がリセットから抜け出ていることを確認する必要があります。リ セットの前に Blackfin プロセッサへ送信されたバイトは失われるため、ブート・シーケンスは失敗します。 この PFx 番号はユーザにより定義されて、ローダ・ファイル内に組み込まれます。elfloader ユーティリティが全 10 バイト・ヘッダーごとにこの番号を PFLAG ビット・フィールドに組み込みます(FLAG ワードのビット[8:5])。これ は–pflag number コマンドライン・スイッチを使って行います。ここで、number は Blackfin スレーブが使用する ための PFx フラグで、値は 1~15 です。 –pflag number スイッチを使用しない場合、FLAG のビット 8:5 内のデフォルト値は 0 になり、PF0 がホ ストに対する HWAIT 信号と見なされます。PF0 は/SPISS ピン(これは SPI スレーブ・ブートに必須なピ ン)と共用されるため、必ず–pflag スイッチを使用して 0 以外の値を指定してください。 Rev 0.3 ブート Rom に不具合があるため、SPI コントロール・レジスタと DMA5 コンフィギュレーション・ レジスタにはブート後にデフォルト値が設定されません。 CCLK = 333 MHz、SCLK = 66.6 MHz を使用するスレーブを持つシステムで、ホストが最大 SPI ボーレート= 1 MHz で動作することがテストされました。 この EE ノートに添付されているホスト・コード例(Host_Code.zip)は、ADSP-BF532 プロセッサをホストとして 使用した場合のものです。 ADSP-BF532 プロセッサをホストとして使用し、ADSP-BF533 プロセッサをスレーブ SPI デバイスとして使用した SPI スレーブ・モード・ブートのタイミング図を下図に示します。ホスト側では、PF4 を/CS として使用し、この信 号はスレーブ ADSP-BF533 の/SPISS に接続されています。SPI スレーブ(ADSP-BF533 プロセッサ)の PF13 は、ホ スト(ADSP-BF532 プロセッサ)の PF15 に接続されています。この接続は、ホストをホールド・オフさせる HWAIT 信号になります。すべてのタイミング図は、SPI スレーブ側から見たものです。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 16/28 a 使用したローダ・ファイル(SPI_Slave_HostFile.ldr)は、リスト 3と同じですが、このブート・モードの機能を 示すため 2 個のブロックが追加されている点が異なります。この追加された 2 ブロックは、ロケーション 0xFFA0 0300 でバイト数 0x4000 のゼロ・フィル・ブロックと、ロケーション 0xFFA0 4300 で 0x11、0x22、0x33、 0x44、0x55、0x66、0x77、0x88、0x99、0xAA、0xBB、0xCC、0xDD、0xEE、0xFF、0x19 の値を持つデー タ・ブロックです。 図14 に、SPIスレーブ・モードのブート・シーケンスを示します。 Full SPI Slave Mode Boot Sequence Configuration of HWAIT (PF13) after first 10-byte header is received. Assertion of HWAIT (PF13) during Init Code Execution. Assertion of HWAIT (PF13) during Zero Fill Block. 図14.SPI スレーブ・モード・ブート・シーケンスのタイミング図 SPIスレーブはホストから先頭の 10 バイト・ヘッダーを受信すると、HWAIT信号として設定されたPFxフラグを知る ことができます。このケースでは、PF13 が使用されています。 図 15で、FLAGフィールドのビット 8:5 が処理され た後にPF13 のアサーションが解除されていることに注意してください。 図 15は、PF13 にプルアップ抵抗を使用して、デバッグ目的のために取得しました。通常動作には、プル ダウン抵抗の使用が推奨されます。この場合はPF13 は常にロー・レベルです。 0x40 0x80 0xA0 ADDRESS 0xFF 0x04 0x00 0x00 COUNT 0x00 0xB2 FLAG 0x01 10-Byte Header for Init Code DXE Count Block Note the configuration of PF13 after the first FLAG is received which has the PF number stored in bits[8:5] 図15.SPI スレーブ・モード・ブート・シーケンス:ブート・シーケンスの開始 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 17/28 a その後、ホストは 4 バイトの Init コード DXE カウント・ブロック、Init コード DXE ブロック 1 の 10 バイトのヘッダ ー、ブロック 1 自体を送信します。 0x5C 0x00 0x00 0x00 0x00 0x00 0xA0 0xFF 0x46 0x00 0x00 0x00 0xA2 0x01 0x66 0x01 0x67 ADDRESS COUNT FLAG Init Code DXE Count 10-Byte Header for Block 1 of Init Code DXE Block 1 of Init Code…. 図16.SPI スレーブ・モード・ブート・シーケンス: Init コード DXE のブート・ブロック 1 Init コード DXE を Blackfin メモリへ書き込んだ後、スレーブ SPI Blackfin プロセッサは HWAIT 信号 PF13 をアサー トして、Init コードを実行する間、バイトを送信しないようホストに通知します。Blackfin プロセッサ・コアは SPI インターフェースより高速動作しているため、ホストからバイトが送信される速度より高速に Init コードが実行さ れます。 0x00 0x00 0xA0 0xFF ADDRESS 0x02 0x00 0x00 0x00 0xAA 0x01 0x66 0x01 COUNT FLAG 10-Byte Header for Block 2 of Init Code DXE Block 2 0x40 0x80 0xA0 0xFF ADDRESS 10-Byte Header DXE1 Count Block… Assertion of HWAIT (PF13) during short duration of Init Code execution. 図17.SPI スレーブ・モード・ブート・シーケンス: Init コード DXE のブート・ブロック 2 図 18 に、このブート・モードのゼロ・フィル・ブロックの処理を示します。内蔵ブート ROM がゼロ・フィル・ブ ロックに遭遇すると、HWAIT(PF13)をアサートして、ホストのバイト送信を中断させます。この間、MemDMA を 実行して 0x4000 のゼロをロケーション 0xFFA0 0300~0xFFA0 4300 に転送します。終了すると、内蔵ブート ROM は HWAIT のアサートを解除し、ホストはブート・プロセスの残りのバイト(ブロック 3 の 10 バイト・ヘッダー とブロック 3 自体)の送信を再開します。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 18/28 a Note that the next byte of data will be sent by the host and it will sit in the FIFO until HWAIT is de-asserted. In this case it is the first byte (0x00) of the 10-Byte header for Block 3 of DXE1. ADDRESS= 0xFFA00300 COUNT= 0x00004000 FLAG 0x01A3 10-Byte Header for Block 2 of DXE1 (Zero Fill Block) Assertion of HWAIT (PF13) during zero-fill block processing.Processor is zero-filling memory via MemDMA during this 図18.SPI スレーブ・モード・ブート・シーケンス:ゼロ・フィル・ブロックの転送(DXE1 のブロック 2 ) 10-Byte Header for Block 3 of DXE1 (Last Block) Block 3 of DXE1 図19.SPI スレーブ・モード・ブート・シーケンス: DXE1 のブート・ブロック 3 (最終ブロック) ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 19/28 a SPIメモリを使用するSPIマスタ・モード・ブート (BMODE = 11) SPI マスター・モード・ブートの場合、ADSP-BF531/BF532/BF533 プロセッサは SPI マスターとして設定され、SPI メモリに接続されます。このモードに必要なピン間接続を下図に示します。 VDDEXT ADSP-BF533 (Master SPI Device) 10KΩ SPICLK PF2 10KΩ SPI Memory (Slave SPI SPICLK __ CS MOSI MOSI MISO MISO 図20.Blackfin―SPI メモリ・ピン間接続 このブート・モードが動作するためには MISO のプルアップ抵抗が必ず必要です。このため、SPI メモリが 応 答 し な い 場 合 ( す な わ ち SPI メ モ リ か ら MISO ピ ン に デ ー タ が 書 き 込 ま れ な い 場 合 ) 、 ADSPBF531/BF532/BF533 プロセッサは MISO ピンから 0xFF を読み込みます MISO ラインにはプルアップ抵抗が必須ですが、プルアップ/プルダウン抵抗の追加も次の場合には意味があります。 1) Blackfin プロセッサのリセット中、SPI メモリをアクティブにしないようにするため PF2 信号をプルアップする場 合。2)オシロスコープ像を明瞭にするため SPICLK をプルダウンする場合。 シリコン・レビジョン 0.2 以前では、SPI コントロール・レジスタ(SPICTL)の CPHA ビットと CPOL ビット に 1 が設定されていました(これらのビットについては、「Hardware Reference Manual [2]」を参照してくだ さい)。このため、SPI メモリがスリー・ステートから戻るときクロック信号の誤った立ち上がりエッジを 検出してしまうことがあります。このためにブート・プロセスが失敗する場合には、SPICLK 信号にプルア ップ抵抗を接続するとこの問題を軽減することができます。シリコン・レビジョン 0.3 では、SPI コントロ ール・レジスタで CPHA = CPOL = 0 とすることによりこの問題は解決されています。シリコン・レビジョン 0.3 は、SPICLK のプルアップ抵抗に対して強化されています。したがって、いずれのシリコン・レビジョ ンを使うボードでも SPICLK を安全にプルアップすることができます。ただし、シリコン・レビジョン 0.3 では、オシロスコープで見た場合、PF2 のアサート解除中に SPICLK が予想外に高いレベルになることが あることに注意してください。 このインターフェースでサポートしているSPIメモリは、標準の8/16/24ビット・アドレサブルSPIメモリ(読み出しシ ーケンスを下記に説明)とAtmel社のSPI DataFlashデバイスAT45DB041B、AT45DB081B、AT45DB161B*です。 * この EE ノートに添付されているのは、ADSP-BF532 Blackfin プロセッサを使用して Atmeld 社の DataFlash デバイスに書き込み を行うコード例です(Program_Atmel.zip 参照)。 標準の8/16/24ビット・アドレサブルSPIメモリとは、0x03の読み出しコマンド・バイト、それに続いて1アドレス・ バイト( 8ビット・アドレサブルSPIメモリ)、2アドレス・バイト(16ビット・アドレサブルSPIメモリ)、または3アド レス・バイト(24ビット・アドレサブルSPIメモリ)を入力するメモリです。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 20/28 a 読み出しコマンドとアドレスが送信されると、選択されたアドレスに格納されているデータがMISOピンからシフト 出力されます。データは、そのアドレスから連続クロック・パルスによりシーケンシャルに出力されます。アナロ グ・デバイセズは、次の標準SPIメモリ・デバイスをテスト済みです。 8 ビット・アドレサブル SPI メモリ: Microchip 社の 25LC040 16 ビット・アドレサブル SPI メモリ: Microchip 社の 25LC640 24 ビット・アドレサブル SPI メモリ: STMicroelectronics 社の M25P80 SPIメモリ検出ルーチン BMODE = 11では、種々のSPIメモリからのブートをサポートしているため、内蔵ブートROMは接続されているメモ リ・タイプを検出します。プロセッサに接続されているメモリ・タイプ(8、16、または24ビット・アドレサブル)を 調べるため、内蔵ブートROMはSPIメモリが応答するまで、メモリへ次のバイト・シーケンスを送信します。SPIメ モリは、正しいアドレスを受け取るまで応答しません。内蔵ブートROMは次のステップを実行します。 1. MOSI ピンに読み出しコマンド 0x03 を送信して、MISO ピンのダミー読み出しを行います。 2. MOSI ピンにアドレス・バイト 0x00 を送信して、MISO ピンのダミー読み出しを行います。 3. MOSI ピンにさらにバイト 0x00 を送信して、MISO ピンの着信バイトが 0xFF (プルアップ抵抗からの値、次の 注参照)以外であることをチェックします。着信バイトが 0xFF 以外の場合は、1 アドレス・バイトの後に SPI メ モリが応答してきたことを意味し、8 ビット・アドレサブル SPI メモリ・デバイスが接続されていると見なしま す。 4. 着信バイトが 0xFF の場合は、内蔵ブート ROM が MOSI ピンにさらにバイト 0x00 を送信して、MISO ピンの 着信バイトが 0xFF 以外であることをチェックします。着信バイトが 0xFF 以外の場合は、2 アドレス・バイト の後に SPI メモリが応答してきたことを意味し、16 ビット・アドレサブル SPI メモリ・デバイスが接続されてい ると見なします。 5. 着信バイトが 0xFF の場合は、内蔵ブート ROM が MOSI ピンにさらにバイト 0x00 を送信して、MISO ピンの 着信バイトが 0xFF 以外であることをチェックします。着信バイトが 0xFF 以外の場合は、3 アドレス・バイト の後に SPI メモリが応答してきたことを意味し、24 ビット・アドレサブル SPI メモリ・デバイスが接続されてい ると見なします。 6. 着信バイトが 0xFF の場合(応答するデバイスがない場合)、内蔵ブート ROM は AT45DB041B、AT45DB081B、 または AT45DB161B のいずれかの Atmel 社の DataFlash デバイスが接続されているものと見なします。これらの DataFlash デバイスは、前述の標準 SPI メモリの読み出しシーケンスと異なる読み出しシーケンスを持っていま す。さらに詳しい情報については、これらのデバイスのデータ・シート[4]、[5]、[6]を参照してください。内蔵 ブート ROM は、ステータス・レジスタを読み出すことにより、上記の内のどの Atmel DataFlash メモリが接続さ れているかを調べることができます。上記 DataFlashes 間の主な違いは、ページあたりのバイト数です。 AT45DB041B と AT45DB081B は 264 バイト/ページで、AT45DB161B は 528 バイト/ページです。これらのいずれ が Blackfin に接続されているかを調べるために、内蔵ブート ROM はデバイス集積度ビットが配置されている DataFlash のステータス・レジスタを読み出します。デバイス集積度ビット= 1011 (バイナリ)の場合、内蔵ブート ROM は AT45DB161B が接続しているものと見なし、それに従ってデバイスをアドレス指定します。その他の場 合は、AT45DB041B または AT45DB081B が接続されているものと見なし、適切にアドレス指定します。シリコ ン・レビジョン 0.3 の内蔵ブート ROM コードが生成された後、Atmel 社はさらに DataFlashe の派生品を導入しま した。これら派生品を使う場合は、デバイスが 264 バイト/ページであることを確認してください。そうしない と、ブート・シーケンスは失敗します。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 21/28 a 前述の SPI メモリ検出ルーチンの場合、シリコン・レビジョン 0.2 以前の内蔵ブート ROM は、MISO ピン の着信データが 0x00(ローダ・ファイルの先頭バイト)であるか否かチェックします。シリコン・レビジョ ン 0.3 の内蔵ブート ROM は、MISO ピンの着信データが 0xFF 以外であることをチェックします。このた め、シリコン・レビジョン 0.2 以前用にビルドされた SPI ローダ・ファイルは先頭バイトが 0x00 である必 要があります。シリコン・レビジョン 0.3 の場合、ローダ・ファイルの先頭バイトは 0x40 に設定されてい ます。 SPIボーレート・レジスタは133に設定されます。これは、システム・クロックが54 MHzの場合、54 MHz/(2*133) = 203 kHzボー・レートになることを意味します。ADSP-BF533 EZ-KIT Liteボードでは、デフォルト・システム・クロ ック周波数は54 MHzです。 16ビット・アドレサブルSPIメモリ(Microchip社の25LC640)を使用したSPIマスタ・モード・ブートのブート・シーケ ンスを次の図に示します。使用したローダ・ファイルは、リスト 3と同じです。すべての図はシリコン・レビジョン 0.3を使って取得しました。 図21 に、SPIマスタ・モード・ブート・シーケンスを示します。 Full SPI Master Mode Boot Sequence Note the de-assertion of the PF2 (/CS) line for each DMA sequence.The On-Chip Boot ROM sets up a DMA sequence for each 10-Byte Header and each Block.These DMA sequences are preceded by a core driven read command (0x03) and address byte(s). 図21.SPI マスタ・モード・ブート・シーケンスのタイミング図 最初に、内蔵ブート ROM は接続されている SPI メモリ・タイプ(8/16/24 ビット・アドレサブルまたは Atmel 社の DataFlash)を調べます。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 22/28 a Start of boot sequence DSP sends out Read Command (0x03) DSP sends out 1st address byte (0x00) DSP sends out another byte and the SPI memory responds back with the byte located at address 0x0 (value of 0x40) DSP sends out 2nd address byte (0x00) After this address byte is sent out, a 16-bit addressable SPI memory is properly addressed and ready to send back data. SPI Memory Detection Routine 図22.SPI マスタ・モード・ブート・シーケンス: SPI メモリ検出シーケンス 図22は、シリコン・レビジョン0.3の製品を使って取得したものであることに注意してください。シリコン・レビジ ョン0.2では、SPICLKは、転送前と転送中にハイ・レベルになります。 内蔵ブートROMは、この時点で16ビット・アドレサブルSPIメモリが接続されていることを検出しています。次に、 読み出しコマンドを発行して、InitコードDXEカウント・ブロックの先頭の10バイト・ヘッダーで読み出すアドレス 0x0000を送信します。 DSP sends out read command, 0x03 and then 2 address bytes: addr[15:8] first and then addr[7:0]. 0x40 0x80 0xA0 ADDRESS a 0xFF 0x04 0x00 0x00 COUNTa 0x00 0x12 0x00 FLAG 10-Byte Header for Init Code DXE Count Block 図23.SPI マスタ・モード・ブート・シーケンス: Init コード DXE カウント・ブロックのブート 10 バイト・ヘッダー Init コード DXE カウント・ブロックは 4 バイトの無視ブロックであるため、内蔵ブート ROM は読み出しコマンドを 発行して、Init コード DXE のブロック 1 の 10 バイト・ヘッダーでアドレス 0x000E を送信します。このヘッダーを 読み出した後、内蔵ブート ROM はメモリ内のブロック 1 のロケーションとそのロケーションへ書き込むバイト数を 知ります。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 23/28 a DSP sends out read command, 0x03 and then 2 address bytes: addr[15:8] = 0x0, addr[7:0] = 0x0E 0x00 0x00 0xA0 ADDRESS a 0xFF 0x46 0x00 0x00 COUNTa 0x00 0x02 0x00 FLAG 10-Byte Header for Block 1 of Init Code DXE 図24.SPI マスタ・モード・ブート・シーケンス: Init コード DXE のブロック 1 のブート 10 バイト・ヘッダー この情報を処理した後、内蔵ブート ROM は再度読み出しコマンドを発行して、Init コード DXE のブロック 1 でブー トするアドレス 0x0018 を送信します。 DSP sends out read command, 0x03 and then 2 address bytes: addr[15:8] = 0x0, addr[7:0] = 0x18 0x66 0x01 0x67 a 0x01 0x40 0x05 0xC0 a 0x04 0x08 0xE1 Block 1 of Init Code DXE……. 図25.SPI マスタ・モード・ブート・シーケンス: Init コード DXE のブート・ブロック 1 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 24/28 a アペンディックス:ブート・モード対シリコン・レビジョン すべての ADSP-BF531/BF532/BF533 派生品に対して次のブート・モード・オプションが適用されます。 シリコン・レビジョン 0.1 1 BMODE[1:0] Description 00 Executes from external 16-bit memory connected to ASYNC Bank0 (bypass Boot ROM) 01 Boots from 8/16-bit flash/PROM. (Only 8-bit boot supported)1 10 Boots from an 8-bit addressable SPI memory in SPI Master mode 11 Boots from a 16-bit addressable SPI memory in SPI Master mode 8 ビット・ブートのみをサポート。16 ビット・フラッシュには、 8 ビット・ブートを”シミュレート”するためゼロがパディングされ ます。 表2.シリコン・レビジョン 0.1 でのブート・モード シリコン・レビジョン 0.1 では、IGNORE ブロックと Init ブロックはサポートされていません。 シリコン・レビジョン 0.1 の場合、アドレス 0xFF90 0000~0xFF90 000F (L1 データ・バンク B の先頭 の 16 バイト)は予約済みであることに注意してください。このメモリ範囲は、ローダ・ファイル内で各ブロ ックのヘッダー情報を格納するために内蔵ブート ROM が使います。ブート後には、このメモリ範囲はラン タイム時にアプリケーションから使うことができます。 シリコン・レビジョン 0.2 シリコン・レビジョン 0.2 で 24 ビット SPI モードが導入されました。SPI デバイス自動検出機能を使うと、1 つの BMODE 構成で 8/16/24 ビット・メモリ・デバイスをカバーすることができます。さらに、シリコン・レビジョン 0.2 では、INIT コード機能が導入されました。 1 2 3 BMODE[1:0] Description 00 Executes from external 16-bit memory connected to ASYNC Bank0 (bypass Boot ROM) 01 Boots from 8/16-bit flash/PROM. (Only 8-bit boot supported). 1 10 Reserved 11 Boots from a 8/16/24-bit addressable SPI memory in SPI Master mode (pull-up required on MISO). 2, 3 8 ビット・ブートのみをサポート。16 ビット・フラッシュは、8 ビット・ブートを"シミュレート"するためゼロが詰め込まれます。 内蔵ブート ROM にエラーがあるため、シリコン・レビジョン 0.2 では、SPI マスタ・モード・ブートに対するゼロ・フィル・ブロックはサポー トされていません。このモードのローダ・ファイル内でゼロを詰め込む必要があります。 SPI ブータブル・ローダ・ファイルの先頭バイトは 0x00 である必要があります。 表3.シリコン・レビジョン 0.2 でのブート・モード シリコン・レビジョン 0.2 の場合、アドレス 0xFF80 7FE0~0xFF80 7FFF (L1 データ・バンク A の最後 の 32 バイト)は予約済みであることに注意してください。このメモリ範囲は、ローダ・ファイル内で各ブロ ックのヘッダー情報を格納するために内蔵ブート ROM が使います。ブート後には、このメモリ範囲はラン タイム時にアプリケーションから使うことができます。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 25/28 a 上記の注 1、 2、 3 は、0.2 モードで起動する場合にのみ elfloader ユーティリティにより処理されます(–sirevision 0.2 コマンドライン・スイッチを使用)。これは現在の VisualDSP++ 3.5 ツールではデフォルト のケースになっていますが、これはシリコン・レビジョン 0.3 が使用可能になったとき将来のツール・リリ ースで変更されます。 シリコン・レビジョン 0.3 シリコン・レビジョン 0.3 で SPI スレーブ・ブートが導入されました。SPI マスタ・モードでは、標準の 8/16/24 ビッ ト SPI メモリの他に Atmel 社の DataFlash デバイスがサポートされています。また、真の 16 ビット・フラッシュ /PROM モードもサポートしています。ソフトウェア・リセットのサポートも改善されています。 BMODE[1:0] Description 00 Executes from external 16-bit memory connected to ASYNC Bank0 (bypass Boot ROM) 01 Boots from 8/16-bit flash/PROM 10 Boots from an SPI host in SPI Slave mode 11 Boots from an 8/16/24-bit addressable SPI memory in SPI Master mode with support for the following Atmel DataFlash devices: AT45DB041B, AT45DB081B, and AT45DB161B 表4.シリコン・レビジョン 0.3 でのブート・モード シリコン・レビジョン 0.3 の場合、アドレス 0xFF80 7FF0~0xFF80 7FFF (L1 データ・バンク A の最後 の 16 バイト)は予約済みであることに注意してください。このメモリ範囲は、ローダ・ファイル内で各ブロ ックのヘッダー情報を格納するために内蔵ブート ROM が使います。ブート後には、このメモリ範囲はラン タイム時にアプリケーションから使うことができます。 シリコン・レビジョン 0.3 機能をイネーブルするときは、elfloader ユーティリティを 0.3 モードで起動する 必要があります(–si-revision 0.3 コマンドライン・スイッチを使用)。シリコン・レビジョン 0.3 が使 用可能になり次第、VisualDSP++ 3.5 ツールの将来のアップデートでこれがデフォルト・ケースになりま す。elfloader ユーティリティの現在のバージョン(プリシリコン・レビジョン 0.3)は、デフォルトで 0.2 モー ドを使用しているため、–si-revision 0.3 コマンドライン・スイッチを使って、シリコン・レビジョン 0.3 の機能を呼び出す必要があります。 シリコン・レビジョン 0.3 の内蔵ブート ROM は、シリコン・レビジョン 0.2 と完全な後方互換性を持って います。シリコン・レビジョン 0.2 と 0.3 では、–si-revision 0.2 コマンドライン・スイッチを使って elfloader ユーティリティを起動する必要があります。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 26/28 a アペンディックス: Blackfinローダ・ファイル・ビューア http://www.blackfin.org/toolsから提供している Blackfin Loader File Viewer (LdrViewer)は、非常に便利なユーティ リティであり、ローダ・ファイルを入力して、個々の.DXEファイルに分解/分類してヘッダー付きの個々のブロック (ADDRESS、COUNT、FLAG)として表示します。この便利なユーティリティは、ローダ・ファイル内容の表示に役立 ちます。リスト 3のファイルを LdrViewerにロードすると、GUIにより次のように表示されます。 図 26. Blackfin ローダ・ファイル・ビューア・ユーティリティ LdrViewer ユーティリティは、標準 VisualDSP++ソフトウェア・ツール・セットに含まれないことに注意してくださ い。 ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 27/28 a 参考 [1] [2] [3] [4] [5] [6] VisualDSP++ 3.5 Loader Manual for 16-bit Processors. Rev 1.0, October 2003. Analog Devices, Inc. ASDP-BF533 Blackfin Processor Hardware Reference. Rev 3.3, September 2008. Analog Devices, Inc. Running Programs from Flash on ADSP-BF533 Blackfin Processors (EE-239). Rev 1, May 2004. Analog Devices Inc. AT45DB041B DataFlash Datasheet. April 2004. Atmel Inc. AT45DB081B DataFlash Datasheet. November 2003. Atmel Inc. AT45DB161B DataFlash Datasheet. November 2003. Atmel Inc. ドキュメント改訂履歴 Revision Description Rev 4 – September 29, 2008 by M. Kokaly-Bannourah Added informational bullet for Figure 15. Rev 3 – January 11, 2005 by H. Desai Added informational bullets for reserved memory regions Rev 2 – December 17, 2004 by H. Desai Added pull-ups to the /AMS0 for all flash boot figures Added a pull-up to PF2 in Figure 20 Described pull-up or pull-down on SPICLK in Figure 20 Specified maximum SPI Baud Rate for SPI Slave Mode Boot Indicated that rev. 0.1 does not support IGNORE and INIT Blocks Changed the term “feedback strobe” to host wait (HWAIT) signal Added a discussion on Atmel DataFlash derivatives Rev 1 – June 03, 2004 by H. Desai Initial Release ADSP-BF533 Blackfin®のブート・プロセス (EE-240) 28/28