JTAGはMCUをどのようにプログラムしますか

JTAGはフラッシュメモリを搭載したMCUをどのようにプログラムするのですか?これはおそらくチップによって異なることを私は認識していますが、私はそれらがすべて共通しているプロセスがあると思います。具体的には、私はLPC1768に関して尋ねていますが、これはデータシートです。

2
JTAGプロトコルを理解しようとしていますか、それともチップがそれをどのように実装しているのですか?
追加された 著者 BlueRaja - Danny Pflughoeft,
ARM JTAGのドキュメントを見てください。 ADIv5.2
追加された 著者 Spehro Pefhany,
Spheroが説明したJTAGドキュメントを見るだけでなく、KeilやBlack Magic ProbeなどのようなJTAGにどのモジュールを使用したいかについても検討したいと思います。特に何かを選ぶよりも。
追加された 著者 KingDuken,
@SpehroPefhany、ありがとう。それを理解するのに苦労しています。フラッシュプログラミングを説明しているページを参照してください。
追加された 著者 kris,
@whatsisname、JTAGを介してLPC1768でフラッシュメモリをプログラムするために使用されるプロセスを理解しようとしています。
追加された 著者 kris,

5 答え

LPC1768について質問していますが、これはデータシートです。

実際には、リファレンスマニュアル(UM10360.pdf)に記載されています。データをRAMに入れて、IAPの CopyRamToFlash()関数を実行するだけです。はい、デバッガを使っているときでも。

デバッグインタフェース自体は、 http://infocenter.arm.com でコアIPプロバイダ(ARM)によって文書化されています。 (ただし、全文の登録が必要な場合があります)。

オープンソースのOpenOCDプロジェクトにはサポートがあります - ここでソースコードを調べることができます。

4
追加された
このMCUはすでに(マスク)ROMにISPとIAP機能を持っています。 UM10360.pdfマニュアルの第32.8章を参照してください。
追加された 著者 markpasc,
LPC1768のフラッシュとデバッグにはOpenOCDを使いました。
追加された 著者 markpasc,
確かに、これはある種のブートローダがすでにMCUにあることを必要とします。
追加された 著者 kris,
プログラムをダウンロードするとき、どのメモリアドレスにフラッシュし始めますか?
追加された 著者 kris,
それでは自動的に開始アドレスを選択しますか? LPC1768をフラッシュするためにOpenOCDを使うことも計画しています。たまたまこれについての指示がありますか?
追加された 著者 kris,

JTAGはフラッシュメモリを搭載したMCUをどのようにプログラムするのですか。

ほとんどのMCUでは、JTAGはフラッシュに直接接続されていません。実際にはそれぞれがプロトコルを持つアクセス方法のスタックがあります。デバッガ/インシステムプログラマは、実際にフラッシュにアクセスするためにそれらすべてに「話す」必要があります。

具体的には、LPC1768に関して質問しています

LPCはARM Cortex-Mベースです。彼らは ARMのデバッグインフラストラクチャを使用します。 JTAGからフラッシュへのパスは次のとおりです。

JTAG -> JTAG-DP -> AHB-AP -> Main AHB bus -> フラッシュ

しかし、私たちは実際にはこの直接的な道をたどりません。 LPCはIAPを通して点滅機能を公開します。

ステップを詳しく説明しましょう。

JTAG

JTAGは、4本のワイヤ(TCK TMS TDI TDO)を通じて一連のTAP(テストアクセスポート)を公開するワイヤプロトコルの通常の名前です。 JTAGチェインは、各TAPのレジスタを選択し、レジスタ値にアクセスするための標準化された方法を備えた、シフトレジスタの大きなチェインです。 TAPは、任意のサイズの任意のレジスタセットを公開できます。

JTAG-DP(JTAGデバッグポート)はARMによって指定されたTAPで、主にDPACCおよびAPACCと呼ばれる2つの32ビットレジスタ(実際には35ビット、3演算ビットとの連結により)を使用し、APおよびDPへのアクセスを可能にします。これはARMデバッグモデルのエントリポイントです。

