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-ROM
SST25VF032B-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.75ボルトになるはずですが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を使ってプログラムをSPIFI-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のWin32bit
版バイナリ
はこのパッチを適用しています。(下述の書き込みスクリプトも同梱してます)

今回使用するデバッガハードウエアは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が使えるインターフェース"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として
使うためのピン配置があべこべだったのが元の正しい形?に戻っています。
私のぶろぐを参考にSTM32VL Discoveryを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デバイス用のペリフェラルライブラリが出たりBeagleBoard-xMの購入
合戦に勝利したもののまったく火入れしてなかったりDE0-Nanoを購(ryたり今後を見越
してステーション型半田こてPicoScope 3206A購入したり東海自然歩道のサブルート
探訪も笠置まで進んでたり
そうこうしてるうちにSTM32F2シリーズも普通に購入でき
ようになってたりする昨今、いかがお過ごしでしょうか?
震災を境に身の回りの状況が一変してしまいましたが、ねむいさんはいないさんをひ
ざに乗せてくんかくんかしつつできることから着々と取り組んでいく所存でございます。





勘違いや無知無学が祟って時間を食ってしまいましたが、STM32F207VGT6でSDIOと
Chan氏謹製のFatFsを連結させて安定動作できるまでになりました。SDIOはもちろん
DMAを使って高速に転送可能です♥以前のSTM32F103VET6のものと同じ条件でRead
の速度を比べると若干の向上が得られました!
un
un
SDカードだとSDIOは25MHzまでしか出なかったり(MAX48MHz)カード自身の転送速度
もボトルネックになってるとは思いますが、小規模のマイコンでもこんだけ早かったら御
の字ですよね〜。


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

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



んでもってSDIOとFSMCの高速な転送を利用して動画再生も試みました。Chan氏のLPC2388
向けの動作再生ルーチンをチューンアップしないでまんま利用してもQVGAサイズで29.97fps
な動画も余裕で再生できたので相当"ぱわふりゃーなので余裕"なの確認できました。やっけ
つだけど一番乗りだからどっかにアップしたいな〜
・・・と思ってるてるうちにどこかの誰かが私と同じようにSTM32F2シリーズのMCUを使った
らしい作例で先を越されてしまいました・・・。扱ってる動画の内容とかアップロード先が虹裏
メイド的に一発アウト
なヤバい代物なのは置いといて動画が暗くて荒くて何をしたいのか
分からないとかもういい加減にしろって感じだよ(棒読みで)




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





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

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

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

un
un
もちろん外付け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と燃えないゴミにわけます。
  un


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


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

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

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

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

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

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

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

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

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

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

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

  un
  un
  un

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


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

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

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



…というわけで余り物の材料かき集めたら1000円以内でCortex-Mx系のライタ/デバッガ
が手に入ってしまいます。STM8S-Discoveryを買ってしまった人は玉砕覚悟で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互換なミニボードだそうです。周辺が全くない代わりにほぼすべての
 IOが外部に引き出されています。


↑即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基板を高速にコンフィグ


HappyJTAG2とかいう怪しいのでAVRにJTAG経由で書き込み


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