Amontec夜逃げ記念☆JTAGKey2互換回路をもっと使ってみる2

20150514追:
2015年現在、JTAGKey2CompatibleのRev.5まで
上がっています。自作される場合はこちらを参考にしてください。

20150514追:



数年前、FT2232Hを利用したJTAGkey2Cloneの紹介をしました。しかしちょっと自分で
も回路上で疑問を感じる点が多く、かねてから再製作の構想は考えておりました。
昨今のロジックICの性能向上も相まって2013年の今、再び満を持しての再製作となり
ました…最初に書いたのもう3年前か…もう3年も経ったの…さんねんも……


ゲフン失礼、前回は単に回路図と実に抽象的な使用例を紹介しただけでしたが今回は
どうしてそういう部品選定or回路に至ったかのねむいさん的ポリシーも述べます!

●肝心な回路図は…
実は少し前から公開していたのですが…以下のリンク先"JTAGKey2"のディレクトリ内
にあるpdfファイルが新しいJTAGKey2互換回路の回路図となります。
FT2232Dを使ったJTAGKey無印の互換回路も2009年当初のままですが下記リンク先の
"JTAGKey"のディレクトリに収録していますので同じくご参考までに。
JTAGKey or JTAGKey2Compatible Circuits

神木さんのJTAGKey2互換を参考にして作ったねむいさんのJTAGKey2互換を参考に
して作ったjujurouさんのJTAGKey2互換を参考にした最終形です!

そして以前使用していた"Clone"という単語は以下の理由でそぐわないのでもう使わ
ないようにしました。これからは"互換(Compatible)"で統一といたします。

●オリジナルのJTAGKey2との差異
夜逃げしたAmontecから販売されていたJTAGKey2純正品とは機能面で差異があります。

1.暗号化EEPROM(DS2432)の有無
 これはオリジナルではFT2232のB側のバスのどれかに接続され、Amontec社が
 提供しているamthal.dllはここから書き込まれた情報を読み出し正規品判定を
 行っています。
 digilentの"JTAG HS-1"もそれと似た仕組みで判定を行っているようです。

2. LEDインジケーターの設定
 ねむいさんのJTAGKey2CompatibleのLEDの設定はJTAGKey無印をベースに
 しています。JTAGKey2で変更になったLED表示とは全く合っていません。

3. Lattice-ISPVMの使用可否(OE強制制御)
 Lattice"さん"提供のISPVMは数年前にFT2232系デバイスからでも書き込みが
 できるように神対応をして下さいました!!しかし純正のJTAGKey2からはOEの
 手動コントロールが不可能(MPSSEを強制直結状態にできない)のため蓋を
 こじ開けてジャンパを飛ばさない限り使用不可能です。

OpenOCDやUrJTAG等のフリーなツールでは純正/互換品に関わらず同じ"JTAGKEY"
として扱われるのでまったく問題なく使用が可能です♥


●回路解説
いくつかのブロックに分けて主要部の解説をします。

 1.FT2232H周辺
  JTAGKey2互換初号機と同じくDLPDesignのDLP-USB1232Hを使用しています。
  面倒なUSB-HS周辺やFT2232系で必須なEEPROM等の周辺部品を搭載し
  モジュール化されており非常に簡単に扱うことができます。
  今だとUM-232H等のFT232Hを使ったモジュールなども使用可能と思われます。
  ただTx/RxバッファがFT2232Hよりも少なく処理速度に影響しますので、
  その点はご留意ください。

 2.電圧変換(電圧レベルトランスレータ&バッファ)
  JTAGKey2互換回路の心臓部です。ここで+1.4V〜+5.5Vまでの幅広いターゲット
  電圧に対応します。前回は+1.65Vからでしたが昨今のロジックICの性能向上に
  伴いサポートされる電圧範囲の保証される下限がさらに下がりました。
  それ故に型番どころか製造メーカ指定まで必須となります。ねむいさんの
  ぶろぐ見てる人は同じ74シリーズの同型番でも製造メーカー間で性能が
  微妙に違うという昔からよく知られている事実は常識中の常識のはずなので
  理解していただけるかと思います。
  "DIODES Inc. Semiconductor” の74LVCE1G125"、NxPの"74LVC2T45DC"を
  指定して使ってください。他のメーカーの同機能品は駄目です!

  また、各バッファICに繋がりFT2232Hから制御されるOEの制御線は必ず+5V
  (回路図中ではVbus)で攣ってください。JTAGKey2をPCと接続したときの
  これらは入力/Lo出力の疑似的なOD扱いで制御するPC側アプリが多く、
  +5V系で攣っていないと+2.5V付近の中間電圧が掛かってしまい動作不良の
  原因を作ってしまいます。

  jujurouさんが指摘していた+5V系の動作の考察についてはさらに掘り下げて
  別枠で考察させていただきます。


 3.ターゲット電圧検知
  こちらに関してはJTAGKey互換のころと同じく元NEC現ルネサス製のデジトラ
  使用しています(ねむいさん的定番部品です)。

  ↑Rev.4でルネサスを排除しました。使い勝手良かったのですが…さらばFB1A4M。
   代替としてROHMのデジトラDTD123YKT146を指定しております。
  ↑Rev.5に回路が変わりました!

 4.OE強制制御
  切り替えスイッチで無理やりバッファのOEをGNDに落としてMPSSEで使用される
  ポートをターゲットと常に直結状態にします。これは上述のとおりLatticeのISPVM
  やデバッグ用途で活躍します。3Pの少信号用SWならなんでも使用可能です。


●実際に組んでみよう


今回はアイテムラボさんのパワーメッシュユニバーサル基板を採用しました。
本来ならVCCに使うべきレーンもすべてGNDに割り当て高速信号の扱いを意識して
配線を行いました…行 っ た つ も り で す ! !


前回はFT2232Hのモジュール上部が吹きさらしで打撃を喰らいやすい危険な
構造でした。今回からアクリル板を加工して屋根を設けました。
いい感じですね♥


10MHz越えの高速信号を外に引き出すので信号線とGNDが交互に来るフラットケーブル
は必須です。さらにSEIWA製コの字型フェライトコアを設けて外来/輻射ノイズを殺す
ようにしています。

もともとチップバリスタも基板上に実装するつもりでしたがフェライトコアだけで
100V/1uSecのインパルスノイズ耐量試験を余裕でpassしてしまったのでチップ
バリスタは未実装のオプション扱いにしました。

一からJTAGKey2Compatibleを作る場合は初めにPCと接続したときにVID/PIDが
FTDIの素のFT2232Hとして認識されます。FT2232Hモジュール上のEEPROMに
データを書き込むために先ずはFTDIのドライバを認識させてください。
JTAGKey/JTAGkey2製作用に特別にinfに書き加えたものを用意しましたので
必ずこちらを使用してドライバを読み込ませてください。
2じゃない方のJTAGKeyを作りたい方もこのドライバを使用可能です。


JTAGKey2Compatibleとして動かすためにはEEPROMのデータを書き込んで
化かさなければなりません。従来はMProgを使用してデータを書き込むように
していましたが、現在はFT_Progに統一されましたのでこちらを使用してEEPROMに
JTAGKey2になるためのデータ(xml)を書き込みます。
上のドライバにはJTAGKey/JTAGKey2用のxml
データもJTAGKey_XML.7zとして収録していますのでこれを使用し書き込みを行って
ください。FT_Progの使用法についてはFTDI公式のマニュアルを参照のこと。

業務連絡:
野田様、FTDIドライバをWin8対応に更新しURLも変更しましたので直リンク先を
このページに変更願います。


書き込みが終わったらUSBケーブルPC一度抜いてさし直してください。成功したら今度
は"Amontec JTAGKey2"として認識されます。

その後はlibusb系を使いたい場合はおなじみZadigでインストールを、FTDIのドライバを
使いたい場合はそのままとしてください。

注:LibUSBKはドライバの入れ替え無しに0.1系と1.0系APIが同時使用可能な便利な
  ドライバですがWindowsXP下ではあらかじめ0.1系のドライバをインストールし
  ていないと動作が不安定になるようです。一度0.1系でインストールしすぐに
  LibUSBKに戻せば問題なく使用可能です。この操作もZadigを使うと楽ちんです



製作したJTAGKey2の動作確認を簡単にしたい場合はOpenOCDよりもUrJTAG
が便利です。ターゲットデバイスに接続して"cable jtagkey"->"detect"の
たった二つのコマンドでJTAGチェインが見えればチェック完了となります。
さらにpodコマンドでSRST,TRSTを含めたJTAGの信号線単体の個別コントロールも
可能なのでトラブルシュートにも役立ちます♥


●ちょっとしたデザインレビュー
20150512追:
以下の検証はRev.4以前のモロが問題だった頃の回路の内容です。
Rev.5にてオリジナルJTAGKey2のサポート電圧範囲に忠実になりましたので
現在はモロで問題有りません。
20150512追:







さて、実際に信用に足るJTAG用デバッガとして使うためにはいくつかクリティカルな
条件を設け試験する必要があります。JTAGkey2互換回路では大きく分けで2つの考慮
すべき点があり、どちらも回路図中の電圧レベル変換ブロックに集中しています。


1.電圧入力レベルに関する点
FT2232HのI/Oの電圧はMAX30Mbpsの高速信号を扱うため+3.3V系のLVTTLと呼ばれる
電圧レベルで固定化されています。(FT2232D系だと3.3V〜5Vで可変だったのですが)
これを考慮してかFT2232Hは+5VI/Oトレラントとなっており+5V系の入出力に対して
耐性を持っています。ですのでFT2232Hの+3.3V出力に10kohmで+5Vにプルアップ
する程度の衝突ならびくともしません
(この荒業は疑似的なOD制御の時に役に立ちます)。
また、SRST,TRST,JTAG各信号線のゲーティングをしているバッファICのOE端子は
FT2232H側が疑似的にOD出力の形で操作しているため、常に+5Vで吊るのが正しい
です。(FT2232H,74LVCE1G125,74LVC2T45のいずれも+5Vの入力トレラントを持つ)


本回路中で使用されている74LVC2T45DCは+1.2〜+5.5V,74LVCE1G125
+1.4〜+5.5Vまでカバーしており、何れも+5V入力トレラントも保証しています。
つまり+1.4〜+3.3Vまでの回路の場合は電圧入出力とも全く問題はありません。
しかしターゲットが+5V系のケースでは74LVCE1G125のHレベル入力下限(3.5V)を
満たしません。
こちらについてはjujurouさんの情報をもとに74AHCT541(※)を挟み、
LVTTLから+5VCMOSの電圧変換を行うことによって電圧レベルの問題は一旦は
解消としました……しかし…

(※…NxP製の物は74AHCT541と74VHCT541の特性は全く同じ)


2.信号の伝達遅延に関する点

74AHCT541を挟んだことによって同素子内部のゲートを通過する際の遅延が余分に
追加されることになりますが、最初に組んだときは204MHz動作のLPC4330と
TCK=15MHzで接続し、周囲温度も十分振って安定して書き込みデバッグできたので
問題なし!としていました。


ですが純正JTAGkey2がサポートしてるのが30Mbpsだったのを思い出し"本当に
30Mbpsで通信できるのか?"と感じ、購入後放置していた公証80MHzまで使用可能な
SPI-ROMSST25VF032B-80-4I-S2AFFlashROMを使ってTCK=30MHzで読み出し
試験してみました。
が、リードしたデータがすべて1bitずれた状態となってしまい玉砕orz
…というわけで真面目に伝達遅延の影響について考察を開始しました。