ARMデバッグポートとアクセスポート

ARMのデバッグポートはアクセスポートへのゲートウェイです。アクセスポートはインターフェースを他のものに公開します。 DPは256のAPへのアクセスを多重化できます。 LPCの範囲内のほとんどのMCUは、内部AHB(アンバホストブリッジ)、すなわちCPUと他のすべてのIPとを相互接続する内部スイッチングマトリックスへのアクセスを与える1つのAPのみを含む。 (実際、AHB-APはメインバスに直接接続されていませんが、CPUに密接に接続されたデバッグバスに接続されています。詳細については、Cortexの設計ドキュメントを参照してください)。

Cortex-Mデバッグ用のARMの設計はメモリベースです。デバッガインタフェースはメモリへのアクセス(アドレス+データ、読み取り/書き込みなど)を可能にし、CPUデバッグ管理(停止、レジスタの検査など)はメモリマップを介して行われます。メモリインタフェースを介してアクセス可能なレジスタ-M3 TRM )。

メインバス

そこに着くと、メインメモリバスにアクセスでき、CPUを制御できます。メモリバスを介して、CPUからコードを実行しているかのように、すべての内部IPにアクセスできます。

チップ固有のinit

今日、ほとんどのMCUは適切な電源管理を含んでいます。これは一般的に2つの主な側面を含みます:パワーゲーティング(チップの一部から電力を引き出す)とクロック管理(オシレータの有効化とクロックルーティング)です。

ほとんどのチップはデバッガが差し込まれたときにパワーゲートとクロックを魔法のように有効にしないので、デバッガは実際に内部フラッシュに到達する前にプラットフォーム管理を行い、さまざまなMCU IPの適切な初期化を行わなければなりません。

フラッシュ

So, are we able to talk to フラッシュ IP then ?

はい、しかし効率的ではありません。

If we do all the memory accesses from the external debugger by the book, this will work, but will be extremely slow. The problem we have with JTAG access is it generally involves going through an USB-based probe with a big (~milliseconds) round-trip time. フラッシュ IP accesses usually involve an algorithm like:

  1. 書き込みアクセスを有効にする
  2. 書き込み先アドレス
  3. 1データワードを書く
  4. IPアドレスがポーリングされるのを待ちます
  5. 書き込み操作を開始
  6. IPアドレスがポーリングされるのを待ちます
  7. 2の自由なところに戻る

ポーリングが多すぎます。このループを繰り返すたびに数ミリ秒の時間がかかると、数十KiBのコードがプログラミングに時間がかかります。これを排除しようとします。

Efficient フラッシュ access

General case is to upload a little program in RAM of MCU able to copy chunks of data from RAM to フラッシュ. Idea is to avoid USB round trips by making big unconditional uploads of data from debugger to RAM (they can be batched in one USB transaction), and let the CPU do the copy to フラッシュ (which is generally done word-by-word).

