RZ/A1H グループ
MMC コントローラ内蔵フラッシュメモリからのブート例(暫定版)
要旨
本アプリケーションノートは、MMC ホストインタフェースに接続された MMC コントローラ内蔵 NAND フラッシュメモリ(eMMC デバイス)からブートする方法について説明します。 本アプリケーションノートで説明するブート処理では、RZ/A1 用 MMC ドライバソフトウェアライブラリ (以下、MMC ドライバとします)を使用しています。対象デバイス
RZ/A1H 本アプリケーションノートを他のマイコンへ適用する場合、そのマイコンの仕様にあわせて変更し、十分 評価してください。 R01AN1977JJ0081 Rev.0.81 2016.09.02目次
1.
仕様 ... 4
1.1 ブートモード 5(eMMC ブート)の動作イメージ ... 4 1.2 使用する周辺機能 ... 62.
動作確認条件 ... 7
3.
関連アプリケーションノート ... 7
4.
ハードウェア説明 ... 8
4.1 ハードウェア構成例 ... 8 4.2 使用端子一覧 ... 95.
ソフトウェア説明 ... 10
5.1 eMMC ブート動作の概要 ... 10 5.1.1 eMMC ブート動作に関する用語 ... 10 5.2 eMMC ブート動作の説明 ... 11 5.2.1 サンプルコード全体の動作 ... 11 5.2.2 ブート起動用内蔵 ROM プログラムの動作 ... 12 5.2.3 ローダプログラムの動作 ... 13 5.2.4 アプリケーションプログラム(ユーザプログラム)の動作 ... 14 5.3 サンプルコード実行時の周辺機能の設定およびメモリ配置 ... 15 5.3.1 周辺機能の設定 ... 15 5.3.2 サンプルコードのセクション配置 ... 16 5.4 関数一覧 ... 19 5.5 関数仕様 ... 206.
eMMC ブートシステムの開発方法 ... 22
6.1 ローダプログラムの詳細仕様 ... 22 6.1.1 ローダプログラムの生成方法 ... 22 6.1.2 ローダプログラムのメモリマップ ... 23 6.1.3 ローダプログラムの格納フォーマット ... 24 6.1.4 ローダプログラムの動作フロー ... 26 6.1.5 アプリケーションプログラムの転送 ... 27 6.1.6 アプリケーションプログラムのエントリポイントへの分岐 ... 28 6.2 アプリケーションプログラムの作成例 ... 29 6.2.1 アプリケーションプログラムの生成方法 ... 29 6.2.2 アプリケーションプログラムのメモリマップ ... 30 6.2.3 サンプルコードのダウンロードテーブルの設定内容 ... 317.
サンプルコードの説明 ... 33
7.1 サンプルコードの動作概要 ... 33 7.2 サンプルコードのプロジェクトの構成 ... 338.
eMMC ブートに関する注意事項 ... 34
8.1 eMMC ブート可能なデバイスについて ... 34 8.2 Boot Operation について ... 34 8.3 パーティションについて ... 351. 仕様
1.1
ブートモード 5(eMMC ブート)の動作イメージ
RZ/A1Hは、外部端子(MD_BOOT2~MD_BOOT0)でブートモード 5(eMMC ブート)の設定をした場合、 MMC ホストインタフェース(以下、MMCHI とします)に接続された eMMC デバイスからブートします。 図 1.1にeMMC ブートの動作イメージを示します。eMMC ブートでは、パワーオンリセット解除後にブート 起動用内蔵 ROM プログラムを実行します。ブート起動用内蔵 ROM プログラムは、eMMC デバイスから固定 データサイズ(28K バイト)のプログラムデータを大容量内蔵 RAM に転送し、実行します。本アプリケー ションノートでは、この固定データサイズ(28K バイト)のプログラムデータをローダプログラムと呼びま す。ローダプログラムは、eMMC デバイス内の任意のセクタに格納されたアプリケーションプログラムを大 容量内蔵 RAM の任意のアドレスに転送し、分岐する処理を行います。 本アプリケーションノートでは、RZ/A1H の eMMC ブートを使用する場合のローダプログラムおよびアプ リケーションプログラムの作成例について説明します。
【注】 eMMC デバイスの仕様については、JEDEC から発行されている「JEDEC STANDARD JESD84 A44 (MMCA 4.4)」規格をご参照ください。 ブート起動用 内蔵ROMプログラム MMCHI 1. ブート起動用ROMプログラムの実行 大容量内蔵RAM ローダプログラム(28Kバイト) H'2002_4000 MMCコントローラ内蔵NANDフラッシュメモリ (eMMCデバイス) アプリケーションプログラム (サイズは任意) セクタ1 アプリケーションプログラム 11.アプリケーションプログラムを大容量内蔵RAMに転送 セクタ0 ローダプログラム(28KB) セクタ56 H'FFFF_0000 H'2002_AFFF H'FFFF_FFFF ブート起動用内蔵ROMプログラム のワーク領域(16Kバイト) ローダプログラム用 チェックサムブロック(512バイト) H'2002_3FFF H'2002_0000 2. MMCHIの有効化 (端子設定、モジュールスタンバイ解除、MMCHIレジスタ設定) 3. チェックサムブロック(512バイト)を大容量内蔵RAMに転送 4. ローダプログラムを大容量内蔵RAMに転送 5. 大容量内蔵RAM上に転送したローダプログラムのデータより チェックサム値を計算し、チェックサムブロックにある チェックサム値と比較 7. ローダプログラムのエントリポイントに分岐 6. MMCHIの無効化 (端子解放、モジュールスタンバイ、MMCHIレジスタ初期化) 12. アプリケーションプログラムに分岐 10. アプリケーションプログラムが 格納されている パーティションを選択 9. eMMCデバイスとの初期化処理 8. MMCHIの有効化 (端子設定、モジュールスタンバイ解除、MMCHIレジスタ設定) eMMCデバイスは、Boot Operation時 EXT_CSDレジスタの[179]フィールド (PARTITION_CONFIG)で指定されている Boot Partitionの0セクタから順にデータを出力します。 (サンプルコードでは、ローダプログラムを Boot Partition 1に格納しています。) 図1.1 eMMC ブートの動作イメージ
eMMC ブートの動作イメージについて説明します。ローダプログラムの格納仕様については、「6.1.3 ロー ダプログラムの格納フォーマット」を参照してください。
1. リセット解除後、ブート起動用内蔵 ROM プログラムを実行します。
2. ブート起動用内蔵 ROM プログラムにより、MMCHI にアクセスするために周辺モジュール設定処理(端 子設定、MMCHI のモジュールスタンバイモード解除、MMCHI レジスタ設定)を行います。
3. Boot Operation により、eMMC デバイスの Extended CSD(EXT_CSD)レジスタの[179]フィールド (PARTITION_CONFIG)で選択されているパーティションのセクタ 0 に格納されているローダプログラ ム#0 用チェックサムブロック(512 バイト)を大容量内蔵 RAM に転送します。
4. Boot Operation により、eMMC デバイスの Extended CSD(EXT_CSD)レジスタの[179]フィールド (PARTITION_CONFIG)で指定したパーティションのセクタ 1~56 に格納されているローダプログラム #0(28K バイト)を大容量内蔵 RAM(H'2002_4000~H'2002_AFFF)に転送します。 5. 大容量内蔵 RAM 上に転送したローダプログラム#0 のデータからチェックサム値を計算し、ローダプログ ラム#0 用チェックサムブロックにあるチェックサム値の比較を行います。 6. ブート起動用内蔵 ROM プログラムで使用した MMCHI にアクセスするための端子および周辺モジュール 設定処理(MMCHI、PORT、STB)を初期状態に戻します。 7. ローダプログラムのエントリポイント(H'2002_4000)に分岐し、ローダプログラムを実行します。 8. ローダプログラムにより、MMCHI にアクセスするための端子設定および周辺モジュール設定処理(端子 設定、MMCHI のモジュールスタンバイモード解除、MMCHI レジスタ設定)を行います。 9. eMMC デバイスとの初期化処理を実行します。 10. eMMC デバイスに CMD6(SWITCH)を発行して、アプリケーションプログラムが格納されているパーティ ション(サンプルコードでは、Boot Partition 2)を選択します。 11. eMMC デバイスに格納されているアプリケーションプログラムを大容量内蔵 RAM に転送します。 12. アプリケーションプログラムのエントリポイントに分岐し、アプリケーションプログラムを実行します。 【注】 ローダプログラムの仕様の詳細については、「6.1 ローダプログラムの詳細仕様」の内容を参照して ください。
1.2
使用する周辺機能
サンプルコードのアプリケーションプログラムでは、クロックパルス発振器、割り込みコントローラ、バ スステートコントローラ、汎用入出力ポート、メモリ管理ユニット、1 次キャッシュ(L1 キャッシュ)、お よび 2 次キャッシュ(L2 キャッシュ)の初期設定を行います。 本アプリケーションノートでは、クロックパルス発振器を CPG、FIFO 内蔵シリアルコミュニケーションイ ンタフェースを SCIF、汎用入出力ポートを PORT、低消費電力モードを STB とします。 表 1.1に使用する周辺機能と用途を、図 1.2にサンプルコード実行時の動作環境を示します。 表1.1 使用する周辺機能と用途 周辺機能 用途 MMC ホストインタフェース(MMCHI) eMMC デバイスのアクセス制御に使用 クロックパルス発振器(CPG) RZ/A1Hの動作周波数の生成 FIFO 内蔵シリアルコミュニケーション インタフェース(SCIF) SCIF チャネル 2 を用いて、ホスト PC との通信用として使用 汎用入出力ポート(PORT) MMCHI、SCIF チャネル 2 の兼用端子の切り替えに使用 低消費電力モード(STB) RZ/A1Hの周辺 IO のモジュールスタンバイを解除するために 使用、保持用内蔵 RAM をライト許可するために使用 図1.2 動作環境2. 動作確認条件
本アプリケーションノートのサンプルコードは、下記の条件で動作を確認しています。 表2.1 動作確認条件 項目 内容 使用マイコン RZ/A1H 動作周波数(注 1) CPU クロック(Iφ):400MHz 画像処理クロック(Gφ):266.67MHz 内部バスクロック(Bφ):133.33MHz 周辺クロック(P1φ):66.67MHz 周辺クロック(P0φ):33.33MHz 動作電圧 電源電圧(I/O):3.3V 電源電圧(内部):1.18V 統合開発環境 ARM®統合開発環境ARM Development Studio 5(DS-5TM)Version 5.16
C コンパイラ ARM C/C++ Compiler/Linker/Assembler Ver.5.03 [Build 102] コンパイラオプション
-O3 -Ospace --cpu=Cortex-A9 --littleend --arm --apcs=/interwork --no_unaligned_access --fpu=vfpv3_fp16 -g --asm
動作モード ブートモード 5 (eMMC ブート) 使用ボード GENMAI ボード R7S72100 CPU ボード RTK772100BC00000BR ターミナルソフトの通信設定 • 通信速度:115200bps • データ長:8 ビット • パリティ:なし • ストップビット長:1 ビット • フロー制御:なし 使用デバイス (ボード上で使用する機能) • シリアルインタフェース(Dsub-9 コネクタ) • LED1 • eMMC デバイス(MMC スロット(J15)に接続)(注 2) 【注】 1. クロックモード 0(EXTAL 端子からの 13.33MHz のクロック入力)で使用時の動作周波数です。 2. eMMC デバイスはお客様側で準備してください。
3. 関連アプリケーションノート
本アプリケーションノートに関連するアプリケーションノートを以下に示します。 • RZ/A1H グループ レジスタ定義ヘッダ・ファイル iodefine.h(R01AN1860JJ) • RZ/A1H グループ 初期設定例(R01AN1864JJ)• RZ/A1H グループ ARM® Development Studio 5(DS-5TM)のセミホスティング機能を使用した MMC コン
4. ハードウェア説明
4.1
ハードウェア構成例
図 4.1にブートモード 5 にてeMMC ブートする場合の接続例を示します。なお、eMMC ブート機能を使用す る場合は、P3_10~P3_15 の端子を使用してください。P3_10~P3_15 の端子でのみ、eMMC ブート機能を使 用することができます。 RZ/A1H MD_BOOT0 MD_BOOT1 MD_BOOT2 P3_8/MMC_CD P3_11/MMC_D0 MMCスロット MMC電源IC VDD DAT0 P3_10/MMC_D1 P3_15/MMC_D2 P3_14/MMC_D3 DAT1 DAT2 DAT3 ENB OUT CD P3_13/MMC_CMD P3_12/MMC_CLK CMD CLK COMMON 図4.1 eMMC ブートする場合の接続例4.2
使用端子一覧
表 4.1に使用端子と機能を示します。 表4.1 使用端子と機能 端子名 入出力 内容 MD_BOOT2 MD_BOOT1 MD_BOOT0 入力 ブートモードの選択 MD_BOOT2:"H"、MD_BOOT1:"H"、MD_BOOT0:"H" (ブートモード 5(eMMC ブート)に設定) MMC_CLK 出力 MMC クロック MMC_CMD 入出力 コマンド出力/レスポンス MMC_D0 入出力 送信データ[bit0]/受信データ[bit0] MMC_D1 入出力 送信データ[bit1]/受信データ[bit1] MMC_D2 入出力 送信データ[bit2]/受信データ[bit2] MMC_D3 入出力 送信データ[bit3]/受信データ[bit3] MMC_CD(注) 入力 カード検出 【注】 本アプリケーションノートでは使用していません。5. ソフトウェア説明
5.1
eMMC ブート動作の概要
この章では、eMMC ブート動作の概要について説明します。5.1.1
eMMC ブート動作に関する用語
表 5.1に本アプリケーションノートで説明する eMMC ブート動作に関する用語を示します。 表5.1 eMMC ブート動作に関する用語 用語 説明ブート起動用内蔵 ROM プログラム ブート起動用内蔵 ROM プログラムは、ブートモード 5(eMMC ブー ト)で起動した場合に、eMMC デバイスに格納されているローダプ ログラムを大容量内蔵 RAM に転送し、ローダプログラムのエントリ ポイントに分岐する処理を行うプログラムです。CPU 内のブート起 動用内蔵 ROM に格納されているため作成する必要はありません。 ローダプログラム ローダプログラムは、アプリケーションプログラムを eMMC デバイ スから大容量内蔵 RAM に転送し、アプリケーションプログラムのエ ントリポイントに分岐する処理を行うプログラムです。ローダプログ ラムのプログラムサイズは 28K バイトに収まるように作成してくだ さい。本アプリケーションノートを参考に、お客様がシステムに応じ て作成してください。 アプリケーションプログラム アプリケーションプログラムは、お客様がシステムに応じて作成する プログラムです。本アプリケーションノートを参考に、お客様がシス テムに応じて作成してください。 ダウンロードテーブル アプリケーションプログラムが eMMC デバイス内のどのセクタに格 納されているかを示す情報です。本情報はアプリケーションプログラ ムの定数データとして組み込まれます。 ダウンロードテーブル情報 ダウンロードテーブルが eMMC デバイス内のどのセクタに格納され ているかを示す情報です。本情報はローダプログラムに定数データと して組み込まれます。
5.2
eMMC ブート動作の説明
表 5.2にeMMC ブートするための外部端子(MD_BOOT2~0)の設定を示します。 表5.2 eMMC ブートするための外部端子(MD_BOOT2~0)の設定
MD_BOOT2 MD_BOOT1 MD_BOOT0 ブートモード 説明
1 1 1 ブートモード 5 (eMMC ブート) MMCHI に接続された eMMC デバイス からブートします。
5.2.1
サンプルコード全体の動作
サンプルコードは、ローダプログラムとアプリケーションプログラムから構成されています。 1 ローダプログラム ローダプログラムは、eMMC デバイスとの初期化を行い、アプリケーションプログラムを大容量内蔵 RAM に転送します。アプリケーションプログラムの転送完了後、アプリケーションプログラムのエントリポイ ントに分岐します。 2 アプリケーションプログラム(ユーザプログラム) アプリケーションプログラムは、お客様がシステムに応じて作成するプログラムです。アプリケーション プログラム(サイズは任意)は任意のアドレスに配置可能ですが、CPU が実行可能な RAM 領域に配置す る必要があります。サンプルコードでは、アプリケーションプログラムを大容量内蔵 RAM の H'2002_B000 番地以降に配置しています。 図 5.1に本アプリケーションノートのサンプルコードの動作概要を示します。 アプリケーションプログラム (ユーザプログラム) ブート起動用内蔵ROM プログラム H'2002_4000 H'2002_B000 H'FFFF_0000 大容量内蔵RAM上で動作 ・MMCドライバの初期化 ・eMMCデバイスとの初期化処理 ・アプリケーションプログラムを大容量内蔵RAMへ転送 ・MMCドライバの終了 ・アプリケーションプログラムのエントリポイント(H'2002_B000)へ分岐 内蔵ROM上で動作 ・MMCHIの端子処理とモジュールスタンバイ解除 ・Boot operationにより、ローダプログラム本体(28Kバイト)のデータを 読み出して大容量内蔵RAMへ転送 ・ローダプログラムのエントリポイント(H'2002_4000)へ分岐 ローダプログラム(28Kバイト) 大容量内蔵RAM上で動作 ・MMUの初期化とキャッシュの有効化 MMUおよびキャッシュを非稼働に設定 キャッシュ、TLB、およびBTACの無効化 MMUの設定、キャッシュの有効化、分岐予測器の有効化 ・アプリケーションの内容に応じた処理 サンプルコード 図5.1 サンプルコードの動作概要5.2.2
ブート起動用内蔵 ROM プログラムの動作
eMMC ブートで起動した場合、パワーオンリセット解除後、ブート起動用内蔵 ROM プログラムにより MMCHI に接続されている eMMC デバイスからローダプログラムを大容量内蔵 RAM に転送します。転送完 了後、ローダプログラムのエントリポイントに分岐します。図 5.2にブート起動用内蔵 ROM プログラムの動 作イメージを示します。なお、ブート起動用内蔵 ROM プログラムは、ワーク領域として H'2002_0000~ H'2002_3FFF の領域を使用します。ローダプログラムのデータ転送時は、MMC_CLK 周波数は P1φ/4(P1φ の最大動作周波数は 66.67MHz)、データバス幅 4 ビットに設定しています。 ブート起動用 内蔵ROMプログラム MMCHI 1. ブート起動用ROMプログラム実行 大容量内蔵RAM ローダプログラム(28KB) H'2002_4000 H'2002_AFFF 5. ローダプログラム(28Kバイト)からチェックサム値を計算し チェックサムブロックと比較する。 7. ローダプログラムのエントリポイント (H'2002_4000)に分岐 MMCコントローラ内蔵NANDフラッシュメモリ (eMMCデバイス) H'2000_0000 セクタ57 ローダプログラム#0(28KB) ・ ・ ・ セクタ0 ローダプログラム#0用 チェックサムブロック(512バイト) セクタ1 ローダプログラム#1用 チェックサムブロック(512バイト) ローダプログラム#1(28KB) (予備領域) ローダプログラム#3用 チェックサムブロック(512バイト) ローダプログラム#3(28KB) (予備領域) ブート起動用内蔵ROMプログラムの ワーク領域(16KB) H'2002_3FFF H'2002_0000 H'FFFF_0000 H'FFFF_FFFF セクタ227 セクタ172 セクタ171 セクタ56 セクタ58 セクタ113 2. MMCHIを使用するために 周辺モジュール(MMCHI、PORT、STB)のレジスタを設定 6. 周辺モジュール(MMCHI、PORT、STB)の レジスタを初期状態に戻す。 4.ローダプログラム(28Kバイト)を大容量内蔵RAMに転送 3.チェックサムブロック(512バイト)を大容量内蔵RAMに転送 図5.2 ブート起動用内蔵 ROM プログラムの動作イメージ 1. リセット解除後、ブート起動用内蔵 ROM プログラムを実行します。
2. ブート起動用内蔵 ROM プログラムにより、MMCHI にアクセスするために周辺モジュール(MMCHI、PORT、 STB)のレジスタ設定を行います。
3. Boot Operation により、Extended CSD(EXT_CSD)レジスタの[179]フィールド(PARTITION_CONFIG) で選択されているパーティションのセクタ 0 に格納されているローダプログラム#0 用チェックサムブ ロック(512 バイト)を大容量内蔵 RAM のワーク領域に転送します。
4. Boot Operation により、Extended CSD(EXT_CSD)レジスタの[179]フィールド(PARTITION_CONFIG) で指定したパーティションのセクタ 1~56 に格納されているローダプログラム#0(28K バイト)を eMMC デバイスから大容量内蔵 RAM の H'2002_4000~H'2002_AFFF に転送します。 5. 大容量内蔵 RAM に転送したローダプログラム#0 からチェックサムを計算し、3.で読み出したローダプロ グラム#0 用チェックサムブロックのデータを比較し、4.で読み出したローダプログラムのデータが正しい か検証します。不一致の場合は、予備として格納しているローダプログラム#1 から順に同様の処理を行い ます。ローダプログラム#0~#3 の読み出しに失敗した場合は、内蔵 ROM 内で無限ループとなりブート処 理を終了します。 6. MMCHI を使用するために設定した周辺モジュール(MMCHI、PORT、STB)のレジスタを初期化します。 7. ローダプログラムのエントリポイント(H'2002_4000)に分岐します。
5.2.3
ローダプログラムの動作
ローダプログラムは、eMMC デバイスとの初期化処理完了後、ダウンロードテーブル情報を参照してダウ ンロードテーブルが格納されているパーティション番号、セクタ番号を取得し、eMMC デバイスに格納され ているダウンロードテーブルを大容量内蔵 RAM 上のワーク領域に転送します。ローダプログラムは、ワー ク領域に転送したダウンロードテーブル参照をして、アプリケーションプログラムが格納されている eMMC デバイスのパーティション番号、セクタ番号およびアプリケーションプログラムの転送先とサイズを取得し、 アプリケーションプログラムを大容量内蔵 RAM に転送します。なお、サンプルコードでは、ダウンロード テーブルおよびアプリケーションプログラムのデータ転送時に、MMC_CLK 周波数は P1φ/2(接続デバイス が High-Speed に対応している場合)または P1φ/4(接続デバイスが High-Speed に対応していない場合)に設 定します(P1φの最大動作周波数は 66.67MHz)。データバス幅は、4 ビットに設定しています。アプリケー ションプログラムの転送完了後、アプリケーションプログラムのエントリポイントに分岐してアプリケー ションプログラムの処理を実行します。図 5.3にローダプログラムの動作イメージを示します。 MMCHI 大容量内蔵RAM ローダプログラム(28KB) H'2002_4000 H'2000_0000 アプリケーションプログラム (サイズ:任意) H'2002_B000 H'2008_0000 MMCコントローラ内蔵NANDフラッシュメモリ (eMMCデバイス) アプリケーションプログラム (サイズ:任意) ローダプログラムの ワーク領域 7. アプリケーションプログラムの エントリポイントに分岐 H'2002_AFFF H'200A_FFFF 1. ローダプログラム実行 2. MMCHIを使用するために 周辺モジュール(MMCHI、PORT、 STB)のレジスタ設定 ダウンロードテーブル情報 ダウンロードテーブル(512バイト) ダウンロードテーブル(512バイト) 3. eMMCとの初期化処理 4. ダウンロードテーブル情報を参照し、 ダウンロードテーブルのパーティション番号、 セクタ番号を取得。 CMD6(SWITCH)を発行し、ダウンロード テーブルが格納されているパーティションを選択 5. ダウンロードテーブルをローダプログラムの ワーク領域に転送 6. ダウンロードテーブルを参照し、 アプリケーションプログラムを 大容量内蔵RAMに転送 図5.3 ローダプログラムの動作イメージ 1. ブート起動用内蔵 ROM プログラムから分岐後、ローダプログラムを実行します。 2. ローダプログラムにより、MMCHI アクセスするために周辺モジュール(MMCHI、PORT、STB)のレジ スタ設定を行います。 3. eMMC デバイスとの初期化処理を行います。 4. ダウンロードテーブル情報を参照し、ダウンロードテーブルのパーティション番号、セクタ番号を取得し ます。eMMC デバイスに CMD6(SWITCH)を発行して、ダウンロードテーブルが格納されているパーティ ションを選択します。 5. eMMC デバイスに対してリードコマンドを発行し、ダウンロードテーブル(512 バイト)を大容量内蔵 RAM 上にあるワーク領域に転送します。 6. ダウンロードテーブルに格納されているアプリケーションプログラムの転送情報(パーティション番号、 セクタ番号、転送先アドレス、プログラムサイズ)を取得し、eMMC デバイスに対して、CMD6(SWITCH) を発行してアプリケーションプログラムが格納されているパーティションを選択後、リードコマンドを発 行し、アプリケーションプログラムを大容量内蔵 RAM に転送します。 7. アプリケーションプログラムのエントリポイント(サンプルコードでは H'2002_B000)に分岐し、アプリ ケーションプログラムを実行します。5.2.4
アプリケーションプログラム(ユーザプログラム)の動作
アプリケーションプログラムでは、スタックポインタ、MMU の設定を行い、ARM 統合開発環境 DS-5 の コンパイラツールチェーンにより提供される C 標準ライブラリ関数__main に分岐します。 __main 関数では、スキャッタローディング機能を使用したセクション領域の初期化、ライブラリ関数の初 期化が行われ、ハードウェアの初期設定を行うための$Sub$$main 関数に分岐します。 サンプルコードでは、$Sub$$main 関数にて、STB、BSC、INTC、PORT などの周辺機能の初期設定と、L1 キャッシュおよび L2 キャッシュを有効にするための設定を行い、IRQ 割り込みおよび FIQ 割り込みを許可に しています。$Super$$main 関数をコールすることで、main 関数に分岐します(サンプルコードでは、MMU の設定およびキャッシュを有効にするための設定はアプリケーションプログラムで行い、ローダプログラム では行っていません)。 main 関数では、シリアルインタフェースで接続されたホスト PC 上のターミナルに文字列を出力し、OSTM チャネル 0 をインターバルタイマモードに設定して、タイマを起動します。500ms の周期で OSTM チャネル 0 の割り込みを発生させ、GENMAI ボードの LED を割り込み処理により 500ms ごとに点灯および消灯を繰り 返す処理を行います。 アプリケーションプログラムで実施している初期設定の詳細は、「RZ/A1H グループ 初期設定例 (R01AN1864JJ)」のアプリケーションノートを参照してください。5.3
サンプルコード実行時の周辺機能の設定およびメモリ配置
5.3.1
周辺機能の設定
表 5.3にサンプルコード実行時の周辺機能の設定内容を示します。 表5.3 周辺機能の設定内容 モジュール 設定内容 CPG CPU クロック(Iφ):400MHz 画像処理クロック(Gφ):266.67MHz 内部バスクロック(Bφ):133.33MHz 周辺クロック(P1φ):66.67MHz 周辺クロック(P0φ):33.33MHz MMCHI eMMC デバイスのアクセス制御に使用 PORT PORT4、PORT3 のマルチプレクス端子機能を設定 ・P3_13:MMC_CMD ・P3_12:MMC_CLK ・P3_14:MMC_D3 ・P3_15:MMC_D2 ・P3_10:MMC_D1 ・P3_11:MMC_D0 ・P4_10:LED の点灯および消灯 ・P3_2:RxD2、P3_0:TxD2 STB 保持用内蔵 RAM へのライト許可および周辺機能へのクロック供給 STBCR2~STBCR13 でクロックの供給および停止制御が可能なすべて の周辺機能のクロックを供給 SCIF チャネル 2 を調歩同期式モードに設定 ・データ長:8 ビット ・ストップビット長:1 ビット ・パリティ:なし P1φ=66.67MHz の時に、クロックソースを分周なし、ビットレート値 に 17 を設定し、ビットレートが 115200bps となるように設定 誤差は 0.46%5.3.2
サンプルコードのセクション配置
表 5.4にローダプログラムで使用するセクションを、表 5.5および表 5.6にアプリケーションプログラムで使 用するセクションを示します。 表5.4 ローダプログラムで使用するセクション 領域の名前 内容 タイプ ロード領域 / 実行領域 BOOT_AREA 例外処理ベクタテーブル リセットハンドラ処理のプログラムコード 領域 Code LRAM CONST_DLTBL_INFO ダウンロードテーブル情報の 定数データ領域 RO Data LRAM CODE デフォルトのプログラムコード領域 C ソースでセクション名を定義しない Code タイプのセクションは、すべてこの領域に配 置されます Code LRAMCODE_MMCHI MMC ドライバ用のコード領域 Code LRAM
CONST_MMCHI MMC ドライバ用の定数データ領域 RO Data LRAM
CONST デフォルトの定数データ領域
C ソースでセクション名を定義しない RO Data タイプのセクションは、すべてこの領 域に配置されます
RO Data LRAM
DATA_MMCHI MMC ドライバ用の初期値ありデータ領域 RW Data LRAM
DATA デフォルトの初期値ありデータ領域
C ソースでセクション名を定義しない RW Data タイプのセクションは、すべてこの領 域に配置されます
RW Data LRAM
SVC_STACK スタック領域 ZI Data LRAM
BSS_MMCHI MMC ドライバ用の初期値なしデータ領域 ZI Data LRAM
BSS デフォルトの初期値なしデータ領域 C ソースでセクション名を定義しない ZI Data タイプのセクションは、すべてこの領 域に配置されます ZI Data LRAM 【注】 表中のロード領域および実行領域において、LRAM は大容量内蔵 RAM の領域を表します。
表5.5 アプリケーションプログラムで使用するセクション(1/2)
領域の名前 内容 タイプ ロード領域 / 実行領域
VECTOR_TABLE 例外処理ベクタテーブル Code LRAM
RESET_HANDLER リセットハンドラ処理のプログラムコー ド領域 この領域は以下のセクションから構成さ れています ・INITCA9CACHE(L1 キャッシュ設定) ・INIT_TTB(MMU 設定) ・RESET_HANDLER(リセットハンドラ) Code LRAM CODE_BASIC_SETUP 保持用内蔵 RAM のライト許可のためのプ ログラムコード領域 Code LRAM InRoot この領域は C 標準ライブラリなどのルー ト領域に配置するセクションから構成さ れています Code および RO Data LRAM CODE_FPU_INIT NEON および VFP 初期設定のプログラム コード領域 この領域は以下のセクションから構成さ れています ・CODE_FPU_INIT ・FPU_INIT Code LRAM CODE_RESET ハードウェア初期設定のプログラムコー ド領域 この領域は以下のセクションから構成さ れています ・CODE_RESET(スタートアップ処理) ・INIT_VBAR(ベクタベース設定) Code LRAM CODE デフォルトのプログラムコード領域 C ソースでセクション名を定義しない Code タイプのセクションは、すべてこの 領域に配置されます Code LRAM CONST デフォルトの定数データ領域 C ソースでセクション名を定義しない RO Data タイプのセクションは、すべてこの 領域に配置されます RO Data LRAM
表5.6 アプリケーションプログラムで使用するセクション(2/2) 領域の名前 内容 タイプ ロード領域 / 実行領域 VECTOR_MIRROR_ TABLE 例外処理ベクタテーブル (大容量内蔵 RAM に転送して実行するた めのセクション) Code LRAM CODE_HANDLER_ JMPTBL IRQ 割り込みハンドラのユーザ定義関数 のプログラムコード領域 Code LRAM CODE_HANDLER IRQ 割り込みハンドラのプログラムコー ド領域 この領域は以下のセクションから構成さ れています ・CODE_HANDLER ・IRQ_FIQ_HANDLER Code LRAM CODE_IO_REGRW IO レジスタのリード/ライト関数のプログ ラムコード領域 Code LRAM CODE_CACHE_ OPERATION L1 および L2 キャッシュ設定処理のプログ ラムコード領域(注 3) Code LRAM DATA_HANDLER_ JMPTBL IRQ 割り込みハンドラのユーザ定義関数 の登録テーブルデータ領域 RW Data LRAM ARM_LIB_STACK アプリケーションスタック領域 ZI Data LRAM
IRQ_STACK IRQ モードのスタック領域 ZI Data LRAM
FIQ_STACK FIQ モードのスタック領域 ZI Data LRAM
SVC_STACK スーパバイザ(SVC)モードのスタック領
域
ZI Data LRAM ABT_STACK アボート(ABT)モードのスタック領域 ZI Data LRAM
TTB MMU 変換テーブル領域 ZI Data LRAM
ARM_LIB_HEAP アプリケーションヒープ領域 ZI Data LRAM
DATA デフォルトの初期値ありデータ領域 C ソースでセクション名を定義しない RW Data タイプのセクションは、すべてこの 領域に配置されます RW Data LRAM BSS デフォルトの初期値なしデータ領域 C ソースでセクション名を定義しない ZI Data タイプのセクションは、すべてこの 領域に配置されます ZI Data LRAM 【注】 1. 表中のロード領域および実行領域において、LRAM は大容量内蔵 RAM の領域を表します。 2. セクションの名前は基本的に領域と同じ名前にしていますが、RESET_HANDLER、InRoot、 CODE_FPU_INIT、CODE_RESET、CODE、CONST、CODE_HANDLER、DATA、BSS の各領域 は複数のセクションから構成されています。領域とセクションについては、ARM コンパイラツー ルチェーンのマニュアルを参照してください。 3. このセクションは、キャッシュ無効領域に配置する必要があります。
5.4
関数一覧
サンプルコードで使用する関数について、表 5.7にサンプル関数一覧、表 5.8にサンプルコードで使用する MMC ドライバ関数一覧を示します。MMC ドライバ関数の詳細仕様については、MMC ドライバのユーザー ズマニュアルをご参照ください。 表5.7 サンプル関数一覧 関数名 概要 ld_main ローダプログラムの main 関数 open_emmc eMMC デバイスのオープン app_prog_transfer アプリケーションプログラムの転送 close_emmc eMMC デバイスのクローズ set_mmc_partition_access パーティションの選択 apl_top_jmp アプリケーションプログラムのエントリポイントへの分岐 表5.8 サンプルコードで使用する MMC ドライバ関数一覧 関数名 概要 ce_init ドライバの初期化 ce_cd_int カード挿抜割り込み設定 ce_set_buffer バッファ領域の設定 ce_set_config 入力クロックと分周比の設定 ce_set_timeout タイムアウトの設定 ce_mount カードのマウント ce_csd_get_register カードレジスタ(EXT_CSD)の取得 ce_csd_set_register カードレジスタ(EXT_CSD)の設定 (SET_EXT_CSD コマンド(CMD6)発行) ce_read_sect セクタのリード ce_unmount カードのマウント解除 ce_finalize ドライバの終了5.5
関数仕様
サンプルコードの関数仕様を示します。 ld_main 概 要 ローダプログラムの main 関数 宣 言 void ld_main(void) 説 明 eMMC ブートのローダプログラム処理を行います。 eMMC デバイスに格納されているアプリケーションプログラムデータを大容量内蔵 RAM に転送後、アプリケーションプログラムのエントリポイントに分岐します。 引 数 なし リターン値 なし open_emmc 概 要 eMMC デバイスのオープン宣 言 int32_t open_emmc (void)
説 明 MMC ドライバを初期化し、eMMC デバイスとの初期化処理を行います。本関数では、
MMC ドライバ関数である ce_init 関数、ce_cd_int 関数、ce_set_buffer 関数、 ce_set_config 関数、ce_set_timeout 関数、ce_mount 関数をコールします。
引 数 なし リターン値 0 : 正常終了 -1 : エラー終了 app_prog_transfer 概 要 アプリケーションプログラムの転送 宣 言 int32_t app_prog_transfer(EMMC_DL_TABLE *dltbl) 説 明 引数で指定したダウンロードテーブルを参照して、eMMC デバイスに格納されてい るアプリケーションプログラムを大容量内蔵 RAM へ転送します。本関数では、MMC ドライバ関数である ce_csd_set_register 関数、ce_csd_get_register 関数、 ce_read_sect 関数をコールします。 引 数 なし リターン値 0 : 正常終了 -1 以下: エラー終了 close_emmc 概 要 eMMC デバイスのクローズ
宣 言 int32_t close_emmc (uint32_t partition)
説 明 引数 partition で指定したパーティションを選択後、MMC ドライバの処理を終了しま す。本関数では、MMC ドライバ関数である ce_csd_set_register 関数、
ce_csd_get_register 関数、ce_unmount 関数、ce_finalize 関数をコールします。
set_mmc_partition_access
概 要 パーティションの選択
宣 言 int32_t set_mmc_partition_access (uint32_t partition)
説 明 引数 partition で指定したパーティションを選択します。本関数では、MMC ドライバ 関数である ce_csd_set_register 関数、ce_csd_get_register 関数をコールします。 引 数 なし リターン値 0 : 正常終了 -1 以下: エラー終了 apl_top_jmp 概 要 アプリケーションプログラムのエントリポイントへの分岐
宣 言 void apl_top_jmp (uint32_t jump_address)
説 明 引数 jump_address で指定したアドレスに分岐します。 引 数 uint32_t
jump_address
アプリケーションプログラムのエントリポイント
6. eMMC ブートシステムの開発方法
eMMC ブートシステムは、ローダプログラム、アプリケーションプログラムで構成されています。この章 では、ローダプログラム、アプリケーションプログラムの開発方法について説明します。6.1
ローダプログラムの詳細仕様
ローダプログラムは、アプリケーションプログラムを eMMC デバイスから大容量内蔵 RAM に転送し、ア プリケーションプログラムのエントリポイントに分岐します。ここでは、ローダプログラムの詳細仕様を説 明します。6.1.1
ローダプログラムの生成方法
図 6.1にローダプログラムの生成フローを示します。ローダプログラムには、CPU 初期化処理および eMMC デバイスを使用したアプリケーションプログラムの読み出し処理を実装します。本アプリケーションノート のサンプルコードでは、eMMC デバイスからの読み出し処理に RZ/A1 用 MMC ドライバソフトウェアライブ ラリを使用しています。 eMMCデバイス アクセス処理 アセンブラ言語 エントリ/スタック設定Cコンパイラ
アセンブラ
オブジェクト モジュールリンカ
スキャッタファイル 実行形式ファイル スタック初期化処理・CPU初期化処理 ダウンロード情報 ファイル eMMCドライバ ライブラリ メモリ配置設定 (大容量内蔵RAMに実行) バイナリファイルfromelf
(イメージ変換ユーティリティ)
・RZ_A1H_emmc_boot_loader_armcc.bin 生成されたバイナリファイルをローダプログラムとして6.1.2
ローダプログラムのメモリマップ
図 6.2にローダプログラムのメモリ配置を示します。ローダプログラムは、ブート起動用内蔵 ROM プログ ラムにより、eMMC デバイスから大容量内蔵 RAM(H'2002_4000~H'2002_AFFF)に転送されるため、ロー ダプログラム生成時は実行アドレスが H'2002_4000~H'2002_AFFF となるように生成してください。なお、サ ンプルコードでは、大容量内蔵 RAM の H'2008_0000~H'200A_FFFF の領域をローダプログラムのワーク領域 に使用しています。 大容量内蔵RAM H'2002_4000 ローダプログラムの ワーク領域 H'2008_0000 H'2000_0000 MMCコントローラ内蔵NANDフラッシュメモリ (eMMCデバイス) セクタ57 ローダプログラム#0(28KB) ・ ・ ・ セクタ0 H'200A_FFFF H'2002_AFFF セクタ1 セクタ56 セクタ58 ローダプログラム#0用 チェックサムブロック(512バイト) ローダプログラム#0(28KB) ローダプログラム#1(28KB) ローダプログラム#1用 チェックサムブロック(512バイト) セクタ113 図6.2 ローダプログラムのメモリ配置6.1.3
ローダプログラムの格納フォーマット
図 6.3にローダプログラムの格納フォーマットを示します。ブート起動用内蔵 ROM プログラムは、最初に ローダプログラム#0 を大容量内蔵 RAM に転送した後チェックサム値を計算し、ローダプログラム#0 用 チェックサムブロック(512 バイト)にあるチェックサム値と比較します。チェックサム値が一致した場合 は、大容量内蔵 RAM に転送したローダプログラム#0 を使用してローダプログラムの処理を開始します。 チェックサムが不一致だった場合は、ローダプログラム#1 を大容量内蔵 RAM に読み出してチェックサム 値を計算し、ローダプログラム#1 用チェックサムブロックのチェックサム値と比較します。チェックサムが 一致した場合は、大容量内蔵 RAM 上に転送したローダプログラム#1 を使用してローダプログラムの処理を 開始します。不一致の場合は、ローダプログラム#2 のデータを読み出し、同様の処理を繰り返します。ロー ダプログラム#0~#3 の全てのチェックサムが不一致の場合は、内蔵 ROM の固定番地で無限ループとなり eMMC ブート処理を終了します。 ブート起動用内蔵 ROM プログラムでは上述の処理を行うため、eMMC ブート機能を使用する場合は、図 6.3に示すフォーマットに合わせて、eMMC デバイスにプログラムデータを格納してください。 セクタ0 セクタ57 ローダプログラム#0用 チェックサムブロック(512バイト) ローダプログラム#0(28Kバイト) ローダプログラム#1用 チェックサムブロック(512バイト) ローダプログラム#1(28Kバイト) (予備領域) MMCコントローラ内蔵NANDフラッシュメモリ (eMMCデバイス) ローダプログラム#2用 チェックサムブロック(512バイト) ローダプログラム#2(28Kバイト) (予備領域) ローダプログラム#3用 チェックサムブロック(512バイト) ローダプログラム#3(28Kバイト) (予備領域) セクタ227 セクタ172 セクタ171 セクタ170 セクタ115 セクタ114 セクタ113 セクタ58 セクタ57 セクタ56 セクタ1 1回目に読み出すローダプログラムデータ 1回目の読み出しに失敗した時に使用する ローダプログラム(予備) 2回目の読み出しに失敗した時に使用する ローダプログラム(予備) 3回目の読み出しに失敗した時に使用する ローダプログラム(予備) ※ローダプログラムは、EXT_CSDレジスタの[179]フィールドで指定した ブートパーティションに格納してください。また、チェックサムブロック(512 バイト)には、ローダプログラムを構成するセクタ毎に計算したチェッ クサムと反転チェックサムを格納し、最後の 4 バイトにシグネチャ(H'0000_55aa)を格納してください。図 6.4にローダプログラム用チェックサムブロックの格納フォーマットを示します。 セクタ0 セクタ1 セクタ2 セクタ3 セクタ56 ローダプログラムを512バイト単位 56ブロックに分割し、各ブロックの チェックサムを格納 ローダプログラムを512バイト単位 56ブロックに分割し、各ブロックの 反転チェックサムを格納 シグネチャ チェックサムブロック(512バイト) ローダプログラム(セクタ1) ローダプログラム(セクタ2) ローダプログラム(セクタ3) ・・・ ローダプログラム(セクタ56) ローダプログラム(セクタ1)のチェックサム値 H'0000 ローダプログラム(セクタ2)のチェックサム値 H'0004 ローダプログラム(セクタ3)のチェックサム値 H'0008 ・・・ ローダプログラム(セクタ56)のチェックサム値 H'00dc ローダプログラム(セクタ1)の反転チェックサム値 H'00e0 ローダプログラム(セクタ2)の反転チェックサム値 H'00e4 ローダプログラム(セクタ3)の反転チェックサム値 H'00e8 ・・・ ローダプログラム(セクタ56)の反転チェックサム値 H'01bc ALL 0 H'0000_55aa H'01fc MMCコントローラ内蔵NANDフラッシュメモリ (eMMCデバイス) 図6.4 ローダプログラム用チェックサムブロックの格納フォーマット 各セクタのチェックサム値は、ローダプログラムの 1 セクタ分のデータを 2 バイト単位で読み出し(読み 出したデータは符号なし 2 バイト変数として扱う)、符号なし 4 バイト変数に加算して計算してください。 また、反転チェックサム値には、チェックサム値をビット反転した値を格納してください。図 6.5にローダプ ログラム用チェックサム値の計算例を示します。 uint32_t loop; uint16_t *ptr; uint32_t checksum ; checksum = 0; ptr = (uint16_t *)sector_buf;
for( loop = 0; loop < (512 / 2); loop++ ) { checksum += *ptr; ptr++; } ← ローダプログラムの1セクタ分のデータが格納 されているバッファsector_bufのアドレスをポインタ変数ptrに設定 ← 計算したチェックサム値を格納するのは 符号なし4バイト変数 ← ローダプログラムのデータを 2バイト単位でアクセスするためのポインタ変数 ← 1セクタ(512バイト)分の全データに対して 2バイト単位で読み出して、 符号なし4バイト変数checksumに加算する 図6.5 ローダプログラム用チェックサム値の計算例
6.1.4
ローダプログラムの動作フロー
図 6.6にローダプログラムの動作フローを示します。 開始 CP15 システム制御レジスタの設定 周波数制御レジスタ(FRQCR)変更 スタックポインタの設定 ・スーパバイザモードのスタックポインタを設定 ・エントリポイントであるH'2002_4000番地からローダプログラムの処理を開始 ・Iキャッシュを無効に設定 ・Dキャッシュを無効に設定 ・MMUを無効に設定 ・例外ベクタテーブルのベースアドレスをローベクタ(H'0000_0000)に変更 ベクタベースアドレスレジスタ(VBAR)によって、ベースアドレスを指定できる ようにします。ローダプログラムでは、ローダプログラム実行中に例外が発生した場合に プログラムが暴走しないように仮のベクタテーブルのアドレスをVBARに設定しています。 (アプリケーションプログラム側で最終的に使用するベクタテーブルのアドレスを VBARに設定しています。) ・EXTALから 13.33[MHz]が入力される前提で下記のクロック設定を行います。 Iφ = 400[MHz]、Gφ = 266.67MHz]、Bφ = 133.33[MHz]、P1φ = 66.67[MHz] P0φ = 33.33[MHz]、CKIO = 66.67[MHz] eMMCデバイスのオープン open_emmc() ダウンロードテーブル情報の取得 ・MMCドライバを初期化し、接続されたeMMCデバイスとの 初期化処理を実行します。 本関数では、MMCドライバの関数である ce_init関数、ce_cd_int関数、ce_set_buffer関数、 ce_set_config関数、ce_set_timeout関数、ce_mount関数をコールします。 ・ダウンロードテーブルの格納位置(パーティション番号、セクタ番号)を保持している ダウンロードテーブル情報を取得する。 MMCドライバを使用した処理 注 ・大容量内蔵RAM上に展開されたアプリケーションプログラムの エントリポイント(H'2002_B000)に分岐後、アプリケーションプログラムの実行を開始します。 アプリケーションプログラムの エントリポイントに分岐 apl_top_jmp() eMMCデバイスのクローズ close_emmc() ・eMMCデバイスに格納されているアプリケーションプログラムの データを大容量内蔵RAMに転送します。 本関数では、MMCドライバ関数であるce_csd_get_register関数、 ce_csd_set_register関数、 ce_read_sect関数がコールします。 eMMCデバイスのパーティション選択 set_mmc_partition_access() eMMCデバイスから ダウンロードテーブルを読み出す read_emmc() eMMCデバイスから アプリケーションプログラムを 大容量内蔵RAMへ転送 app_prog_transfer() ・本関数では、MMCドライバの関数であるce_csd_get_register関数、 ce_csd_set_register関数、 ce_unmount関数、ce_finalize関数をコールし、終了処理を行います。 ・ダウンロードテーブルが格納されているパーティション番号(Boot Partition 2)を選択します。 ・ダウンロードテーブルを読み出し、アプリケーションプログラムのパーティション番号、セクタ番号、 転送先アドレス、プログラムサイズの情報を取得します。 本関数では、MMCドライバ関数であるce_read_sect関数がコールします。 図6.6 ローダプログラムの動作フロー6.1.5
アプリケーションプログラムの転送
ローダプログラムは、ダウンロードテーブル情報を参照してダウンロードテーブルが格納されているパー ティション番号、セクタ番号を取得した後、ダウンロードテーブルのデータを取得します。ダウンロードテー ブル内には、アプリケーションプログラムが格納されているパーティション番号、セクタ番号、転送先アド レス、プログラムサイズの情報が格納されています。ローダプログラムでは、このダウンロードテーブルを 参照して、eMMC デバイスに格納されているアプリケーションプログラムを大容量内蔵 RAM へ転送します。 図 6.7にアプリケーションプログラムの転送イメージを示します。 大容量内蔵RAM MMCコントローラ内蔵NANDフラッシュメモリ (eMMCデバイス) ローダプログラム(28Kバイト) ダウンロードテーブル情報 ダウンロードテーブル(512バイト) アプリケーションプログラム(1) 1. ダウンロードテーブルを取得 2. ダウンロードテーブルを参照し アプリケーションプログラムを 大容量内蔵RAMに転送 - パーティション番号 - セクタ番号 - 転送先アドレス - プログラムサイズ アプリケーションプログラム(2) アプリケーションプログラム(3) アプリケーションプログラム(1) アプリケーションプログラム(2) アプリケーションプログラム(3) VECTOR_TABLE VECTOR_MIRROR_TABLE CONST_DL_TABLE RZ_A1H_emmc_boot_loader_armcc.bin RESET_HANDLER アプリケーションプ ログラム用プロジェ クトにより生成され たバイナリファイル ローダプログラム用プロジェクトに より生成されたバイナリファイル 図6.7 アプリケーションプログラムの転送イメージ(1) ダウンロードテーブル情報のデータ構造
ダウンロードテーブル情報は、ダウンロードテーブルが格納されている eMMC デバイスのパーティション 番号やセクタ番号の情報を格納します。図 6.8にダウンロードテーブル情報のデータ構造、表 6.1にサンプル コードでのダウンロードテーブル情報の設定を示します。
typedef struct dltbl_info{
uint32_t dlt_partition; /* ダウンロードテーブルが格納されているパーティション番号 */
uint32_t dlt_sector; /* ダウンロードテーブルが格納されているセクタ番号 */
} DLTBL_INFO;
図6.8 ダウンロードテーブル情報のデータ構造 表6.1 サンプルコードでのダウンロードテーブル情報の設定 項目 値 説明 ダウンロードテーブルが格納されているパーティション番号 2 Boot partittion 2 ダウンロードテーブルが格納されているセクタ番号 228 セクタ 228 (2) ダウンロードテーブルのデータ構造 図 6.9にダウンロードテーブルのデータ構造を示します。ダウンロードテーブルは、アプリケーションプロ グラムが格納されているパーティション番号、セクタ番号、アプリケーションプログラムの転送先アドレス、 サイズの情報を格納します。サンプルコードでのダウンロードテーブルの設定内容については、「6.2.3 サ ンプルコードのダウンロードテーブルの設定内容」を参照してください。typedef struct dl_table {
uint32_t partition; /* アプリケーションプログラムが格納されているパーティション番号 */
uint32_t topsct; /* アプリケーションプログラムが格納されているセクタ番号 */
uint32_t *app_addr; /* アプリケーションプログラムの転送先アドレス */
uint32_t *prog_size; /* アプリケーションプログラムのサイズ */
} DL_TABLE;
図6.9 ダウンロードテーブルのデータ構造6.1.6
アプリケーションプログラムのエントリポイントへの分岐
ローダプログラムは、大容量内蔵 RAM にアプリケーションプログラムを転送後、アプリケーションプログ ラムのエントリポイント(サンプルコードでは H'2002_B000)に分岐します。6.2
アプリケーションプログラムの作成例
ここでは、eMMC ブートのアプリケーションプログラムの作成方法について説明します。6.2.1
アプリケーションプログラムの生成方法
図 6.10にアプリケーションプログラムの生成フローを示します。 ハードウェア 初期化処理 オンボード標準 入出力処理 アセンブラ言語 エントリ/スタック設定 Cコンパイラ アセンブラ オブジェクト モジュール 標準ライブラリ リンカ スキャッタファイル 実行形式ファイル メモリ配置設定 (大容量内蔵RAMに配置) ダウンロードテーブル ファイル アプリケーション 処理 バイナリファイル fromelf (イメージ変換ユーティリティ) ・CONST_DL_TABLE(ダウンロードテーブル) ・VECTOR_TABLE(アプリケーションプログラム(1)) ・VECTOR_MIRROR_TABLE(アプリケーションプログラム(2)) ・RESET_HANDLER(アプリケーションプログラム(3)) 生成された各バイナリファイルをアプリケーションプログラムとして eMMCデバイスに書き込みます。 RZ_A1H_emmc_boot_sample_armcc 図6.10 アプリケーションプログラムの生成フロー6.2.2
アプリケーションプログラムのメモリマップ
アプリケーションプログラムは、RAM 領域で実行させる必要があるため、サンプルコードではアプリケー ションプログラムを大容量内蔵 RAM に配置します。図 6.11にサンプルコードでのアプリケーションプログ ラムのメモリ配置を示します。 H'2002_4000 H'00A0_0000※ MMCコントローラ内蔵NANDフラッシュメモリ (eMMCデバイス) セクタ56 セクタ228 セクタ229 ローダプログラム(28KB) ダウンロードテーブル情報 ダウンロードテーブル ・ ・ ・ アプリケーションプログラム(1) セクタ0 H'2000_0000 H'2002_B000 ダウンロードテーブル 大容量内蔵 RAM 領域 H'2008_0000 アプリケーションプログラム用 ワーク領域 CPUアドレス空間 ローダプログラム用の チェックサムブロック(512バイト) セクタ1 ローダプログラム(28KB) ダウンロードテーブル情報 H'2002_AFFF H'2002_0000 H'2002_3FFF ブート起動用内蔵ROMプログラム用 ワーク領域 ※ダウンロードテーブルは、アプリケーションプログラム用プロジェクトで 生成しますが、アプリケーションプログラムでは参照せず、 ローダプログラムがeMMCデバイスから読み出し後 バイナリデータとして参照します。 アプリケーションプログラム用プロジェクトでは、ローダプログラムを 特定のアドレスに割り付ける必要が無いため、サンプルコードでは 使用しないアドレスに配置しています。 アプリケーションプログラム(2) セクタ230 アプリケーションプログラム(3) セクタ231 アプリケーションプログラム(1) アプリケーションプログラム(2) アプリケーションプログラム(3) 図6.11 サンプルコードでのアプリケーションプログラムのメモリ配置6.2.3
サンプルコードのダウンロードテーブルの設定内容
図 6.12にサンプルコードのダウンロードテーブルの内容を、表 6.2にサンプルコードでのダウンロードテー ブルの設定内容を示します。サンプルコードでは、アプリケーションプログラムが複数のバイナリファイル から構成されているため、図 6.12のように複数のバイナリファイルのデータが転送できるように設定してい ます。ローダプログラムでは、emmc_dl_table[0]、emmc_dl_table[1]、emmc_dl_table[2]、・・・の順にダ ウンロードテーブルを参照し、参照した順にアプリケーションプログラムを大容量内蔵RAM に転送します。 ローダプログラムでダウンロードテーブルの終端であることを判断するために、ダウンロードテーブルの最 後に終端コードを意味するEND_DL_TABLE を格納してください。ダウンロードテーブルのサイズは、512 バイトです。1 ブロック(1 個のバイナリファイル)の転送の管理情報として 16 バイト使用するため、終端 コード分を除くと、最大で31 回の転送の管理が可能です。 図6.12 サンプルコードのダウンロードテーブルの内容表6.2 サンプルコードでのダウンロードテーブルの設定内容 項目 設定値 補足 アプリケーションプログラム(1)が 格納されているパーティション 2 Boot partittion 2 アプリケーションプログラム(1)が 格納されている先頭セクタ番号 229 セクタ 229 アプリケーションプログラム(1)の ロード領域の先頭アドレス (注) &Load$$LR$$LOAD_MODULE1$$Base アプリケーションプログラム(1)の ロード領域のサイズ (注) &Load$$LR$$LOAD_MODULE1$$Length ビルド時に確定 アプリケーションプログラム(2)が 格納されているパーティション 2 Boot partittion 2 アプリケーションプログラム(2)が 格納されている先頭セクタ番号 230 セクタ 230 アプリケーションプログラム(2)の ロード領域の先頭アドレス (注) &Load$$LR$$LOAD_MODULE2$$Base アプリケーションプログラム(2)の ロード領域のサイズ (注) &Load$$LR$$LOAD_MODULE2$$Length ビルド時に確定 アプリケーションプログラム(3)が 格納されているパーティション 2 Boot partittion 2 アプリケーションプログラム(3)が 格納されている先頭セクタ番号 231 セクタ 231 アプリケーションプログラム(3)の ロード領域の先頭アドレス (注) &Load$$LR$$LOAD_MODULE3$$Base アプリケーションプログラム(3)の ロード領域のサイズ (注) &Load$$LR$$LOAD_MODULE3$$Length ビルド時に確定 アプリケーションプログラム(4)が 格納されているパーティション END_DL_TABLE ダウンロードテーブルの 終端コード アプリケーションプログラム(4)が 格納されている先頭セクタ番号 0 ダミーデータ アプリケーションプログラム(4)の ロード領域の先頭アドレス 0 ダミーデータ アプリケーションプログラム(4)の ロード領域のサイズ 0 ダミーデータ 【注】 アプリケーションプログラムの配置(スキャッタファイルの記述)に依存します。
7. サンプルコードの説明
7.1
サンプルコードの動作概要
リセット解除後、ブート起動用内蔵 ROM プログラム、ローダプログラム、アプリケーションプログラムの 順に実行し、アプリケーションプログラムにある main 関数にて、図 7.1のメッセージを表示します。図 7.1 の Ver.X.XX はサンプルコードのメイン処理のバージョンを示します。表 7.1にシリアル通信の設定を示しま す。RZ/A1H CPU Board eMMC Boot Sample Program. Ver.X.XX
Copyright (C) 2012 - 2016 Renesas Electronics Corporation. All rights reserved. 図7.1 サンプルコード起動時のターミナル表示 表7.1 シリアル通信の設定 項目 設定内容 ボーレート 115200bps データ長 8 ビット パリティ なし ストップビット 1 ビット フロー制御 なし
7.2
サンプルコードのプロジェクトの構成
表 7.2にサンプルコードのプロジェクトと生成されるバイナリファイル一覧を示します。 表7.2 サンプルコードのプロジェクトと生成されるバイナリファイル一覧 プロジェクト名 生成されるバイナリファイル名 備考 RZ_A1H_emmc_boot_loader_armcc ローダプログラム生成用 プロジェクトRZ_A1H_emmc_boot_loader_armcc.bin Boot partittion 1 セクタ番号:1~56 (予備領域のセクタ番 号は省略) RZ_A1H_emmc_boot_sample_armcc アプリケーションプログラム 生成用プロジェクト CONST_DL_TABLE (ダウンロードテーブル) Boot partittion 2 セクタ番号:228 VECTOR_TABLE (アプリケーションプログラム(1)) Boot partittion 2 セクタ番号:229 VECTOR_MIRROR_TABLE (アプリケーションプログラム(2)) Boot partittion 2 セクタ番号:230 RESET_HANDLER (アプリケーションプログラム(3)) Boot partittion 2 セクタ番号:231~
8. eMMC ブートに関する注意事項
8.1
eMMC ブート可能なデバイスについて
RZ/A1H のブート起動用内蔵 ROM プログラムは、eMMC ブート設定時、Boot Operation によりローダプロ グラムのデータを読み出します。eMMC ブートを使用する場合は、Boot Operation に対応した eMMC デバイ スを使用してください。
【注】ローダプログラム読み出し時に、eMMC デバイスに対して CMD17(READ_SINGLE_BLOCK)または CMD18(READ_MULTIPLE_BLOCK)を使用したアクセスは行いません。
8.2
Boot Operation について
図 8.1にBoot Operation によるローダプログラムの読み出しの動作を示します。RZ/A1H のブート起動用内蔵 ROM プログラムは、eMMC ブート設定時、データバス幅:4 ビットで動作するように MMCHI と PORT のレ ジスタを設定します。Boot Operation 時の eMMC デバイス側のデータバス幅は、eMMC デバイス側の Extended CSD レジスタの BOOT_BUS_WIDTH[177]フィールドの設定値により決まります。正常にブート動作できるよ うに、プログラム書き込み時に eMMC デバイスの Extended CSD に対して、表 8.1のように設定するようにし てください。 DAT[3:0] CMD CLK
S 010 E S 512bytes+ CRC E S 512bytes+ CRC E S 512bytes+ CRC E
Boot terminated
・RZ/A1Hは、Boot Operationによるアクセス時に、データハス幅は4ビットでeMMCデバイスにアクセスします。 eMMCデバイスのデータバス幅は、Extended CSDの[177]フィールド(BOOT_BUS_WIDTH[177])により 設定可能であるため、eMMCデバイスに対してローダプログラムを書き込む際に、4ビットバス幅となるように 設定してください。
・eMMCデバイスは、Boot Operation時、Extended CSDのPARTITION_CONFIG[179] で選択したパーティションのセクタ0より、 順次、データを出力します。 チェックサムブロック(512バイト) + ローダプログラム(28Kバイト)のデータ転送 セクタ0のデータ セクタ1のデータ セクタnのデータ Boot Ack 図8.1 Boot Operation によるローダプログラムの読み出しの動作 表8.1 Boot Operation 時のデータバス幅設定 eMMC デバイス Extended CSD のフィールド 設定内容 BOOT_BUS_WIDTH[177] Bit[1:0] BOOT_BUS_WIDTH:b’01
8.3
パーティションについて
eMMC デバイスには、複数のパーティションが存在します。ブートするパーティションについては、 Extended CSD(EXT_CSD)レジスタの PARTITION_CONFIG[179]により設定することが可能です。サンプル コードではローダプログラムを Boot Partition 1 に格納することを前提としているため、正常にブート動作で きるように、プログラム書き込み時に eMMC デバイスの Extended CSD(EXT_CSD)に対して表 8.2の設定を してください。 BOOT area Partition 1 H'0000_0000 BOOT area Partition 2 User area H'0000_0000 H'0000_0000
Maximum boot partition size
Maximum boot partition size
図8.2 eMMC デバイスのパーティション
表8.2 Boot Operation 時のブートパーティション設定 eMMC デバイス
Extended CSD のフィールド
設定内容
PARTITION_CONFIG[179] • Bit[6]の BOOT_ACK に b’1 を設定(BOOT Operation 時に eMMC が BOOT Acknowledge を出力する設定)
• Bit[5:3]の BOOT_PARTITION_ENABLE に b’001 を設定(BOOT Operation 時に Boot Partition1 の 0 セクタからデータを出力する設 定)
9. サンプルコードで使用する MMC ドライバについて
9.1
RZ/A1 MMC ドライバについて
ここでは、本アプリケーションノートのサンプルコードで使用している RZ/A1 MMC ドライバについて説 明します。9.1.1
MMC ドライバのバージョン情報
表 9.1にRZ/A1 MMC ドライバのバージョン情報を示します。 表9.1 RZ/A1 MMC ドライバのバージョン情報 項目 説明 名称 RZ/A1 MMC ドライバ Ver1.01 ドキュメント番号 R01UW0120JJ0101 RZ/A1 MMC ドライバの バージョン情報10. 参考ドキュメント
ユーザーズマニュアル:ハードウェア RZ/A1Hグループ ユーザーズマニュアル ハードウェア編 (最新版をルネサス エレクトロニクスホームページから入手してください。) R7S72100 RTK772100BC00000BR(GENMAI ボード)ユーザーズマニュアル (最新版をルネサス エレクトロニクスホームページから入手してください。) ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition Issue C (最新版を ARM ホームページから入手してください。)ARM Generic Interrupt Controller Architecture Specification Architecture version 1.0 (最新版を ARM ホームページから入手してください。)
ARM CortexTM-A9(Revision: r3p0)Technical Reference Manual (最新版を ARM ホームページから入手してください。)
ARM CoreLinkTM Level 2 Cache Controller L2C-310(Revision: r3p2)Technical Reference Manual (最新版を ARM ホームページから入手してください。)
テクニカルアップデート/テクニカルニュース
(最新の情報をルネサス エレクトロニクスホームページから入手してください。) ユーザーズマニュアル:開発環境
ARM ソフトウェア開発ツール(ARM Compiler toolchain、ARM DS-5 等)に関しては、ARM ホームページ から入手してください。
ホームページとサポート窓口
ルネサス エレクトロニクスホームページhttp://japan.renesas.com
お問合せ先