ターゲット電圧3.3VでTCK=30MHzで通信した際に一クロックサイクルは33.33nSec
であり、FT2232HのTCKからでたクロックがターゲットのTCKに届き、それに準じて
ターゲットMISOからの出力とFT2232HのTDO(SI)に届くまでの時間の合計が
33.33nSecを超えてしまうとビットシフトした状態でデータが取り込まれアウトに
なってしまいます。

データシート記載の使用温度環境-40~+125度で動作させた場合(データシート上で
明記されてないものは一番条件が絞れてる温度範囲)のパラメータを抽出して計算
すると上図のように33.33nSecを余裕で超える遅延が発生することになり74AHCT541
を挟むと30Mbpsの通信が理論上ですら不可能なのが判明orz


74AHCT541を省くと7.0nSec分遅延がなくなるため30MHzでもビットシフトは
起こらない計算になり、実際に74AHCT541を省いたモロにするとSST25VF032Bと通信
(DeviceIDの取得,書き込み,ベリファイ)が問題なくできることを確認しましたorz
やはりモロでなければだめだったのですorz

それと配線の引き回しも非常に重要です。10cmを超えるような引き回しをすると
上記のモロでも駄目でした。また、FT2232Hモジュールからレベル変換ICを何も
挟まないガチの直結も試しましたが10cm以上を超えるとやっぱりだめです。
30Mbpsで安定して通信を行うためには高速クロックで動作する回路を意識しないと
いけませんね。

PicoScope3206AでTCKの波形取得してみましたが74AHCT541付きの波形は
見るからにちょっときつくなってますね…。

↑15MHzの時のSPI-ROMのTCK波形(74AHCT541付)

↑15MHzの時のSPI-ROMのTCK波形(モロ)


↑30MHzの時のSPI-ROMのTCK波形(74AHCT541付)

↑30MHzの時のSPI-ROMのTCK波形(モロ)


ここでちょっと疑問に思ったのですが市販のFT2232H系のJTAGハードウェアは
本当に30Mbpsで動かせられるのか?という点です。10MHz以下までTCK速度を
落とさないとOlimexのARM-USB-OCD-Hでは安定して書き込みできないという報告

もあり、もしかしてそれらはレベル変換にFT2232D系で使用されていた低速な
LV系バッファが使われ続けているのではないのかと訝しんでしまいます。
純正のJTAGKey2ではどうなんでしょ??さすがにできるはずですが…???


3.モロへの誘い
で、ここで74AHCT541外したら3年前作ったのと全く同じじゃん!
とお思いの方が多い筈です。
それは引っ込みがつかなくなったねむいさん本人が一番強く感じています。

というわけで癪なのでモロで動かしたときに+5V系で本当に問題が
ないのかの実力検証を行いました。

使用MCU:
 ->ATMEGA1284P
動作電圧:
 ->+5.65V
  (安定化電源にてAVRの推奨上限+5.5Vにさらに+0.15Vのマージンを加える)
試験環境温度:
 ->-15度~+70度
  (-15度はコールドスプレーでJTAGKey2互換回路基板上をくまなく冷却,
   +70度はドライヤーで同基板上をくまなく加熱)
試験内容:
 ->試験環境温度下でATMEGA1284pにOpenOCDを試用しJTAGモード(TCK=10MHz)
  で100kByte程のプログラムの書き込み動作を行いその動作中にJTAGの
  通信エラーやフラッシュの書き損じが一切出ないことの確認。

  JTAGモードにした理由はAVRの場合はコア電圧/クロックに関わらず10MHzの
  高クロックでAVR内のOCDブロックとの通信が可能なためです。

結果:
 ->全く問題なし。
  現行のAVRドライバはread動作を行うとOpenOCDごと落ちるステキ仕様なので上記
  環境下でJTAGKey2をISP端子につなぎ変えたうえでAVRDUDEにてISPモードで
  読み出しを行い、さらに読みだしたhexをOpenOCDでJTAGモードでフラッシュの
  全領域消去->書き込み。
  そこから再びAVRDUDEでISPモードで読み出しを行いhexファイルの完全一致の
  確認をもって問題無しと判断しました。


てわけで電圧/温度/TCK速度とも一番厳しい状況を作り試しましたが全く問題は
ありませんでした!試験で使用したOpenOCDはatmega1284pのフラッシュ書き込みに
対応させた奴
使ってます。ログは↓こんな感じです。

> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/jtagkey2.cfg -f target/atmegaxxx4p_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.8.0-dev-00011-g70a2ffa-dirty (2013-05-11-14:47)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 10000 kHz
srst_only separate srst_gates_jtag srst_open_drain connect_deassert_srst
adapter_nsrst_delay: 100
verify Capture-IR is disabled
Info : max TCK change to: 30000 kHz
Info : clock speed 10000 kHz
Info : JTAG tap: avr.cpu tap/device found: 0x1970503f (mfg: 0x01f, part: 0x9705, ver: 0x1)
Info : JTAG tap: avr.cpu tap/device found: 0x1970503f (mfg: 0x01f, part: 0x9705, ver: 0x1)
auto erase enabled
Info : device id = 0x1970503f
Info : target device is atmega1284p
wrote 113408 bytes from file main.elf in 4.453210s (24.870 KiB/s)
Info : JTAG tap: avr.cpu tap/device found: 0x1970503f (mfg: 0x01f, part: 0x9705, ver: 0x1)
shutdown command invoked

> Process Exit Code: 0
> Time Taken: 00:05


同じくAVRDUDEはFT2232系MPSSEに正式対応した6.0RC1をビルドして使用
しております。JTAGKey2があれば難しい設定もワークアラウンドも必要なく
ARMもAVRも余裕で書き込みできるようになっていい時代となりました♥


+5V系でAHCTバッファ挟まなくても問題なかった理由は、74LVCE1G125のVthが
実際は中間電位の+2.5Vで切られていてそれさえ跨げばちゃんとレベルが遷移
できていたからと推測します。データシート上の規約におもいくそ違反して
ますが実力/マージン共に十分あることが確認でき自分が理解して使用する
範囲ならモロでも全く問題なしと判断しました。
(↑売り物の製品の設計の時はちゃんとデータシートに記載された
指示/定格をすべて守ったうえでみっっっちり動作テストを行うのが大前提です!)


もちろん保証の範囲外なので、他のメーカの同種型番のIC等では入力に
ヒステリシスが設けられて全く動かないかもしれません。真似して製作される
方は回路図中でねむいさんが指定したICを必ず選定してください。
「違うメーカのレベル変換ICをどうしても使うんだーぃ!」という方はご自身で
動作検証を念入りにした上で
使用してください!!!!!!!
念入りというのは回数だけ無意味に重ねるだけではなく温度と電圧くらいは
最低限振れという意味です。ベストな環境だけで満足すると
後で絶対にしっぺ返しがきますから…。

ということで74AHCT541はオプション扱いにとどめ、TCK=15MHz以下でしか
使用しなくて電圧的に心配な人だけ付けてね!ていう風にして冒頭の回路図
最終的に落ち着く運びとなりました。めでたしめでたし。


20150210追:
+5V系の時の74LVCE1G125の挙動をもう少しガン掘るトしてみました。

VCC=+5.5Vにして入力をわざとゆっくりと上げ下げした時に実際に何Vで
出力信号が遷移するかという実験をしました。

先ずは立ち上がり。2.5Vできっちり信号が変化しだしているのが分かり
ますね。2.5V以降の途中で波形が乱れている件は後で解説します。

お次は立下り。こちらも2.5Vで信号が変化しだしています。

本来ならばCMOSロジックの場合はVthはVCCの中点で本実験の+5V系上限値
+5.5Vの場合は2.75VになるはずですがLoレベル寄りの2.5Vとなっていました。
実際に使われる+5.0Vで換算すると74LVCE1G125の真のVthは2.27V付近となる
ことが容易に分かります。FT2232Hの+3.3V出力直結モロでもドライブ能力を
十分に強化して電圧降下を起こさなければVthをまたいで1V近くのマージンを確保
できるので電気的には全く問題がないことが分かります
(※FT2232HのI/Oドライブ能力を最弱の4mA設定にしても30MHzでぶん
回しても問題ありませんでした)。

そんな訳でホビー用途ならAHCTバッファ無しのモロで十分であるという結論と
させていただきます。逆に売り物にする場合は今回のロジックICに限らずデータ
シートに記載されている事項をすべて守った上で周囲環境条件を十分に振って
みっっっっちり
テストしまくって最終的にどういう仕様に落とし込むかを慎重に決めてください。
大切な事なので二度言いました。
「ねむいさんのぶろぐに書いてある通りに作ったおれはしらん」とかいう奴に
エンジニアの資格は無いです。

また両者の波形とも遷移直後に大きく出力波形が乱れていますがこれは入力
スルーレートの規約(5V時5ns/V)に違反しているからで、遅すぎる速度の入力に
よって発振が起こっています。上記の測定結果は入力をオープン(殆どのケースで
中間電位になる)にしていると出力が発振を起こして予期せぬ誤動作に繋がる
という重要な事柄も示しています。
CMOSの入力は吊るか落とすかどっちかはっきりと!


最後にスルーレート規約も守ったうえでVCC=5Vで3.3Vドライブした時の波形の
例を。VersaloonのSWCLK波形を入力にしています。
ご覧のとおり問題なく電圧の遷移が出来ていることが分かりますね。

LPC4330を使ってみる2 -OpenOCDでSPIFI-SPIROMに書き込む-