Some manufacturers (either because they want to hide implementations details of their フラッシュ IP, or because they want to ease their customer's lives) implement a set of ROM-based routines you can call directly from debugger port to do different kind of tasks, including chip identification, programming, erasing. NXP implements such kind of ROM in the LPC lineup, they call it IAP.

このパターンの周りのバリエーション

JTAGの代替手段があります。 ARMにはSWDと呼ばれるそのようなオプションがあります。 SWDは同じDP(デバッグポート)とAP(アクセスポート)レジスタモデルを公開します。 JTAGからSWDへ、およびその逆に動的に切り替えることができるSWD/JTAGの変種(SWJ-DPと呼ばれる)があります。

ARM DP/APモデルの選択肢があります。元のARMはモデルが異なり、他のすべてのCPUベンダーはJTAG(または他のデバッグワイヤプロトコル)を内部にブリッジする独自の方法を持っています。

デバッグアクセスポートをメモリにブリッジすることはオプションですが、他のベンダはデバッグポートがCPUレジスタに直接アクセスするようにします。その場合、デバッガは実際のCPU命令をCPUに挿入して(ロードやストアなど)メモリにアクセスするか、メモリアクセスをトリガする特殊な擬似レジスタを持つことができます。 Ti CC2xxxとMipsはそのようなアーキテクチャの例です。

Some vendors also chose to have a direct path from Debug port to フラッシュ IP, but this is quite uncommon for today's MCUs where we have a debug capability anyway (because it gives indirect access to フラッシュ). This used to be common for parts where the internal CPU had no write access to internal フラッシュ.

3
追加された
@ B4039はい、そうです。 SoC業界では、すべての内部コンポーネントはIPと呼ばれています。 Flashはそのうちの1つです。
追加された 著者 wilkes,
+ 1 Microchip社のARM M7バリアントの少なくとも一部はJTAGピンを定義していますが、これらはバウンダリスキャン専用です。 「JTAGデバッグポートTDI、TDO、TMS、およびTCKは非アクティブです。これは、バウンダリスキャン製造テスト目的でのみ提供されています。」
追加された 著者 Spehro Pefhany,
フラッシュIPなど、IPとはどういう意味ですか。
追加された 著者 kris,

各「JTAG」インタフェースは、特定のデバイスを対象としたモデル固有のアクセス制御を使用します。生の仕様からJTAGデバッガを作成することは、DIYユーザの能力を超えており、いくつかのライセンスが必要ないくつかのセキュリティ方法を採用する可能性があります。

あなたの他の質問によると、あなたは魚のようなインターネットサイトで名無しの製造業者からボードを購入しました。そのため、このボードにはドキュメントもツールチェーンのサポートも含まれていないようです。

代わりに、元の製造元である NXP/Freescale/Motorola にアクセスして、< a href = "https://www.nxp.com/docs/en/brochure/LPC1768.pdf" rel = "nofollow noreferrer">開発キット、必要なすべてのチュートリアル、ツール、およびサポートを入手して入手してください。 Mouserからまたは同様の方法

2
追加された
@ B4039は、既存の点滅コードを利用するのが最も簡単な方法だからです。これはうまくいく唯一の方法かもしれません - フラッシュにはタイミングの問題があります。
追加された 著者 Andrew Walker,
アルゴリズムは通常、類似したチップのファミリ間で共有されます。 LPC1768の場合、おそらくsrc/flash/nor/lpc2000.cにあると思いますが、私のバージョンは少し古く、移動した可能性があります。
追加された 著者 Andrew Walker,
@ B4039 - 誰かがOpenOCDの設定ファイルを作り、フラッシュアルゴリズム特有のCコードを書かなければなりませんでした、しかしそれはあなたの全く新しいターゲットプロセッサのためにおそらく既にそこにあります。見ましたか?
追加された 著者 Andrew Walker,
ARMデバッグエンジンとの生の通信のためのJTAG拡張機能、それからRAMにデータをロードすること、そしてRAM内のデリゲートコードを呼び出すこと、あるいはベンダのROMに飛び込んで行うことさえも含む何かを経験する実際の書き込み
追加された 著者 Andrew Walker,
おそらくそれは実際にフラッシュに書き込むためにそれを使用するためのより多くのステップとの通信のためのそのようなものです。しかし、オープンソースのCMSIS-DAP(またはblackmagic、あるいは単にFT2232を使用)とそれを駆動するオープンソースのOpenOCDの間では、実際に掘り下げて面白いと思わない限り、実装の詳細を気にする必要はありません。ちょっとした修正を必要とする最先端のチップを使う - それらの場合、コードはオープンソースである、あなたは完全に自由です。
追加された 著者 Andrew Walker,
この場合のように、純粋な無知の観点から話されていない場合、これは「恐怖、不確実性、疑い」と一般的に呼ばれるような種類の非常に純粋な誤報です。私>。実際、JTAGアダプタを作成し、それを通信に使用し、それによってフラッシュメモリに書き込むために必要な情報はすべてすべて公開されています。そしてそれはすべてすべてに既存のオープンソース実装(デバッグアダプタ用、Arm Holdings以上のオープンソース!)を持っているので、最初の開発作業は完全に可能ですが、実際には何も必要ありません。
追加された 著者 Andrew Walker,
@ B4039、「どうやって」とはどういう意味ですか?チップは通常TAP(Test Access Portか何か)をオンにするいくつかの専用(または共有)ピンを持っています、そしてその時ポートは特定のアプリケーションソフトウェア制御の下でJTAGコントローラからシリアルコマンドとデータストリームを仮定また、カバーされているすべてのF-Fを1つ以上のJTAGチェーンにダンプできます。基本的なJTAGコマンドは標準化されていますが、それらへの(特にフラッシュするための)すべてのビットマッピングおよびアクセス制御は独自のものであり、デバイス固有のものです。
追加された 著者 Ali Chen,
@ChrisStratton、LPC1768設定ファイルしか見つけることができませんでした。Cコードはありません。
追加された 著者 kris,
@ChrisStratton、見ています。 IAP関数を何度も呼び出すようです。これはなぜですか。既存のプログラムのためのIAPは、フラッシュメモリを変更/消去/書き込みすることではない、それでその名前は?フラッシュに何も書き込まれていない場合、なぜIAP関数を呼び出すのですか?
追加された 著者 kris,
@ChrisStrattonは、OpenOCDを使用していますが、特定のチップで使用するために構成するときにこの「プロセス」を定義する必要はありません。
追加された 著者 kris,
私はそれを実装するつもりはありません。OpenOCDのような実装の「内部で」何が起こっているのかを知りたいだけです。
追加された 著者 kris,
@ChrisStratton、デバッグインターフェイスアーキテクチャドキュメント( static.docs.arm.com/ihi0031/d /&hellip; )は、最初にDBGTMSをShift-IRに切り替え、次にAPレジスタを選択し、次にDRWおよびTARレジスタを選択してデータを必要なアドレスにシフトすることでフラッシュのプログラミングを実行できることを示しています。これは正しいです?
追加された 著者 kris,
私はすでにそのボードを持っています、しかしそれはすべてのピンを持っていません(特に私が必要とするQEIピン)。とにかく、それが私が尋ねている理由ではありません。もちろん、ISPを使ってボードをプログラムするほうが簡単ですが、JTAGプロセスがどのように機能するのかを理解することに興味があります。
追加された 著者 kris,

Cortex-m3ベースのJTAGであることは必ずしも正しい用語ではないため、SWDはそれに似ています。

それはチップごとに、デザインごとに異なります。これは非常に幅広い質問です。

より短い答え、そしておそらく共通している何かに沿って。そのプロセッサ上で実行されているプログラムが、そのプロセッサが使用しているフラッシュとそれがブートするフラッシュブロックを消去/書き込みできるという意味でcortex-m3が持っているオンチップデバッガを使用すればそれらが提供するものは何でも、インタフェースSWD/JTAGを通して、そのデバッガと対話します。これはプロセッサとデバッガ特有のものですが、オンチップデバッガにプロセッサを停止させるためのものです。この場合、オンチップデバッガはcortex-m3の端にあるamba/axi/apb/etcバスへのフルアクセス権を持っているので、cortex-m3上のプログラムからバストランザクションを生成するものなら何でもできます。フラッシュペリフェラルとの通信を含む、プロセッサバスを介してデバッガを介してチップのベンダ領域にアクセスできます。これはこれを行うための1つの珍しい方法ではありません。

一部のmcusは、サーキットプログラミングを目的とした特定のロジックインタフェースを持っています。これは必ずしもプロセッサコアを通過するわけではなく、フラッシュ自体またはペリフェラルの一部をバイパスするものです。 AVR用のISP インターフェース(複数の異なるAVR インターフェースがxmegas対非xmegasがある)を見てください。これらは論理に基いていてブートローダではなくてJTAGではありません。

一般的なNXPチップのように、STのcortex-ms、Atmel ARM7のように、工場で作成されたブートローダーをチップに搭載することも珍しくありませんが、cortex-msのようには見えません。出荷時にインストールされているブートローダを交換できる場合もありますが、そうでない場合もあります。これらは、時にはuart、based、spi、i2c、usb、customなど、デザインしたインターフェースを使用することができます。

それから純粋なJTAGがあります。多くのmcusは多くのピンを持っていないので、これらのチップはまったく持っていないのでしょうか。 JTAGはJTAGデバッガについて話すときあなたがそうするならアクセス方法です、JTAGはあなたがデバッガに到達する方法です、それが鍵であるJTAGではありませんそれはインタフェースを持ちそしてそれが偶然に接続されるJTAGインターフェイスは、SPIスレーブインターフェイスに接続したデバッガがあると言っているようなものです。それだけでアクセス方法です。 JTAGは一般に他の多くの目的で使用され、オンチップデバッグ以外の目的で使用されていましたが、それでも非オンチップデバッグには非常によく使用されています。そのため、JTAGチェインをフラッシュインタフェースに接続することが技術的に可能です。それらは、オンウェハの場合やSRAMのパッケージテスト後(またはmbistの起動および確認後)にSRAMに接続するため、フラッシュにアクセスできます。デザインがそのようなものであれば、それであなたはそれをプログラムする方法で正しいスキャンチェーンでフラッシュインターフェースを操作することができます。そのフラッシュを回路にプログラムする必要があるという良いユースケースがあるならば、彼らはそこにもっと単純なものを入れるでしょう。

各プロセッサ設計はオンチップデバッガを持っていても持っていなくてもよく、そのデバッガの設計はそれらが選択したものであり、2つのベンダのプロセッサ設計がリモートで同じであると仮定する理由はない。 FUNCTIONALITYは、オンチップデバッガを経由してプロセッサバスにアクセスしてからチップの残りの部分にアクセスするのと同じことがよくあります。通信パスとプロトコル、および機能が異なります。一部のプロセッサはオンチップデバッガを持っていないかもしれません、チップ開発者がプロ​​セッサへのアクセスを無効にしてそのバスをバックドアとして引き継ぐことを可能にする何かをプロセッサのメインバスに置いたデザインを想像できます。

ARM cortex-mデバッグインタフェースはARMに文書化されています。チップベンダの情報はチップベンダによって文書化されています。プロセッサバスを介してペリフェラルにアクセスするためのフロントドアが多少あるため、プロセッサバスを介さずにペリフェラルを引き継ぐバック/サイドドアアクセスは不要です。現在では、そのアクセスに必要な外部インタフェース/プロトコルの形式で、内部が実際にどのように機能するのか、そして共有する理由がないことをチップベンダーが文書化することを願います。

1
追加された

プロセスに共通のプロセスがあると思います。

大まかに言って、JTAGを介したフラッシュのプログラミングには3つの一般的なパターンがあります。

  1. データをフラッシュ制御レジスタに直接書き込み、フラッシュメモリにプログラムするように指示します。これは遅いことが多いですが、マイクロコントローラに対する要求は最小限です。

  2. 小さな一時プログラムをRAMに書き込む(またはROMに既に存在するコードを使用する)と、RAMに配置されたデータがフラッシュにコピーされます。

  3. マイクロコントローラ固有のJTAG操作を使用して直接フラッシュに書き込む。

これら3つのパターンのうち、2番目のパターンが最も一般的です。そして、ターボJの答えで説明されるように、これはLPC1768が使用するものです。

1
追加された
@ B4039理論的には可能ですが、LPC1768のドキュメントにはフラッシュメモリへのハードウェアインタフェースは含まれていません。ブートローダの一部として使用されるROM内のルーチンは、フラッシュに書き込むための唯一の文書化されたインタフェースのようです。
追加された 著者 BrainSlugs83,
Ahhhh、おそらくLPC1768のOpenOCDコードにいくつかのIAPルーチンが含まれているのはそのためです。それで、それは本質的にそれからフラッシュをプログラムするのにIAPを使うRAMに一時的なプログラムを書いていますか?あなたはオプション2がLPC1768が使うものであると言いますが、一時的なプログラムを使わずにJTAGを使って直接フラッシュに書くことも可能であるべきではないですか?
追加された 著者 kris,