先日秋月さんからもLPC4330-XplorerLPC1830-Xplorerが販売されたわけですが、
ななんとデバッガハードウエアのULINK-MEもついて6200円ですって!本体+DHLの
送料合わせて1万ちかく払って半分壊れたのよこされた私はなんだったのか!?あと
たった2週間ちょっとまてばULINK-MEゲッツ出来たじゃないか!と悔やんでも仕方が
ないのでホビイストとしては手元にあるものを100%活用していこうと思います。
特に大将からご指名受けてしまい放り投げることもできないのですがFatFs実装は
あつをさんおねがいいたします(パタ


さて、LPC4330-Xplorer上ではSPIFIというインターフェースでマルチチャネル
I/O対応のSPI-ROMとLPC4330とが繋がっています。
LPC4330は起動オプションによりこのSPIFI-SPIROMから直接起動&プログラム
実行&リニアな参照ができるというなかなかニクい機能があるわけですが、
内蔵フラッシュを持たないLPC43xx・LPC18xxはどうにかしてこいつにプロ
グラムを書き込まなければなりません。有効と思われる方法は以下の2通り。
1.付属のULINK-MEを繋げてKEILのIDEを使ってプログラムをSPIROMに書き込む。
 ↑ULINK-MEもってないので却下。
2.DFUブートローダー経由でSPIFI-SPIROMに書き込む
 ↑情報が出そろってませんがいずれ試します…。
  RAM上には流せられるのは確認しました。


OpenOCDは実はSPIFI-SPIROMの書き込みにすでに対応していましたもちろん公式
にはコミットはされていないので自分でパッチ当て+再ビルド必須ですが、私の試行した
限りではいい結果を得られたので上述の確実な2通りに"もう一つ"追加したいと思います。

20120927追:
公式のコミットにも上がりました!


今回はこのOpenOCDを使った方法をご紹介します。


●その前にGCCでコマンドラインビルド可能なLチカるプログラムをこさえる
前回の時点ですでにOpenOCDにつなげて最初に書き込まれていたSPIROMの内容
のバックアップは取っていましたが自分でこさえたのをやっぱり書き込みたいよねと
いうことでいつもののLPC4330版を見据えたベース作りを行います。

LPC4330のSRAM+SPIFIの構成は以下の図のようになっています。

LPC4330コアの最大周波数204MHzでアクセスできるLocalSRAMは合計で200kByte
ありますがご覧のとおりアドレスは連続になってはおらず、128kByte・72kByte分で
ぶつ切りとされています(AHBRAMは構成的に64kByte分すべて連続アクセス可能です)。

SPIFIから実行した場合,104(MHz)/2(Byte)の読み取り速度のボトルネックがあります
ので見かけの動作速度は超大雑把に見積もって30MHz以下になっちゃいますが、ひと
まず一番単純な構成でプログラムも組み易いEXECUTE FROM SPIFIなメモリプラン
を構成しLチカプロジェクトを組みました。

…やっぱLocalSRAMはSH2Aみたく1MByteくらいほしかったなーと感じますね。これ
100PinのチップですからSRAMもSDRAMも外に引き出すのがまた面倒ですし。実際に
204MHzの動作速度を生かしつつ何か作ろうと思ったらプログラムは128kByte以内に
必ず納めてフォントやテーブルなどの比較的低速でもよい大容量データは全部SPIFI
にうっちゃる等の工夫が要求されるでしょう。

SPFI-SPIROM上動作版のリンカスクリプトの冒頭はこんな感じになってます。


●OpenOCDで繋げて書き込む
現在のOpenOCD0.7.0では公式のソースにSPI-ROMとNxP固有のSPIFIドライバのパッチ
をあてて再ビルドする必要があります。私のぶろぐ上で提供しているOpenOCDの
バイナリ
はこのパッチを適用しています。(下述の書き込みスクリプトも同梱してます)

今回使用するデバッガハードウエアはJTAGKey2Cloneとします。後述しますがLPC4330
のエラッタにより外部リセットの直接操作が非常に重要となるのでリセット(SRST)が
使えるブツが必須です。
それとお気の毒ですがULINK-MEはOpenOCDにハードウエアレベルで対応していない
ので、一切使えません(ファームを書き換えた初代ULINKだけ可能です)!


さて、いよいよSPIFI-SPIROMにプログラムを書き込みます。SPIROMの消去を含む
操作をするためにはFlashのプロテクト解除を必ず行う必要がありました。これを省くと
書き込み時にエラーを返されて失敗します。

↑20130814追:少し前のコミットで修正されました。

↓書き込み時のメッセージは以下のようになります。
 書き込み直後にSRSTを直接操作して外部リセットを2度かけています。

>> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/ftdi/jtagkey2.cfg -f target/lpc4330_xplorer_spifi.cfg -c "mt_flash_bin main.bin 0x14000000"
Open On-Chip Debugger 0.7.0-dev-00001-ga4830e7-dirty (2012-09-24-10:03)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
cortex_m3 reset_config sysresetreq
trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain
adapter speed: 2000 kHz
Info : clock speed 2000 kHz
Info : JTAG tap: lpc4330.m4 tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : JTAG tap: lpc4330.m0 tap/device found: 0x0ba01477 (mfg: 0x23b, part: 0xba01, ver: 0x0)
Info : lpc4330.m4: hardware has 6 breakpoints, 4 watchpoints
Info : lpc4330.m0: hardware has 2 breakpoints, 1 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x21000000 pc: 0x10000428 msp: 0x10091fe8
background polling: on
TAP: lpc4330.m4 (enabled)
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x21000000 pc: 0x10000428 msp: 0x10091fe8
Info : Found flash device 'sp s25fl032' (ID 0x00150201)
cleared protection for sectors 0 through 63 on flash bank 0
auto erase enabled
wrote 65536 bytes from file main.bin in 1.062507s (60.235 KiB/s)
shutdown command invoked
Polling target failed, GDB will be halted. Polling again in 100ms


なんでわざわざSRSTを直接いじっているかというとLPC4330-Xplorerに乗っかってる
チップのリビジョンは内蔵されたSPIFI-ROMドライバがPOR後の外部リセットした
後の初期化で必ずコケて次の外部リセットで正常に動くというイミフなerrataに
起因してます。
こいつのせいで今までうまくいった正攻法が全く通じずワークアラウンド満載な
書き込みスクリプトにせざるを得ませんでした。
まぁ結果的に安定したからOKということにしましょう。因みSRSTを繋げてなくても
SWD接続のversaloonやSTLink/V2で書くことはできますが、この場合いちいち
主電源を入り切りする必要が生じ面倒です。

また、デバッグ中に変なステートに落ち込んでJTAGのアクセスが一切不能に陥る
こともあります。この場合はディップスイッチでブート方法を別の経路にして
電源を入れ直すとひとまずJTAGで繋がるようになるので落ち着いてSPIFI-SPIROMの
内容を全消去してください(その後はブート方法をもとに戻すのを忘れずに)。


●OpenOCD+Insightでデバッグ

最後の仕上げにOpenOCD+Insightでソースコードデバッグできる環境も作りました。
こちらもワークアラウンド満載でgdbにattachしたときにsoft_reset_haltをかけて
プログラムの先頭で停止するようなトラップを仕掛けてます。

SPIFI-SPIROM上のプログラムを直接参照できるのでとてもありがたいですね♥
もちろんいつものIOViewでGPIOのビットの状態も一目でわかります♥
ちなみにGPIOの初期設定の時にInputBufferを有効にしておかないとピンの状態が一切
読めませんのでご注意ください!(普通のプログラムでも引っかかりやすいポイントです)


●SPIFI-SPIROMからブートしてSRAM上で実行してみる

SPIFIから実行すると大幅にパフォーマンスが下がってしまうので実際に使えるレベル
で試用するならばLocalSRAMからプログラムを実行する必要があります。SRAMの構成上
プログラムと初期設定値があるデータと合わせて128kByte以内に収めないといけない
制約が出来てしまいます。したがって大容量のフォントorデータテーブル等はSPIFI
におきっぱにしておくべきです。

今回はPCと連携せずにスタンドアロンで起動し、SRAM上で実行できる環境を拵えます。
原理としてはきわめて原始的なブートローダをSPIFIに仕込む形になりますが、大まかに
いうと以下の流れで行います。

1.SPIFIのアドレス(0x14000000)からブート

2.Reset_Handlerに飛ぶ(けどアドレスはまだSPIFI上の0x1400****)

3.".text"〜".data"の領域までLocalSRAM(0x1000000)にコピー

4.PCをSRAM上に指定してジャンプ

5.BSS領域をゼロクリア・各種クロック・I/O設定

6.main()に飛ぶ



"4."の部分がミソなわけですが実際のアセンブラのコードを見てもらうと…

一見無意味なことしてるように見えますがその場(SPIFI上)でジャンプすると着地点が
LocalSRAM上になりそのままSRAM上で何事もなくプログラムを継続できる仕組みに
なるわけです。
もうお気づきの方いると思いますが大昔AT91R40807でやってたことと全く
同じですね。

また、上記のからくりを実行するためにはbin形式でSPIFI-SPIROMに書いてやる
必要があります。
LMA/VMAの情報を保持しているelf・ihex形式だと失敗しますのでご注意を。



ということでLPC4330-Xplorerもこちらこちらに準拠したビルド・デバッグ環境を
こしらえました。
あとはどんどん上位層のプログラムを作りこんでいくだけです!


20121003追:
GCCビルド可能なLED点滅(シングルコア動作)プログラム公開します。

LPC4330はぢめました -まだLチカもできない-

積み基板どころか"詰み"基板になるのが分かっていながら人はなぜ、
何故、同じ過ちを繰り返してしまうのだろうか?



…しかしねむいさんはLPC1788にMCI版FatFsを移植を行ったので十分挑戦権が
あると自負しています!日本のアマチュアでは今度こそ一番乗りで(あつさんがすでに触ってました…)LPC4330
搭載されたLPC4330-Xplorerの使用感を報告させて頂きたいと思います!!
この基板インド製だそうですがもう時代は中華大陸飛び越えてインドですよ
インド!


さて、この基板はNxP社肝入りのCortex-M4F+CortexM0のデュアルコアが搭載
された最新のマイコンLPC4330が搭載されています。
最大動作周波数はCortex-M系最高速の204MHzに上り(M4,M0コアの両方とも)、
クアッドSPI-ROMが使えるインターフェース"SPIFI"も搭載されています。


USB-HSのPHYもLPC4330内に搭載しており(USB0のみ)、外付けHS-PHYも必要
ありません!
もちろんねむいさんのいつものに必要なMCIインターフェースもあります!


んでもって基板の構成ですがSTM32F4Discovery宜しく音アプリを強く意識
した構成となっていてAudio-CodecやEthernet-PHYも実装されています。
さらに基板上にMicroSDカードコネクタやSPIFI用のシリアルROMも乗っていて
FatFsの移植も少しは楽になりそうですね♥

さぁケーブル繋いで通電だー!と思ったのですが…
…良く見るとコネクタがなんだか変…






写真分かりづらいですが無理やりねじこんだように金具の上側が微妙に
曲がってます…



そして付属ケーブルの口見たらこんなになってやがりました…
注:最初からこんなになってました。ねむいさん壊してないですよぅ!
  もちろん刺さりませんorz



もうナン持ってイェェと叫びたくなるのを我慢してさらに基板をよく見ると
手半田で修正した跡がありDIPスイッチが溶けてLEDが焦げてました…
もうダブルオドロキですよねほんと印度クオリティすごいってまたひt


インドのNGXから直接購入したので修理交換の手間と金が非常にかかって
しまうと感じ、結局自分でコネクタ・LED他の付け替え修理を行いました。
LPC4330-Xplorerに実装されたmicroUSB-Bコネクタとほぼ似た形状の奴を
taobaoで購入しており、スムーズに付け替えは完了しました。ちなみに
秋月さんちで売ってるタイプの奴はコネクタを挿す向きとピンの
並びが逆のため付け替えができません!ご注意ください。


LEDの交換ついでに3.3VのLDOもMLCCが使用可能なZLDO1117に換装して
おきました。
最初に付属していたUSBMicro-Bのケーブルは捨てて手持ちのを使います。

後はチュートリアルに従いVcomのドライバ入れて基本操作を確認しました。

NGXのチュートリアルにはUSB0サイドのUSBHIDデバイスは挿したらすぐに
動くように見られますがまずUSB1サイドをPCに刺し、その次にUSB0サイドを
PCに刺し、最後にSW2を押すとUSB0サイドのHIDデバイスとして認識される
ようになります。



またSW2を押した後は仮想COMポート上で上画像のように各種チェック
ルーチンが走るようになっています。


同時にEtherNetもアクセス可能です(192.1681.1.123固定なのでご注意下さい)
LEDの操作がブラウザ上から可能になっています。



最後にJTAGで繋いでみてOpenOCDからどう見えるか確かめてみました。
LPC4330-XplorerのJTAGコネクタがちいさ過ぎてTI-StellarisのICDI付属の
ケーブルしかピッチが合うのなかったので、JTAGkey2Cloneの代わりに急遽
これを使いました。

↓で繋いだ状態はこんな感じに…

openocd -s C:/Devz/ARM/OCD/tcl -f interface/ftdi/luminary-icdi.cfg -f target/lpc4350.cfg
Open On-Chip Debugger 0.7.0-dev-00001-ga4830e7-dirty (2012-09-10-17:57)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 500 kHz
cortex_m3 reset_config sysresetreq
Info : clock speed 500 kHz
Info : JTAG tap: lpc4350.m4 tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : JTAG tap: lpc4350.m0 tap/device found: 0x0ba01477 (mfg: 0x23b, part: 0xba01, ver: 0x0)
Info : lpc4350.m4: hardware has 6 breakpoints, 4 watchpoints
Info : lpc4350.m0: hardware has 2 breakpoints, 1 watchpoints

確かにCortex-M4とCortex-M0のふたつのコアが見えてますね〜

ほんとに触っただけというかそれ以前のやっと修理したばっか状態なのでLチカ
すらも進んでませんが、豊富なサンプルをベースにいつものを作っていきます。

いろいろ試す9

電子工作系のブログ記事はこれが今年で最後なので旅先から無理やり更新して
やります。明日(12/30)のAM6:30には犬山遊園に降り立ってる身です・・・‼


さて、クリスマスは虹裏向けのネタの仕込みで死にそうになってたねむいさん
でしたがaitendoさんからよさげなTFT液晶モジュールが2点追加されていましたのを
目ざとく見つけ購入だけはしていました。
今週に入ってやっとこ作業時間ができたので即効バラックをくみ上げて動作させて
見ました。

まずは320x480の解像度でなおかつタッチパネルが付いているTRULY製のTFT液晶
モジュールTFT1P2797-Eです。以前も同じコントローラIC(ILI9481)で解像度が
同じもの
を売っていましたが、これはタッチパネル付きで、この解像度では
taobaoでもなかなかお目に掛からない一品です。

↑早速動かしてみました。
電源電圧は3.3V単一でまったく問題ありません。よく液晶モジュールの
データシートでは慣習的に2.85VをtypとしていますがコントローラICのVioとVccが
3.3Vを許容していればなんら問題はないです。F4用の液晶はこれで決まりです!
・・・といいたいところですが、この液晶は以前のものとは違ってノーマリホワイト
ようなので初期化手順が微妙に違います。ご注意を。


お次はお値段500円と非常にリーズナブルな液晶モジュールS95591-AAAです。
こういう2.2"でQVGAでタッチパネルつきはなかなかtaobaoでもお目にかかりません。
aitendoさんやりますね〜!


↑こっちも早速動かしてみました。
こちらはLEDのバックライト電圧が9Vとなっています。3.3Vから昇圧して定電流回路
組んでやりましょう。私はPowTech社のPT4101というLEDドライバICをよく使用して
いてこのバラックでも秋月さんの変換基板と組み合わせて使用しています。


最後にSTM32VL DiscoveryのVersaloon化について、最近のファームウェアは
SWDとして使うためのピン配置があべこべだったのが元の正しい形?に戻っています。
私のぶろぐを参考にSTM32VLDiscoveryをVersaloon化されてる方は注意してください。

↑私も久しぶりファーム変えて気づかないではまった・・・
以前と同じこと言ってる気がしますが春日井から戻ったら手順書も更新します。

てわけで去年とまったく同じことしかやらないまま今年の電子工作納めて
しまいました。


・・・
さて、尺があまってしまったのでよくメールなどで頻繁に頂く質問、いわゆる
FAQをこの場を借りて答えたいとおもいます。

>メカトロ(含むロボット関連の競技)で使うモータドライバを組むことに
 なりましたがお勧めのFETを教えてください
 ・・・など、モータ制御に関する質問
→これなぜか非常に良く聞かれるのですが副業の仕事内容的にモータドライバに
 関する質問は「私ぜんっぜんわかりません><」としか答えられません・・・
 なんせ私は1聞かれたら100答える人間でなおかつぶろぐのこと副業先の方々が
 皆知ってて変なこと書かないように監視されてますから・・・
 ちなみに本業の虹メに関してはやりたい放題に見えて実ははるかに
 恐ろしいくらい厳しいガイドラインがあって政治・経済・野球・サッカー・
 アニメ・漫画・特撮・絵師さん個人の話題そしてジャガイモの入ったカレーなど
 個人の嗜好が大きく分かれる事がらの話はタブーなっています。
 とくに「」の前ではジャガイモの入ったカレーの話題は絵師さんに絵を描くことを
 強要する行為と同じくらいタブー中のタブーにあたります。
 私的にはいないさんのぱんつのつぎにじゃがいも入りの野菜カレー大好物なんですけぉ・・・

 すみません話反れました・・・

>(任意のマイコン)からARMに乗り換えましたがGPIOのスピードが遅いのですが
→「最適化」「吐かれたアセンブラリストを良く見直して無駄な分岐・ロード・ストアが
 出ないようにGPIOアクセスする部分のコードを組みなおす」
 それとCPUコアが100MHz以上で動いててもGPIOがそのスピードについてけるとは
 限りませんからよくマニュアル(ARM本家の仕様書も)やデータシート穴の開くほど
 読んでください。
 それをマスターしたら君もGPIO高速パタパタで大空に羽ばたくことができる!!
 そしてもうこんなところに戻ってくんなよー!!!1!

>中華の電気電子系の掲示板からよくネタをパクってますよね
はい
 私の描いたJTAGKey2Cloneの回路図とかあっちで貼られてることがあったりして
 面白い発見も…!

>なんでトレイルランのはずなのに徒歩とあんまり早さが変わらないの?
途中から疲れて歩いてるからです

>GT-723Fを使っています。ちゃんとつないだはずなのに衛星を補足しません><
表出ろ(別にけんかするわけではない)。部屋の中では補足はほぼ不可能ですよ。
 特に最近のマンションは金属線が埋め込まれた窓のガラスなのでそれがシールドに
 なって外部からの電波がシャットアウトされてしまいます。
 Bluetoothの電波とかももちろんダメ・・・

>GT-723FからUARTのメッセージがまったく吐かれなくなってしまいました
→お気の毒ですが壊れました
 LVTTLなI/OラインにCMOSな+5V系の信号ぶちかますと簡単に死にます。
 +5Vで動かしてるAVR等と組み合わせるときは注意です。あと落下のショックにも
 弱いです。静電気にもメタクソ弱いです。
 ねむいさんは安価ゆえにとっかえが効いて性能の非常に高いPA6Cをお勧めします!
 ユーロ安の今がチャンス!!!


>Cortex-M3でOpenOCDデバッグしようとすると
 "Remote 'g' packet reply is too long"というメッセージが出て(ry
→もうねむいさん何十回も言ってるのですが・・・#
 次これ聞いたら頭にJTAGKey2ぶっ挿して1ビットずつ焼きこんでいきますからね!

ねむいさんってマミゾウのパクリだよね
→そうだね

STM32F2シリーズを使ってみる2

てなわけで前回の記事からはや一ヶ月、手探り状態でいろいろ進めているうちに
ST公式でやっとこF-2デバイス用のペリフェラルライブラリが出たり

BeableBoardXM購入合戦に勝利したもののまったく火入れしてなかったり

ALTERAのFPGA評価ボード買ったり

ステーション型はんだごて購入したり

USB接続型PCオシロスコープPicoscope3206Aを破格値でゲッツしたり
探訪も笠置まで進んでたりそうこうしてるうちにSTM32F2シリーズも
普通に購入できる
ようになってたりする昨今、いかがお過ごしでしょうか?
震災を境に身の回りの状況が一変してしまいましたが、ねむいさんはいない
さんをひざに乗せてくんかくんかしつつできることから着々と取り組んでいく
所存でございます。





勘違いや無知無学が祟って時間を食ってしまいましたが、STM32F207VGT6で
SDIOとChan氏謹製のFatFsを連結させて安定動作できるまでになりました。
SDIOはもちろんDMAを使って高速に転送可能です♥
以前のSTM32F103VET6のものと同じ条件でReadの速度を比べると若干の
向上が得られました!

SDカードだとSDIOは25MHzまでしか出なかったり(MAX48MHz)カード自身の
転送速度もボトルネックになってるとは思いますが、小規模のマイコンで
もこんだけ早かったら御の字ですよね〜。


さらに前回ちょろっと紹介しましたが480x272pixelの4.3inchTFT-LCDの
ドライバも組み込んで"いつもの"をやってみました。こちらもFSMC使った
高速転送です!
ねむいさんへたれだからSSD1963っていうコントローラつきの液晶モジュール
基板使ってますが・・・。


↑タッチパネル入力にももちろん対応。

↑再びぽぽぽーん
STM32F2になってフラッシュも1MByteまで増えたことだし、フォントも扱える
ようになって機は熟したからそろそろ私もChan氏のファイラーは卒業して
おりぢなるなファイラーを作ろうかな、と。



んでもってSDIOとFSMCの高速な転送を利用して動画再生も試みました。
Chan氏のLPC2388向けの動作再生ルーチンをチューンアップしないでまんま
利用してもQVGAサイズで29.97fpsな動画も余裕で再生できたので相当
"ぱわふりゃーなので余裕"なの確認できました。
やっけつだけど一番乗りだからどっかにアップしたいな〜


とりあえず次の一手としてはオリジナルなファイラーの実装に着手しつつ
先日がた老氏FreeRTOSがらみの質問をもらった機会にご無沙汰だったRTOSの
おべんきょもふたたび進めていくつもりです(BeagleBoard-xMとDE0-Nano
から目を逸らしながら)。





おまけ:
て言うかこっからが本題です!!!!
LatticeのispVMがいつの間にかFT2232デバイスに対応していた件

いままでsvfとかUrJTAGとか使って手間のかかる方法しかできなかったのが
嘘のようです!もうこれでLPTポート無くてもいいです!



↑ふつーに認識

↑そしてふつーに書き込み
JTAGkey2Cloneで使うためにはJTAGのOEを常時イネーブルにしておく
必要があります。※ispVMに対応するようにスルーモードをつけて
回路図差し替えときます。



もちろん外付けSPI-ROMにも書き込むことができます♥ispVMは多種の
SPI-ROMに対応しているわけですが・・・つまりこれはLatticeのデバイスが
JTAGで繋がってればUSB接続のSPI-ROMライタが安価にかつ確実に構築
できるというものすごいことでまさに神対応なわけなのです!!
これでマザボのBIOSいくらすっ飛ばして怖くない!
xilinxさんやalteraさんもこういうの見習ったらイイナー
・・・絶対ありえないですが…

SWD専用Versaloonクックブック

20120210追:
OpenOCDが0.6.0の2月以降のコミットでSTlink&STLink/v2の素のハードウエアに
対応しました!!もはやVersaloon化すら必要ありません!!



20110829追:
Versaloon本家の対応により、STM8S/STM32Discoveryに組み込まれたSTLink
のハードウエアにもめでたく対応となりました!!以下に長々と書いているかなり
無理やりなハードウエアの改造は、現在行わなくても済むようになっています!
それでもねむいさん(の方法)がだいすきなんだーい!って言う人だけ読んでください!





デバッガを備えた扱いやすい32ビットのプロトタイプボードたちが群雄割拠する現在、
彗星のごとく電子工作シーンに現れそのまま大気圏に突入して消滅した
STM8S-Discoveryには32bitMCUを使用した2線式デバッガハードウエアSTLink
搭載されています。

このSTLinkの本体はSTM32F103C8T6というSTM32のARMマイコンで、これは
Versaloonというリソースが公開された汎用のデバッガハードウエアにも使用されて
いるものです。
今回は、そのままでは糞の役にも立たないSTM8S-DiscoveryのSTLink部分に
物理的改造を施し、SWD接続専用の簡易Versaloonとして再生する手順を
紹介します。

注:制限事項
 ・この改造はVersaloon-miniのハードウエア互換にする改造です。
 ・VersaloonはARMの他に多数のマイコンをサポートしているが
  この改造はARMの、それもCortex-Mx専用になります!
 ・てわけでSWD接続以外の接続はできない(ていうかできねぇ!)
 ・頑張ってTDIとかTDOとか引き出せばJTAG接続も使えるけど
  すごいめどいからやらないよ!
 ・3.3V以外の信号レベルでは接続できない(一応5Vトレラント)
 ・作業工程はWindowsXP以降の環境を使用。Windows7x64環境でも動作します!
 ・真似して改造して基板がゴミになっても泣かない
 ・ていうかJTAGKey/JTAGKey2Cloneをすでに持ってる方の補助的な位置づけです。
 ・ハードの改造がめどいですという方はiruka氏のオレオレblaster化をお勧めします。
 ・SWD専用ですが、本家の対応でめでたくSTM8S/STM32DiscoveryのSTLink
  のハードウエアにも対応となりました!!↓に長々と書いているハードの改造を
  無理にしなくても済むようになっています!大事なことなので2度言います!



●必要なもの
 1.STM8S-Discovery
  これが無いと話になりませんね。750円でSTM32単体買うより安いです。
  必要部品はすでに乗っていて一から回路起こすより断然楽です!

 2.12MHzのクリスタル
  Versaloonの標準的なハードウエアは12MHzの外部クロックが必要です。
  STM32の103系って標準が8MHzなはずだが…
  ソフトが苦手なねむいさんとしてはハードウエアの方をカチ合わせる方
  針で改造を進めます!いちいち修正してビルドするのめんどいし!

 3.チップ抵抗
  1608~2012メトリックの100ohmを2つ・10kohmを3つ。これはポート保護&
  フローティング時の信号レベル固定用です。

 4.1列ピンヘッダ
  SWDやUARTの信号を外部に引き出す用途に使用します。

 5.0.26mm位のUEW・AWG26位のジャンパ線
  UEWは48PinTQFPから足を引き出したりジャンパしたりに使用します。
  ジャンパ線は3.3Vの電源ラインをバイパスするのに使用します。

 6.USB-シリアル変換若しくはパソコンとUARTで通信できる何らかの装備
  改造工程でUARTによるブートローダを立ち上げてDFUを書き込む必要があります。
  もちろん信号レベルはTTLレベルに各自で合わせておいてください。
  (JTAGでも書き換えられますがここでは触れません)

  また、DFUを書き込むためにPC側のプログラムはFlashLoaderDemonstratorを使用
  しますので各自インストールしておいてください。
  DFUを書き込んだ後はDfuSeを使いVersaloon本体を書き込みます。同じくインス
  トールしておいてください。

 7.2.54mmピッチのショートピン
  パソコンでも使用する標準的なショートピンを。STM8S基板にひっついている奴を
  流用しましょう。

 8.TQFP(0.5mmピッチ)の足を上げたりはんだつけしたりが余裕で出来る技能
  まぁこのブログを普段から見られている方はデフォで出来るでしょうからからあ
  えて言わずもがなですね…(カメラ目線)



●改造手順
 ※一気に改造するとなにが悪かったのか切り分けできなくなるので
  逐次動作確認を行い、改造していきます。

 1.先ずSTM8S-Discoveryのミシン目をカットしSTLinkと燃えないゴミにわけます。
  


 2.次にUART用のPinをUEW線にハンダ付けで繋げ、外部に引き出します。
  


 3."2."で引き出したUARTのピンはピンヘッダを使って外部に出しましょう。
  UART-TX(TxD)は10kohmで必ずプルアップしてください。
  

 4.丸内の部分をジャンパします。ここから+3.3Vを外部に出したいなんて人は
  AWG24位の太い線でジャンパしましょう
  

 5.次に丸内のBOOT0のPinに当たる部分を丸内の+3.3Vラインに
  ジャンパで飛ばします。
  

 6.USBシリアル変換と"3."で付けたピンをTxDとRxDに注意して接続します。
  そしてSTLink側のUSBコネクタをPCに挿しこみます。
  USBデバイスが認識されないエラーがでますが無視で。

 7.FlashLoaderDemonstratorを起動します。STM32のUARTブートローダーが正しく
  起動していればこの画面が見えるはずです。操作法などの細かい説明はこちら
  にうっちゃりますが、先ずここでDFUのプログラム
  (Versaloon_DFU_Bootloader.zip)
を書き込みます。
  STLinkのファームウエアははこの時点で消去されてしまいます。
  
  
  

 8.元STLinkをPCから外し、"5."で行ったジャンパはもう必要ないので外します。
  てか外さないと何やってもSTM32のUARTブートローダーが立ちあがっています。
  

 9.次に書きこんだDFUの起動確認を行います。クリスタルを8MHzのものから12MHzの
  ものに差し替えます。丸内の箇所にショートピンを挿し替えます。
  

 10.再び元STLinkとPCをUSBケーブルで接続します。USBデバイスとしてDFUが認識
  されたらOKです。まだVersaloon本体は書きません!
  

 11.DFUが起動するのを確認したら一旦PCから抜きます。Versaloon本体を書く前に、
  SWDを外部に引き出すための改造をします。四角内の部分の足を丁寧に上げます。
  

 12.足を持ち上げたらまとめてUEW線をハンダ付けして引き出します。
  

 13.ターゲットにSWD接続を行うためのピンを引き出します。JTAG用のポートが
  余っているのでこれを利用しましょう。
  VersaloonはPB6,PB7をSWDIO用,PB13をSWCLK用のポートとして
  使用します。図中の表記はこれに倣っていますので間違えないように
  してください。

  
  
  
  
  


 14.SWDに使うポートを引き出す改造が終わったら"10.の操作を再び行いDFUを
  認識させます。そして"DfuSe Demonstrationを立ち上げ、
  Versaloon本体のDFUファイルを書き込みます。
  


 15.書き終わったらUSBケーブルを外し、"14."で行ったショートピンを
   丸内の位置にします。以後Versaloonのプログラム本体の書き換えは
   DFU経由で行います。

 16.再度元STLinkとPCをUSBケーブルで接続します。USBデバイスとして、今度は
  Versaloonが認識されたらOKです。LibUSBのドライバを読み込ませてください。
  非常に操作が簡単なzadigを使ってLibUSBのドライバをインストールしてください。
  
  

 17.vsprog等を使用しSWDで繋がるCortex-Mx系のマイコン
  (LPC1xxx,STM32,ATSAM3x,etc)でVersaloonが使用できるか確認します。
  結線さえあっていればこの時点でSWD接続で操作できます。
  JTAGのTMS = SWDのSWDIO
  JTAGのTCK = SWDのSWCLK
  
  Simonquian氏のページで配布しているvsprog/vsgui等のソースをビルドして
  利用するかSWDのパッチを当てたOpenOCDをビルドし使用しましょう。
  おや…これは…




…というわけで余り物の材料かき集めたら1000円以内でCortex-Mx系の
ライタ/デバッガが手に入ってしまいます。STM8S-Discoveryを買って
しまった人は玉砕覚悟でVersaloonへの改造を試してみてはいかがでしょうか?

20230819追:
上記で紹介したDFUファイルやVersaloonプロジェクトは公開終了しました。
もし今の世でVersaloon作ってみたいなんて方はねむいさんに連絡ください。

mbedとかLPCXPresso1768版とか超楽しそうスね(涙目)


TFT-LCD Shieldの開発に当たって、ねむいさんもついにArduinoを購入しました!
最初はEtherpodのプラットフォームだけで動かすことしか考えてませんでしたが、
HP200LX持ってないのにmorphyone作ろうとして盛大にコけたどこぞのぺ○野郎のこと
が頭よぎったので、ちゃんとArduinoを理解してライブラリも作れるようになるために
購入しました…。まぁSTM32ですでにできたことをAVRに移すだけですから驚くほど
簡・・・た…

ごめんもう白旗上げていいかな…(※xmegaの二の舞)
ところでxmegaで思い出しましたがxmegaでFatFS(のMSPI)をDMA化出来たという話を
全く聞きません。情報もってる人がいたら教えてください…

20120907追:
xmegaでFatFsのDMA化できるじゃない!





さて、前フリはこれくらいにしといて本題に入りますが、Cortex-M3の系統の
ARMマイコン、LPC1768を使用したハイエンドかつ安価な評価ボードがいくつか
出ています。
mbedやLPCXpresso(LPC1768版)等がそれに当たりますが、ねむいさんはそれの
どれにも手をつけず、taobaoで液晶買った時についでに中華LPC1768ボードを
買っていたのでした!!
↑のLPCXpresso1768版出るなんて知ってたら買ってなかったのですが…
くやしい…でも…
過ぎたことは仕方ないので私も通電してみることにしました。


↑KeilのMCB1700互換なミニボードだそうです。周辺が全くない代わりに
 ほぼすべてのI/Oが外部に引き出されています。


↑即LPC1769に交換ッッ!!1!LPC1768を凌駕する120MHzで動きますッ!
 恐らく私が日本国内で初めてLPC1769を動かした女になるでしょう(多分)
R&D dailyの綿谷氏がとうの昔にされていましたorz生意気言ってごめんなさいッ
マイクロマウスの開発されている方たちはなんとうか本当に格が違いますね…

さて、基本の'き'であるLED点滅から始めてみたいと思いますが、上述のとおり
MCB1700互換なので、NxPのサイトにある、
"LPC17xx CMSIS-Compliant Standard Peripheral Firmware Driver Library (GNU, Keil, IAR)"
というExample付きのCMSISライブラリがそっくりそのまま使えます。

GNU用のExampleはこれまたCodeSourceryの使用を前提にされていて、
ねむいさん的にも好都合です。手順に従い、程なくバイナリを生成出来ました。


バイナリの書き込みはもちろんJTAGKey2Clone+OpenOCDから行います。
LPC17xx系統の対応状況は現在JTAG接続のみです。NxP製のARMマイコン特有の
CheckSumValidationに注意してスクリプトファイルを作り、JTAG接続にて書き
込みました。書き込みの過程はこんな感じです。

> "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey2.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc1769_rclk_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.5.0-dev-00450-g450aaad (2010-07-22-09:39)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.berlios.de/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter_nsrst_delay: 200
jtag_ntrst_delay: 200
none srst_pulls_trst
500 kHz
Info : device: 6 "2232H"
Info : deviceID: 67358712
Info : SerialNumber: 22222222A
Info : Description: Amontec JTAGkey-2 A
Info : max TCK change to: 30000 kHz
Info : clock speed 500 kHz
Info : JTAG tap: lpc1769.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : lpc1769.cpu: hardware has 6 breakpoints, 4 watchpoints
RCLK - adaptive
Info : JTAG tap: lpc1769.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x1fff0080 msp: 0x10001ffc
flash 'lpc2000' found at 0x00000000
auto erase enabled
wrote 8192 bytes from file main.elf in 1.328142s (6.023 KiB/s)
verified 4968 bytes in 0.531257s (9.132 KiB/s)
requesting target halt and executing a soft reset
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x01000000 pc: 0x000000e0 msp: 0x10007fe0
shutdown command invoked


現状LPC17xx系のアーキテクチャのすべてを理解はしていないのでLPC2388
みたく高速書き込み/ベリファイはまだ出来ませんが、そちらも使い込むに
つれ対応していきます。


↑LED点滅プログラムが動いてるところ。

↑JTAGkey2Clone+OpenOCD+Insightでのデバッグも自在です。

↑NxP提供のCMSISのExampleはLPC1768向けになっており、
 それをそのままビルドしているので,動作周波数はまだ100MHzです。


まぁつかみはこんな感じでしょうか。私が行った最初のとっかかりのプログラムを
自分用環境に移植したものをこちらに。OpenOCDのスクリプトファイルはこちらに
置いておきます。ご利用は自己責任で〜


おまけ


じっと見てたら気づいたけど何かに似てる…



LPCXpresso(LPC1114)はぢめました

20120130追:
OpenOCDで書き込みとデバッグできるようになったから熟読すべし



なんてうかうかしてるうちにXpressoのLPC1768版登場ですって奥さん!ねむいさんは
中華製1768ボードを買ってしまいましたので今すげぇ涙目です!!!
(でもいいんだ、こっちの方が自由度あるし!!全然負け惜しみじゃないし)

さて、LPC1768の件も語ることが多いので次回にゆだねるとして、今回は巷で流行りの
LPCXPressoを使用してみました。今回はLPC1114版の方を使用します。
まずは環境作りなんですが、いつもの通りCodeRedが提供しているEclipseベースのIDE
ガン無視でコマンドラインからのビルド環境を構築しました。
構築にあたりtodotani氏Lynx-EyED氏microBuilder.euほかのページを参考にさせてもらいました。

構築と言ってもやってることはLPC2388やSTM32でやってたことと全く同一で、リンカ
スクリプトとスタートアップコードをLPC1114用にこさえるだけです。Cortex-M0も
CMSISライブラリが提供されていてSTM32のものと似たような構成にすれば間違いなく
正しく初期化し、動作するものを作ることができます。
私はさらにこれに加えてNxP製のARMマイコンに特有のCRPのセクションを追加
しました。
(まだありますけど後述)普段は使用しないのですが万が一のこと考えてです。
CRP無効にしていますがもちろん他のプロテクションレベルにもできます。
親切心を装って"とりあえずこのプログラム書き込んで試してみて"なんてCRPLevel3
の地雷を故意に仕込むことも可能なのでとてもお勧めですが絶対にやってはいけません!


んでもってLPCXpressoのIDEに同梱されていたLED点滅のサンプルをビルドし、
書き込みます。
書き込みの際にはLPCLinkではなくてSTM8S-DiscoveryのST-LINK部分を
改造したVersaloonを使用してみました。


なんと少し前にLPC1xxxシリーズもSWD接続・フラッシュ書き込み対応に
なっています!!

…でもまだちょっと不安定。さらなる改善を期待します。


LPC2388で経験されている方も多いでしょうが、大切なことなので2度言いますが
NxP製ARMマイコン書き込みの際に注意しなければならないのは電源投入->リセット後
必ず実行されるビルドインされたブートローダによるVectorCheckSumチェックです。
これはどういうものかというと特定のアドレスまでの(大抵はVector領域)の
チェックサムをとった値とさらに別の特定のアドレスの値をたして0に
(2の補数をとる)ならなかった場合、フラッシュ上のユーザプログラムを
実行せず強制的にISPのアドレスにすっ飛ぶという仕組み。
(これにCRPも絡みますが細かいことは各自UserManualで確認のこと)

OpenOCD等でLPC系のARMマイコンのcfgファイルに"calc_checksum"と言う単語が
あるのはそのためです。calc_checksumを有効にしているとフラッシュの書き込み
アルゴリズムの中でVector領域のチェックサムの2の補数を取った数がLPC2388なら
0x00000014に書き込まれます。
これによりユーザプログラムが実行できるわけですが、今度は0x00000014に
違う値が書き込まれていることになってしまうため、べリファイが通りません…
…OpenOCDの仕様上どちら立たずなのでしょか…
JTAGkey2Cloneの時も述べましたが、どうせほとんど変更とか無いですから
スタートアップにあらかじめ自分で計算して書き込んでおけばcalc_checksum無し
でもダイジョブで、かつOpenOCDからベリファイも使用できるようになります
すみません脱線しました。


話を戻すと、上記のVector領域のチェックサムの2の補数を置くべき場所はLPC1114
では0x0000001cになります。ここにあらかじめ計算しておいた値を書いておけば
良いです。LPCExpressoにビルドインされているLPC-Linkフラッシュライタは自前で
計算&書き込みできます。VersaloonもVSProg上では"-A"のオプションを付けること
により対応可能になりますがOpenOCDで使うときの為スタートアップコードに
書き込んでおきました。
SimonQian氏のサイトを見てると、もうそろそろOpenOCD0.5.x系にも対応するよ〜
…な記述がみられますね…。自分の使いやすい環境で開発するのが一番なので今後の
対応を期待しています!

てわけで基本のLED点滅のソースを…ご利用は自己責任で…


次はLPC1769でもやってみましょか…

JTAGKey2Cloneをもっと使ってみる

20150514追:
2015年現在、JTAGKey2CompatibleのRev.5まで
上がっています。自作される場合はこちらを参考にしてください。

20150514追:














よし
やっと日記書く余裕ができた…MTM05に参加された皆様、本当にお疲れ様でした。
日記はぢめてもう1年たったことだし、ねむいさんもていどひくいと言われないような
仕事をしたいものです。本業の虹メの方がスレの途中で寝落ちしまくっててていどひくいどころ
じゃない状態なのは置いといて。てかいつもスレに参加してくれてる人ごめんなさい…。



さて本題、前回はJTAGkey2のクローンを作成し、LPC2388のフラッシュプ
ログラミングでRTCKの威力を確認しましたが、今回もう少し設定をなぶってみました。
CQ-FRK-NXP-ARMの基板は12MHzの外部クロックが乗っているのでOpenOCD接続時に
デフォルトの内部4MHzRC発振からそちらで動くように切り替えると速度が速くなる
わけですが、PLL使って最高速の72MHzまで叩き上げるとさらに速くなるはずです!
(もう十分早いけど)

↓というわけで試して比較してみました。
●Ext12MHz,With AdaptiveClocking(RTCK),CCLK=12MHz
> > "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
> openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey2.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc2388_rclk_flash.cfg -c "mt_flash main.elf"
> Open On-Chip Debugger 0.5.0-dev-00267-gef72484 (2010-05-26-21:28)
> Licensed under GNU GPL v2
> For bug reports, read
> http://openocd.berlios.de/doc/doxygen/bugs.html
> adapter_nsrst_delay: 100
> jtag_ntrst_delay: 100
> trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
> RCLK - adaptive
> RCLK - adaptive
> fast memory access is enabled
> dcc downloads are enabled
> Info : device: 6 "2232H"
> Info : deviceID: 67358712
> Info : SerialNumber: 22222222A
> Info : Description: Amontec JTAGkey-2 A
> Info : max TCK change to: 30000 kHz
> Info : RCLK (adaptive clock speed)
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : Embedded ICE version 7
> Error: EmbeddedICE v7 handling might be broken
> Info : lpc2388.cpu: hardware has 2 breakpoint/watchpoint units
> target state: halted
> target halted in ARM state due to debug-request, current mode: User
> cpsr: 0x60000050 pc: 0x000038bc
> flash 'lpc2000' found at 0x00000000
> auto erase enabled
> wrote 131072 bytes from file main.elf in 2.671892s (47.906 KiB/s)
> verified 118132 bytes in 0.921881s (125.139 KiB/s)

> requesting target halt and executing a soft reset
> target state: halted
> target halted in ARM state due to breakpoint, current mode: Supervisor
> cpsr: 0x600000d3 pc: 0x00000000
> shutdown command invoked
>
> > Process Exit Code: 0
> > Time Taken: 00:05


●Ext12MHz,With AdaptiveClocking(RTCK),CCLK=72MHz
> > "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
> openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey2.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc2388_rclk_flash.cfg -c "mt_flash main.elf"
> Open On-Chip Debugger 0.5.0-dev-00267-gef72484 (2010-05-26-21:28)
> Licensed under GNU GPL v2
> For bug reports, read
> http://openocd.berlios.de/doc/doxygen/bugs.html
> adapter_nsrst_delay: 200
> jtag_ntrst_delay: 200
> trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
> RCLK - adaptive
> RCLK - adaptive
> fast memory access is enabled
> dcc downloads are enabled
> Info : device: 6 "2232H"
> Info : deviceID: 67358712
> Info : SerialNumber: 22222222A
> Info : Description: Amontec JTAGkey-2 A
> Info : max TCK change to: 30000 kHz
> Info : RCLK (adaptive clock speed)
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : Embedded ICE version 7
> Error: EmbeddedICE v7 handling might be broken
> Info : lpc2388.cpu: hardware has 2 breakpoint/watchpoint units
> target state: halted
> target halted in ARM state due to debug-request, current mode: User
> cpsr: 0x60000050 pc: 0x000021bc
> flash 'lpc2000' found at 0x00000000
> auto erase enabled
> wrote 131072 bytes from file main.elf in 2.609392s (49.054 KiB/s)
> verified 118132 bytes in 0.234377s (492.212 KiB/s)

> requesting target halt and executing a soft reset
> target state: halted
> target halted in ARM state due to breakpoint, current mode: Supervisor
> cpsr: 0x600000d3 pc: 0x00000000
> shutdown command invoked
>
> > Process Exit Code: 0
> > Time Taken: 00:05


CCLKを72MHzに叩き上げたことによってベリファイ速度が滅茶苦茶速くなってます…
さすがですね〜。RAMへのダウンロードも同じくらい早いでしょう。
一方フラッシュ書き込みそのものはMAX50kb/Secで頭打ちのようです。これはフラッ
シュ消去/書き込み時間が固定でそこがボトルネックとなっているからでしょう。
STM32の方も同様の理由で頭打ちになってMAX20kB/Secが精一杯ぽいです。これももう
少し早くなると思うんだけどなあ…まだいじる必要があるのか…


あと気をつけなければならないのがOpenOCD用スクリプトのフラッシュ書き込み時の
CCLKの設定ですが、こちらも適切な値に設定していないと正しく書きこまれません。
例としては↓こんな感じです。

RTCK対応のLPC2388用OpenOCDコンフィグは既に72MHz動作対応済みです。






そして今日はもう一件JTAGKey2Cloneを使った重要な事柄があります。

先月発売されたInterfaceには付録としてSH2Aの基板が付いていました。これにはH-UDI
とかいうJTAG用の端子が備わっていて同時期にリリースされた某JTAGデバッガを接続
してデバッグができるようになってます。"た"の人曰く最初はIF誌で同JTAGデバッガの
回路図全公開の予定だったらしいのですが大人の事情で非公開となったそうです。

でもFT2232デバイス(FT2232H)を使っているのは自明かつMPSSEでJTAGとして使える
ピンは固定なのでJTAGkey2Cloneのハードウエアが余裕で使えるんじゃないかと
言うことで実験野郎してみました。
…と思ったらすでにされてる方がいました。
てか某掲示板では動かすまでいろいろアドバイス頂きありがとうございます…。
dllをこう使えばディスクリプタ合わせるためのEEPROMの書き換えすら要らんのか…すげ

てわけでJTAGKey2Cloneまんまで動きましたワーィ


これでSPIROM何発ぶっ飛ばしても無駄な出費払わずにいつもの使って復帰できますね♥
JTAGKey2(無印やクローン含む)があればAltera,xilinx,ARM,SHの開発に使いまわせられます!


でもねむいさん国産マイコンは仕事でうんざりするほど使ってるからSH2Aとかこれ以上
触るつもり全く無いんだし!







おまけ
毎年気になる電源ライン

↓立ち上がり

こっちはふつーですね・・・

↓立ち下がり

あーっとこれは…

1.2Vはスパッと0Vまで落ちてますが3.3Vラインが0.6〜0.4V付近で長時間たむろって
ます…
リセットICの電源も+3.3Vから引いてますがこれは誤動作しやすくなるやもしれません。
1.2Vが立ちあがらないUSBが繋がらない云々の件は3.3Vラインの残存チャージが原因の
一つと見てよいですね。

対策は3.3VレギュレータのVoutからVinにチャージを引き抜くようにショットキバリア
かましてやれば良いでしょう。syslab氏もすでに試されていて実際に効果ありの
ようですね。ていうか基板設計するときにもっときっちりオシロで波け…

…まぁいいや…もうARM9のボードで遊ぼう…淘宝网で買った液晶も
たくさん残ってますし

ねむいさん遊んでる暇あるの!?


届いたわぁ・・・ARM9(LPC3250)のボードが…!
今は別の案件で忙しすぎて触ってる暇すらないけどMTM05終わったk頃くらいに
androidとか動かしてみたいなぁと画策してます…。
ちなみにEmbedded Artisitsさんより直接購入しました。日本国内で代理店通して
同スペックのボード買うとどうしても割高になってしまうので…。
20190726追:上のボードは前の職場にすてtゲフンゲフフン寄贈してきました



ついでにこれも購入しました…しかしOpenOCDでLPC1114/1343書き込み/デバッグ
出来るようになるまで上記のLPC3250のボードとともに塩漬け…。
ついでに"た"の人のARMデバッガCortex-M3対応も期待。




上のARM9のボード購入にあたってJTAGKeyCloneの機能アップ版である
JTAGKey2Cloneの制作を行いました。
お手本にしたのは最初にJTAGKeyCloneを作ったときと同じく神木さんの作例です。

20130422追:
JTAGkey2Cloneの回路図改良しました


JTAGKey2は中のチップがFT2232Hになっています。超高速信号を引き回すことに
なるので、FTDIチップ周りは神木さんのものと同じく出来合いのモジュール
使用しています。
氏の作例と違う部分はレベルシフタICをJTAGKeyCloneで使用したときとおなじもの
を使用し、FT2232H <-> レベルシフタ間を+5V電圧系で駆動させている点です。
FT2232HのVCCIO上限は+3.3Vなので通常なら思いきり制約に違反している
ところですが、FT2232Hとレベルシフタの+5V入出力トレラント性を大いに利用して
レベルシフタの入力(つまりFT2232Hの+3.3Vな出力)を+5Vでプルアップするという力技で電圧変換の問題をクリアして
います!!

20150218追:
↑の出力プルアップ作戦は470ohmでプルアップしてもFT2232Hの出力バッファの
 引き込み能力の方が勝ってしまうため全く意味がありません。
 結局出力は3.3Vのままで規約違反です。でたらめ書いてましたすみません。
 代わりに+5VCMOSレベルとの動作の際の電圧遷移がどうなっているかを
 調べましたので参考にしてください

20150218追:

20150514追:
電圧レベルに関してケリをつけました!!!!!!
20150514追:




また、前回のJTAGKeyCloneを作った時はDAISENの変換基板に頼っていましたが、
今回はメッシュアース基板を利用してレベルシフタを基板に直付け・UEW線で引き
まわして高速な信号も扱えるようにしています。

↑こうしてみると1608サイズのパスコンが相対的におっきく見えるほと小さいですなぁ…



こうして作り上げたJTAGKey2CloneはJTAGKeyCloneと同じ感覚で使用ができます。
OpenOCDで使う場合なら、jtagkey.cfgと指定しているのをjtagkey2.cfgに変える
だけで使えます。JTAGKey2の売りはUSB-HighSpeedで各種シリアル転送がさらに
高速になった上にRTCK(AdaptiveClocking=自動クロック追従)がサポートされて
いる点なわけですが、これはLPC2388のようなRTCK端子が出ているデバイスで
真価を発揮します。

以下に各条件でOpenOCDからLPC2388に100kB程のデータをフラッシュ書き込み/
ベリファイした時の速度の比較を記載しておきます。
(以下無駄に長いので覚悟してください)


●JTAGkeyClone(FT2232D)/LPC2388_Ext12MHz X'tal
> > "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
> openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc2388_flash.cfg -c "mt_flash main.elf" -c "continue" -c "resume" -c "shutdown"
> Open On-Chip Debugger 0.5.0-dev-00145-g2a17fd9 (2010-04-08-13:41)
> Licensed under GNU GPL v2
> For bug reports, read
> http://openocd.berlios.de/doc/doxygen/bugs.html
> adapter_nsrst_delay: 200
> jtag_ntrst_delay: 200
> trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
> 500 kHz
> fast memory access is enabled
> dcc downloads are enabled
> Info : device: 4 "2232C"
> Info : deviceID: 67358712
> Info : SerialNumber: 11111111A
> Info : Description: Amontec JTAGkey A
> Info : clock speed 500 kHz
> Error: JTAG scan chain interrogation failed: all zeroes
> Error: Check JTAG interface, timings, target power, etc.
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : Embedded ICE version 7
> Error: EmbeddedICE v7 handling might be broken
> Info : lpc2388.cpu: hardware has 2 breakpoint/watchpoint units
> 100 kHz
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Warn : srst pulls trst - can not reset into halted mode. Issuing halt after reset.
> target state: halted
> target halted in ARM state due to breakpoint, current mode: Supervisor
> cpsr: 0x000000d3 pc: 0x00000000
> Warn : Bad value '00000000' captured during DR or IR scan:
> Warn : check_value: 0x00000009
> Warn : check_mask: 0x00000009
> Error: JTAG error while reading cpsr
> 500 kHz
> flash 'lpc2000' found at 0x00000000
> auto erase enabled
> Info : Padding image section 0 with 0 bytes
> Error: Target not halted
> Error: failed erasing sectors 0 to 10 (-304)
> Command handler execution failed
> make.exe: *** [program] Error 1
>
> > Process Exit Code: 2
> > Time Taken: 00:04
↑JTAGKeyCloneでは外部クロックだとフラッシュの書き込みが出来ません!


●JTAGkeyClone(FT2232D)/LPC2388_Int4MHz RC
> > "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
> openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc2388_flash.cfg -c "mt_flash main.elf" -c "continue" -c "resume" -c "shutdown"
> Open On-Chip Debugger 0.5.0-dev-00145-g2a17fd9 (2010-04-08-13:41)
> Licensed under GNU GPL v2
> For bug reports, read
> http://openocd.berlios.de/doc/doxygen/bugs.html
> adapter_nsrst_delay: 200
> jtag_ntrst_delay: 200
> trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
> 500 kHz
> fast memory access is enabled
> dcc downloads are enabled
> Info : device: 4 "2232C"
> Info : deviceID: 67358712
> Info : SerialNumber: 11111111A
> Info : Description: Amontec JTAGkey A
> Info : clock speed 500 kHz
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : Embedded ICE version 7
> Error: EmbeddedICE v7 handling might be broken
> Info : lpc2388.cpu: hardware has 2 breakpoint/watchpoint units
> 100 kHz
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Warn : srst pulls trst - can not reset into halted mode. Issuing halt after reset.
> target state: halted
> target halted in ARM state due to breakpoint, current mode: Supervisor
> cpsr: 0x000000d3 pc: 0x00000000
> 500 kHz
> flash 'lpc2000' found at 0x00000000
> auto erase enabled
> Info : Padding image section 0 with 0 bytes
> wrote 131072 bytes from file main.elf in 7.468798s (17.138 kb/s)
> verified 117280 bytes in 2.812518s (40.722 kb/s)
> shutdown command invoked
>
> > Process Exit Code: 0
> > Time Taken: 00:14
↑JtagKeyCloneでは内部4MHz RC(電源投入時のデフォルト状態)でフラッシュ
 書き込みするのが無難なようです。


●JTAGkey2Clone(FT2232H)/LPC2388_Int4MHz RC
> > "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
> openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey2.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc2388_flash.cfg -c "mt_flash main.elf" -c "continue" -c "resume" -c "shutdown"
> Open On-Chip Debugger 0.5.0-dev-00145-g2a17fd9 (2010-04-08-13:41)
> Licensed under GNU GPL v2
> For bug reports, read
> http://openocd.berlios.de/doc/doxygen/bugs.html
> adapter_nsrst_delay: 200
> jtag_ntrst_delay: 200
> trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
> 500 kHz
> fast memory access is enabled
> dcc downloads are enabled
> Info : device: 6 "2232H"
> Info : deviceID: 67358712
> Info : SerialNumber: 22222222A
> Info : Description: Amontec JTAGkey-2 A
> Info : max TCK change to: 30000 kHz
> Info : clock speed 500 kHz
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : Embedded ICE version 7
> Error: EmbeddedICE v7 handling might be broken
> Info : lpc2388.cpu: hardware has 2 breakpoint/watchpoint units
> 100 kHz
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Warn : srst pulls trst - can not reset into halted mode. Issuing halt after reset.
> target state: halted
> target halted in ARM state due to debug-request, current mode: User
> cpsr: 0x60000050 pc: 0x00002028
> 500 kHz
> flash 'lpc2000' found at 0x00000000
> auto erase enabled
> Info : Padding image section 0 with 0 bytes
> wrote 131072 bytes from file main.elf in 6.750044s (18.963 kb/s)
> verified 117280 bytes in 2.640642s (43.373 kb/s)
> shutdown command invoked
>
> > Process Exit Code: 0
> > Time Taken: 00:13
↑JTAGKey2Clone(FT2232D)の時と比べて少し早くなってますね。


●JTAGkey2Clone(FT2232H)/LPC2388_Ext12MHz X'tal
> > "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
> openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey2.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc2388_flash.cfg -c "mt_flash main.elf" -c "continue" -c "resume" -c "shutdown"
> Open On-Chip Debugger 0.5.0-dev-00145-g2a17fd9 (2010-04-08-13:41)
> Licensed under GNU GPL v2
> For bug reports, read
> http://openocd.berlios.de/doc/doxygen/bugs.html
> adapter_nsrst_delay: 200
> jtag_ntrst_delay: 200
> trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
> 500 kHz
> fast memory access is enabled
> dcc downloads are enabled
> Info : device: 6 "2232H"
> Info : deviceID: 67358712
> Info : SerialNumber: 22222222A
> Info : Description: Amontec JTAGkey-2 A
> Info : max TCK change to: 30000 kHz
> Info : clock speed 500 kHz
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : Embedded ICE version 7
> Error: EmbeddedICE v7 handling might be broken
> Info : lpc2388.cpu: hardware has 2 breakpoint/watchpoint units
> 100 kHz
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Warn : srst pulls trst - can not reset into halted mode. Issuing halt after reset.
> target state: halted
> target halted in ARM state due to debug-request, current mode: User
> cpsr: 0x60000050 pc: 0x0000373c
> 500 kHz
> flash 'lpc2000' found at 0x00000000
> auto erase enabled
> Info : Padding image section 0 with 0 bytes
> wrote 131072 bytes from file main.elf in 5.843788s (21.904 kb/s)
> verified 117280 bytes in 1.015632s (112.768 kb/s)
> shutdown command invoked
>
> > Process Exit Code: 0
> > Time Taken: 00:10
↑JTAGKeyClone(FT2232D)では不可能だった外部12MHzのクロックでの
 書き込み/ベリファイが出来てます。スピードも速くなってます。


●JTAGkey2Clone(FT2232H) with RCLK/LPC2388_Int4MHz RC
> > "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
> openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey2.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc2388_rclk_flash.cfg -c "mt_flash main.elf" -c "continue" -c "resume" -c "shutdown"
> Open On-Chip Debugger 0.5.0-dev-00145-g2a17fd9 (2010-04-08-13:41)
> Licensed under GNU GPL v2
> For bug reports, read
> http://openocd.berlios.de/doc/doxygen/bugs.html
> adapter_nsrst_delay: 100
> jtag_ntrst_delay: 100
> trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
> RCLK - adaptive
> fast memory access is enabled
> dcc downloads are enabled
> Info : device: 6 "2232H"
> Info : deviceID: 67358712
> Info : SerialNumber: 22222222A
> Info : Description: Amontec JTAGkey-2 A
> Info : max TCK change to: 30000 kHz
> Info : RCLK (adaptive clock speed)
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : Embedded ICE version 7
> Error: EmbeddedICE v7 handling might be broken
> Info : lpc2388.cpu: hardware has 2 breakpoint/watchpoint units
> target state: halted
> target halted in ARM state due to debug-request, current mode: User
> cpsr: 0x60000050 pc: 0x00002040
> flash 'lpc2000' found at 0x00000000
> auto erase enabled
> Info : Padding image section 0 with 0 bytes
> wrote 131072 bytes from file main.elf in 5.859412s (21.845 kb/s)
> verified 117280 bytes in 2.640642s (43.373 kb/s)
> requesting target halt and executing a soft reset
> target state: halted
> target halted in ARM state due to breakpoint, current mode: Supervisor
> cpsr: 0x600000d3 pc: 0x00000000
> shutdown command invoked
>
> > Process Exit Code: 0
> > Time Taken: 00:09
↑書き込みは少し早くなっていますが、RCLK有効でもベリファイ速度はCCLKの関係で
 頭打ちになってますね。


●JTAGkey2Clone(FT2232H) with RCLK/LPC2388_EXt12MHz X'Tal
> > "C:/Devz/AVR/WinAVR/utils/bin/make.exe" program
> openocd -f C:/Devz/ARM/OCD/daemon.cfg -f C:/Devz/ARM/OCD/tcl/interface/jtagkey2.cfg -f C:/Devz/ARM/OCD/tcl/target/lpc2388_rclk_flash.cfg -c "mt_flash main.elf" -c "continue" -c "resume" -c "shutdown"
> Open On-Chip Debugger 0.5.0-dev-00145-g2a17fd9 (2010-04-08-13:41)
> Licensed under GNU GPL v2
> For bug reports, read
> http://openocd.berlios.de/doc/doxygen/bugs.html
> adapter_nsrst_delay: 100
> jtag_ntrst_delay: 100
> trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
> RCLK - adaptive
> fast memory access is enabled
> dcc downloads are enabled
> Info : device: 6 "2232H"
> Info : deviceID: 67358712
> Info : SerialNumber: 22222222A
> Info : Description: Amontec JTAGkey-2 A
> Info : max TCK change to: 30000 kHz
> Info : RCLK (adaptive clock speed)
> Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
> Info : Embedded ICE version 7
> Error: EmbeddedICE v7 handling might be broken
> Info : lpc2388.cpu: hardware has 2 breakpoint/watchpoint units
> target state: halted
> target halted in ARM state due to debug-request, current mode: User
> cpsr: 0x60000050 pc: 0x0000373c
> flash 'lpc2000' found at 0x00000000
> auto erase enabled
> Info : Padding image section 0 with 0 bytes
> wrote 131072 bytes from file main.elf in 2.765643s (46.282 kb/s)
> verified 117280 bytes in 0.921881s (124.236 kb/s)

> requesting target halt and executing a soft reset
> target state: halted
> target halted in ARM state due to breakpoint, current mode: Supervisor
> cpsr: 0x600000d3 pc: 0x00000000
> shutdown command invoked
>
> > Process Exit Code: 0
> > Time Taken: 00:04
↑ううん早い

JTAGkey2Clone+RTCKの組み合わせではJTAGKeyCloneと比べるとフラッシュ書き込み
ベリファイとも約2.7倍ほど早くなってます。LPC2388はROM容量が大きいので早いに
越したこたぁ無いですね♥これでLPC3250を迎え入れる体制ができました!


…あ、わかってます、遊ぶのはやる事やってからです…!!





ついでにLPC23xx系のマイコン使うときのTipsですが、このマイコンは電源を起動する
とフラッシュに書かれたプログラムとは関係なく先ず内蔵のブートローダーが立ち上が
ります。大まかな流れとしては以下のようにしてブートシーケンスを行うようです。


P2.10ピンの状態を読みに行く,P2.10=Lowの時
->ISP起動

P2.10=Lowではない時
->0x14にかかれたチェックサムが有効かどうか確認
チェックサム有効
 ->ユーザープログラム起動
チェックサム無効
 ->ISP起動
(本来これにCRP他も絡みますが詳細はUserManualのp606以降を参照してください)

したがってフラッシュロムに何も書かれていないとP2.10LowでなくてもISPが
起動します。このときにJTAGから書こうとするとISPのアドレスに飛ばされて
しまってうまくいかない時があります。がた老氏も同じ問題に遭遇されていましたが私も
JTAGKey2Clone使った時に初めて気づきました(JTAGKeyCloneでは出なかった)。
この問題はinit後即soft_reset_halt->フラッシュ書き込みで回避できました(OpenOCD-0.5.0)。
確証が完全にとれたらcfgファイル更新しときますね。更新しましま。

んでもって現在のOpenOCDのLPC2xxx系のフラッシュ書き込みはチェックサムを計算
して0x14番書き込んでくれる機能がありますがこれやってしまうとベリファイで引っか
かってしまいます(難儀だ)。
どうしてもベリファイしたかったらフラッシュメモリの0x14番地に割り込みベクタの
チェックサムを前もって計算してスタートアップに書き込んどくとOpenOCDからも
ベリファイすることができます
(割り込みベクタなんてほぼ固定ですしこれでも良いと思います)。
もちろんこれやる時はcfgファイル中の"calc_chacksum"は消しておくように!

JTAGkeyClone(FT2232系JTAG I/F)製作のすすめ


20130521追:
FT2232系デバイスを用いたJTAGKey/JTAGKey2製作に関しては
こちらを参照してください!











お仕事の方でサーボモータのおべんきょを一からしてます。
そもそもねむいさんは4年制大学を卒業したにもかかわらず就職氷河期の下、
20代後半まで介●の仕事をしながら本業の虹裏メイドをしていたので電気の分野は
ほぼ一からおべんきょなのですが、私の場合は元主人が遺したARMマイコンに
関するリソースが最初から大量にあったのでARMマイコンに関しては強くて
ニューゲーム状態だったのです。

とはいえまったくのどしろうとでもべんきょうさせてもらえながらちゃんとしごともさせて
もらえてさらにおきゅうりょうまでもらえるくみこみぎょうかいってすごいとおもいます。
ちなみにねむいさんのほんしょくのにじうらめいどはちょうぜつぶらっくでにんきのない
めいどは「」たちにすぐよごれきゃらのきゃらづけをされてあらしのどうぐにされてすてら
れるというれつあくかんきょうなうえにおきゅうりょうがはなくそていどしかもらえません。
ふぁっくです。

きょうのにっきおしまい。








…真面目に読んでしまった人すみません、続行します。



以前はJTAGの制御といえばPCのLPTポートに少しばかりのロジックデバイス、
おもに信号レベル変換のバッファが乗った回路を接続してI/O直叩きで制御
ってのが主流でしたよね。CPLD/FPGAを提供している各社もLPT接続タイプの
書き込みケーブルの回路を公開していて、趣味で開発やっている人も自作が
容易にできていました。

時は流れ、いまどきのナウでヤングでスタイリッシュなPCにLPTポートなんて
時代遅れのものは搭載されなくなり、代わりにUSB接続のダウンロード
ケーブルがメーカから提供されるようになりました。
しかし、USBのそれは各社のノウハウになっていて真似して自作できる
代物ではなくなってしまいました。
しかも安くても3諭吉くらいしてホビー用途には手が出しづらい。

しかしながら数年前くらいからFT2232等のJTAGのライブラリが
サポートされるデバイスが出てきて有志の人たちがフリーで多目的に
使用できるアプリケーションを作られてきました。




そのFT2232を使用したJTAGハードウエアで有名なのがAmontec JTAG keyですね。
容易に自作できるのでFT2232系は上記を含め多くの派生があります。それを通じて
ARMマイコン等のJTAGポートを備えたデバイスにアクセスできる(フリーで使える)
PC側のソフトは、OpenOCD、UrJTAG等などたくさんあります。

先の日記で何度か言及してますが、私もかみき氏の作例をベースに一つ
作成しました。2電源レベルシフタがミソです。氏の回路と違う点は、ターゲットに
電源供給する回路を廃したことと、外付けEEPROM(AT93C66A)の回路を追加して
Amontec JTAG keyに化かすことを目的としました。




自分自身の学習の意も含め、かみき氏互換のJTAGkeyCloneの回路図を起こしました。JTAGkey2Cloneに関してはこちらをご参照ください。

また、JTAGkeyCloneに化かすためのeepromのデータですが、こちらにある
JTAGKey用のデバイスドライバのZIPファイルを展開するとJTAGKey_eepData
というフォルダがあります。この中にあるamontecJTAGKey.eptというファイルを
MProgで読み込んでeepromに書き込んでください。
もちろんEEPROMの書き込みの際は先にFTDIのドライバをインストールして
おかなければなりません。
これは先のZIPファイル内のftd2xxというフォルダにあります。


20130521追:
JTAGKey/JTAGKey2製作に関してはこちらを参照してください!



以下JTAGkey互換回路を制御できるアプリの使用時の画面とかを。
詳しい使用記は以後の日記で幾つかをぽつぽつと。


IF誌付録LPC2388基板にOpenOCD+insightでデバッグ


asagaoでDWM誌2008年9月号付録のColdFire基板のEzPort経由のプログラム書き換え


OpenOCDで秋月ARM基板のRAMスタート


UrJTAGのSVF機能でDDT誌付録のLatticeXP2基板を高速にコンフィグ



fenrir氏作成のcblsrvのFT2232対応版を使用してxilinx IMPACTからコンフィグ
(注:fenrir氏によってISE11.x以降でも使えるようになりました!)


そして本懐のamtsvfplayerでSVFを再生…できねぇ!
20120215追:
amtxhal.dllはグルーロジック(非公開)が組まれたPORTB側のDS2432という
EEPROMに仕込まれたキー情報も読みに行っているのでクローンの場合は
amtxhal.dllを使用するプログラムは一切使えなくなります…が
amtsvfplayerくらいしか使われてるの見たことないのでJTAGkeyCloneでも
それ以外の用途では全く問題はありません。
JTAGkey系のCloneでsvf使いたいならUrJTAGを使いましょう。

Go to top of page