OpenOCD MB9BF121対応版

久しぶりのblog更新となります。なんか、制欲(制作意欲)が湧かなくてアニメを見たり、小説を読んだりとフラフラとしておりました。

ずいぶん前になりますが、Cypress(Spansion)からFM3の32pinパッケージ品が出ていました。一般に手に入るようになったのは昨年末くらいだったでしょうか(Digi-Key)。少ピン品が欲しかったのでサクッと買ってしまったのが冒険の始まりに……まっ、いつものOpenOCDへ対応させる事になってしまったのです。

MB9BF121は少ピンになったので、JTAGではなくSWDで繋ぐ必要があります。OpenOCDではFDTIを使ったドングルでSWD接続できるようになったので、JTAGkey cloneで試してみました。JTAGkeyのコネクタ変換基板とMB9BF121の変換基板を作成しています。

RIMG0631.jpg RIMG0630.jpg
RIMG0629.jpg

MB9BF121に搭載されているFlashは今までのと書き込みシーケンスが異なっていたのと、CRトリミングデータが消されてしまう現象(仕様)となっていたのでチョイ変どころではない変更になってしまいました。

mb9bf121_flash_size.png

MB9BF121のFlashは上図の様に1セクタ=8Kbyteです。4byte毎にセクタが入れ替わるというヘンテコな仕様では無くなってます。また、最終セクタ(SA7)が4byte分少ないです。この4byteはというと…CRトリミングデータ用の領域に使われちゃってるんですね。それも、SA7をセクタイレースしたり、FlashをチップイレースするとCRトリミングデータも消えてくれるというステキな仕様です。なのでこのケースではイレース前にCRトリミングデータを読み出し、イレース後に書き込む処理を追加しました。

Flashへのデータ書き込みのシーケンスが大幅に変わったのでこれにも対応しました。FM3、FM4、FM0+シリーズは全てFlash書き込み時は2byteアクセスする必要があり、OpenOCDからは直接2byteアクセスが出来ない(1byteアクセスを2回行う)仕様なので、従来からFlash書き込みシーケンスはアドレス依存しないように記載したソースコードから機械語を生成してRAMに展開して書き込んでいるのですよね。なので今回同様に対応しました。この時、FM4対応で入った方法を参考にインプリしています。

これらの対応で、OpenOCDからの書き込みではCRトリミングデータを消すことなしにFlashへプログラムを書き込む事ができます。

openocd_mb9bf121_fll_write_cr.png

対応したOpenOCDとMB9BF121のプロトタイプは【物置】に置きました。
これでようやくスタートラインに立つことが出来ました。
スポンサーサイト

tag : OpenOCD

insightのウィンドウでSJIS表示

ARM cortex-Mx のデバッグ環境には hilscher のnetX用に作成された insight(netX) を使用していました。無料で使えるし、お手軽だしというのが理由なのですが、日本語を表示しようとすると元のソースコードをUTF-8で保存しないと表示出来ませんでした。普段 Windows でソースコードを書いているのでエディタの設定はデフォルトでSJISになっていて、切り替えるのが面倒だな~と思ってました。といっても、UTF-8で保存すると日本語もちゃんと表示出来ると分かったのは極最近の事なんですがね。

そんなこんなでネット上を徘徊していると Hiroさん が「日本語に対応した insight」という内容で公開されている事を知りました。残念ながら、これではSJISのソースコードにある日本語を正しく表示してくれませんでした。そこで、Hiroさんのコード差分を見比べて、変更箇所を特定し、SJISを表示してくれる様にしようと頑張ってみました。

結論を言うと、SJISを表示してくれる様に出来ました。
ただし、超重大な問題が発生しています。それは…私にパッチを作成する技量が無いのです。configuer を実行すると実行環境に応じた Makefile を生成してくれるのですが、Makefile を編集出来ても、その Makefile を作る元を編集する事ができません。色々と試してみましたが、変更箇所が多くてどうにもうまく作成出来ないのです。

ベースにしたファイルは つるろぐ のファイルとパッチです。
これに SJIS 表示部分を付け足して私の環境でコンパイル出来る様にカットアンドトライで編集してコンパイルを完成させる所まで出来ました。

insight_6_8_x_jp.png

↑の用に、エディタでSJIS保存したソースコード中にある日本語を insight で表示出来ています。なんか insight の挙動が以前よりも不安定になった気がしますが…コネクションの前にレジスタウィンドウを開いておくと落ちにくい事が分かったのでよしとします。

コンパイルの手順は分かっているのですが、誰でもコンパイル出来る環境を作るのは自分の力量では無理な気がします。今回は Cygwin 上で i686-w64-mingw32 を使ってコンパイルしましたが、気力があれば 64bit版を作成して、パッチ作成も試みてみようと思います。

何気に libiconv を日本語対応しましたが、それだけでは日本語表示してはくれませんでした。それプラスGUI上での表示変換が必要です。

作成した insight(SJIS版) は例のごとく 【物置】 に置いておきました。

Ubuntu でクロスコンパイルを試み、MinGW で試み、最終的に Cygwin で試みてと長い長い道のりでしたが、折り返し地点までは来られたかと思います。因みに、insight は cvs 上で更新が進められていて、最近では 2014/05/28 に更新されていました。こっちへの対応は………。

OpenOCDのFM4対応

先日、秋葉原の某所で Spansion のマイコンである FM4 の評価ボード SK-FM4-U120-9B560 が先行発売されました。私がその情報を知ったのが発売日の1週間前で超焦りましたが、無事(?)半休を取ってGetしてきました(午後休がとれればそのまま秋葉原を散策できたのに…)。

RIMG0591.jpg

RIMG0594.jpg RIMG0595.jpg

乗ってるマイコンは MB9BF568R です。ES品ですが、そこは仕方がないでしょう。でもでも Flash:1024kbyte品です。Spansion さん奮発しましたね。それと、CMSIS-DAPに対応しているという触れ込み上それを実現するためのマイコンとしてUSB-STICK(SK-FM3-48PMC-USBSTICK)にも使われている Cortex-M3 の MB9AF312K が乗ってます。正直、CMSIS-DAP には興味ないのでこのチップいらないのですが…。何故興味ないかは……JTAGコネクタが付いてればそっち使った方が手っ取り早いからですね。ハイ。でもでも、評価ボードのユーザーズガイドにはCMSIS-DAP経由の接続方法しか書かれてないのです。JTAGは勝手に使って状態。

CMSIS-DAP, JTAG のどちらで繋ぐにも自分の土俵に持ってくるには OpenOCD で使える様にしないと駄目です。といっても OpenOCD は Cortex-M4F には既に対応しているので、追加対応するのは内蔵Flashの読み書き部分です。

内蔵Flashは富士通時代から受け継がれていて FM3 とほぼ同じです。古い MB9AFxxxシリーズ のコマンド形態ですね。ただ、セクタの切り方が FM3 と異なるので、このあたりはチマチマと編集するしかないです。大半が FM3 と同じ内容ですが、今後の事も考えて別ファイルを作成しました。一応、現時点で公開されている種類は全て網羅しておきましたが、試す環境がないので正常に読み書き出来るかは不明です。

FM4 に対応した OpenOCD と プロトタイププロジェクト を 【物置】 に置きました。OpenOCD は FM4 対応を優先としたので、Versaloon-SWD には対応していません。そのうち対応してやらねば…。FM4のパッチは OpenOCD の圧縮ファイル中に入れています。cfgファイルは ねむいさん の所のを少し変更して使わせてもらいました。

久しぶりに OpenOCD をコンパイルしたのですが、いつの間にか libftdi を必要としなくなってました。これにはビックリです。というか、libftdi のコンパイルが cmake を使っていて厄介だったので今後楽が出来ます。といってももうコンパイル方法は確立しているのでぶっちゃけどっちでも良いのですがね。あっ、でも未だに cygwin 環境では libftdi をコンパイル出来ていないのでそこはありがたいかもです。結局 OpenOCD 以外のソフトには必要だったりしますがね。

RIMG0596.jpg

fm4_prototype_project_v1_flash_write.png

fm4_prototype_project_v1_insight.png

JTAGkey clone で繋いで Flash へ書き込みして insight でデバッグしてみました。テスト用のコードなのでステップ実行して楽しむくらいの内容ですが。赤いジャンパはCMSIS-DAPを常にリセットするのに付けてます。本来は付ける必要ないのですが、かといって使わない物を動かしておくのも何だと思ったので止めておきました。

余談ですが、insight はいつも sourceforge に上がっているのを使ってましたが、日本語を表示してくれないのに少しというかかなり不満があったのですが、Hiroさんという方がその辺を解決させた insight をUPされているみたいです。まだ使ってないので使い心地はどうなんでしょう? arm-none-eabiに対応してなかったです。それと、sourceforgeの方でもファイルをUTF-8形式で保存すると日本語も表示してくれます。ようやくCygwin上でコンパイル出来るようになったのだけど、この事実を知って脱力しました…。

RIMG0597.jpg

この評価ボード、裏面に NAND-Flash, SRAM, SDRAM を付けることができるパターンがあります。これらを付けて遊んでみるのも面白いかもしれません。

tag : OpenOCD

tag : FM4

FM3のSPIを使ってみる

秋月にAQM1248Aを使ったSPI接続のLCDモジュール(とピッチ変換キット)が売られていたので、これに何かを表示させてみることにしました。

FM3でSPIを使う場合、CSIO(クロック同期シリアルインターフェイス)を使います。CSIOのモードはノーマル転送(I), ノーマル転送(II), SPI転送(I), SPI転送(II)の4種類あります。これは一般的なSPIモードと対応付けると下表の様になります。Spansion特有の書き方なのか、名称が紛らわしいです。なるべく一般的に出回っている規格に沿った名称にして欲しいものです。

SPI_01.png

ST7565R(AQM1248AのLCDコントローラ)はどのタイプを受け付けるかというと、ノーマルレベル=High, 立ち上がりエッジ読み込み…いわゆるmode3ってやつですね。つまり、FM3で実装する場合はノーマル転送(I)を使用する事になります。

ST7565RのSPI接続のクロックは、Max=20MHzの様です。一方、MB9AF312KではデータシートよりMFSはAPB2バスクロックに繋がっていてペリフェラルマニュアルの CHAPTER 2-1: クロック よりPCLK2の値になります。今回はPCLK2=20MHzとするので、ボーレートジェネレータの制約(注意事項にリロード値は3以上とあります)によりMAX=5MHzとなります。APB2バスクロックの上限は42MHzなので頑張れば8MHzとか出るみたいなので余裕があればやろうかな…。

SPI_03.png

USBSTICKのCSIO端子で比較的自由に使えるのが SOT3_1, SCK3_1 です。ch3はFIFOなしチャネルになります。AQM1248Aは出力をしないので、SIN3_1は必要ないです。これらを有効にする為に、GPIO周りの設定をします(PDOR5, EPFR07等々)。ペリフェラルマニュアルの CHAPTER 10:I/Oポートの 図2-1 を見るとだいたい必要なレジスタが分かってきます。もちろん、該当の章の内容をしっかりと読んでおかないと思わぬ落とし穴にはまってしまうことが往々にありますので、読むべき所は読んでおいてください。

SPI_04.png

CSIO関連レジスタの設定は表3-1に概要が記載されています。今回はFM3をマスターとして使用するので、SCR:MS=0, SMR:SCKE=1 です。

SPI_02.png

上記の表で決定しないといけない値はそれぞれのレジスタの詳細を参考にして設定します。注意点は…設定してから送信、受信を開始するって事くらいでしょうか。5MHz, 8bit, MSB firstで 0xA0 の出力が出ているかをオシロで確認してみました。やはりオシロで確認するのが一番ですね。といいつつ、まだまだ岩通のオシロ(UI)に慣れてなく、マニュアルを手放せませんが…。

SPI_07.jpg SPI_05.png

実は素のUSBSTICKとAQM1248Aを繋ぐのには問題があります。USBSTICKはその特性を生かして5Vで駆動されているのですが、AQM1248Aは3.3V動作なのです。USBSTICKの電源を外部から取り入れて3.3V動作させるというのもありるのですが、それではUSBSTICの手軽さが失われてしまいます。なので、今回はTC74VHC244FTを使って5.0V→3.3Vの電圧変換をすることにしました。入力側が5VトレラントになっているICなんです。幸いAQM1248Aは入力しかしないのでこのICで十分です。USB用に3.3Vを作っているのでVccを5.0Vと3.3Vで切り替えられる様に作ってくれても良かったのに…。

SPI_08.jpg

制御線はCS, RS, SCK, SOTの4本です。CS, RSはGPIOとして駆動させたピンを使います。

秋月の説明書ではAQM1248Aの昇圧様のコンデンサは2ms置きに段階的に有効にしていく様に記載されています。メーカ推奨手順と書いてありましたが、この2msが記述されている仕様書を見つける事ができませんでした。今回のプログラムでは2msという短い時間を作る構成になっていないので、min=10ms空けています。2ms以上なら良いだろうとの判断です。

SPI_06.jpg

画像データはWindows付属のペイントでモノクロ・ビットマップ画像を作成してモー配。でC言語用の配列に変換して使いました。そうです、自前品の宣伝です。便利ですよ~(^^

ソースコードは【物置】に置きました。
DMA転送を絡めてもよかったのですが、少し凝った作りを考えてますのでそのうちチャレンジしてみようと思います。

tag : FM3ペリフェラル

FM3のDMACの使い方

USB-STICK(MB9AF312K)でDMACを使おうとして調べていると、非常に読み辛いマニュアル構成になっているので、自分なりにまとめてみました。当面の使用目的はUART0の送信データエンプティ割込み発生時にDMACを使って送信データをセットする事です。

ARMコアを扱うようになって、Spansion(旧富士通)のマニュアルは共通化されるようになり、その副作用で必要な部分が複数のマニュアルにまたがる構成になってしまっています。慣れるまではとにかく全てをDLしてきて検索しまくるのが手っ取り早いでしょう。今回もそうやって検索していてようやく見えてきました。

DMACを大々的に扱っているのが ペリフェラルマニュアル です。これのCHAPTER 9にDMACの事が書かれています。で、小難しい話はすっ飛ばし、使用するレジスタはなんだ? と 5.1 レジスタ一覧 を見てみると、DMACR, DMACAx, DMACBx, DMACSAx, DMACDAx を使うんだな~というのが分かります。「これらを設定すれば使えるんだ…」なんて思っているとしっぺ返しを食らいます。実際食らいました…。


mb9af312k_DMAC_02.png


5.1 レジスタ一覧 の内容はあくまでもDMACへの設定内容だけ。ペリフェラルの割り込みをトリガにする場合は、この割り込み側にも細工をする必要があり、それらはレジスタ一覧に載っている内容以外の所にあります。

CHAPTER 9 を熟読すると「あれっ、このレジスタの説明は何処にあるの?」となる部分があります。流し読みしてしまった私はこれにはまりました。2.1 DMACとシステム構成 の項目です。ブロック図と各の説明が書かれています。


mb9af312k_DMAC_01.png


要は、DMACのトリガとして対応しているペリフェラルの割り込み信号をDMACが受け取るには、割り込み信号をDMACかNVICのどちらに伝えるかを DRQSEL/DRQSEL1 で切り替え、DQESEL を設定する必要があるということです。DRQSEL/DRQSEL1, DQESEL のレジスタは上記レジスタ一覧に出てきません。これが何処にあるのかと言うと…、CHAPTER 7の割込みの章にあるんですよね。MB9AF312Kの製品TYPEはTYPE5に該当します(データシートの概要部分に記載されています)。割り込みベクタのリロケート機能は使わないので 割込み(A)を参照する事になる(表1-1より)。


mb9af312k_DMAC_03.png


DQESELはTYPE2だけに存在するレジスタらしく、TYPE5には関係ないらしいので無視しておきましょう。残るは DRQSEL/DRQSEL1 の2レジスタ。これは各割込み信号を伝える先を選択するレジスタで、今回はUART0の送信割込みをDMACで使うので、MFS ch0 の送信割込み信号をDMACへ伝える様にします。

これで、MFS ch0 送信割込みが来るとDMACが起動して、DMACでの転送が全て完了するとDMAC ch0 の割込み(NVIC経由)が入る。というストーリーができあがります。ここで忘れてはいけないのが、転送完了した時の処理方法です。そのまま放っておくと送信完了割込みはDMACに繋がったまま。で実際に送信完了になるとDMACを呼び出すが、DMACは転送完了しているので何もしない。何もしないので、このままにしておくって手もありますが、次の送信をDMA転送を使うとは限らないので、DMAC割込みが上がったタイミングで送信完了割込みをNVIC側へ繋いでおくのが良いでしょう。設計思想次第ですが…。それと、NVICの手前で割込み信号を振り分けているので割込み禁止にしてもDMACへの転送トリガは入ってしまう事に注意です。

あっ、ここまできて何ですが、各ペリフェラルでDMAC転送可能かをCHAPTER 1: システム概要 の 表 1-1 ペリフェラル・アドレスマップ にDMAC転送可能/不可能の表があるので、確認しておく必要があります。MFSは "可" になってます。


mb9af312k_DMAC_04.png


上記の事を踏まえて、プログラムを作成してみました。
SWを押下するとUART出力に文字列を出力する例です。


mb9af312k_DMAC_05.png


UARTの送信設定をしておいて、実際に出力する時はDMACにその内容を設定→割込み要因通知先をDMACに切り替えてDMAC開始→UARTの送信バッファは既に空なので即時にDMA転送開始→UART送信→DMA転送→ … → UART送信完了→DMAC割込み発生→ここで割込み要因通知先をNVIC側に設定→UART送信割込み発生→UART送信割込みを無効化する。といった流れにしています。

連打は考慮していないので、SWを1回押したら文字が全て出力されるのを待ってから押すようにしないとよろしくない動きをしてくれたりします。今の文字サイズだとチャタリング除去処理でおそらくそんなことにはならないと思いますが。DMACの汎用ライブラリとしてはまだまだ作り込みが必要ですね。

mb9af312k_uart_tx_dma_sw.zip

ここで1つ疑問があります。
UARTの送信データレジスタ(TDR)は16bitレジスタです。bit0~bit8の計9bit分を転送するときは16bitアクセスする必要があると書かれているが、bit0~bit7の計8bit分を転送する場合の設定方法は記載されていません。TDR直書きの時は気にせず8bit感覚で設定していましたが、DMACの場合は明確に書き込みのbit幅を設定しなくてはいけなく、また8bitでないとデータの渡し方が面倒なので、8bit幅で書き込んでます。これで動いているから良しとしましょう。この辺、マニュアルに書いてくれないと分からないですよ~、Spansionさん。

tag : FM3ペリフェラル

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ RaspberryPi Linux トランジスタ式ミニワッター TRminiWatterPart4 MPD OpenOCD イーサネットコンバータ FON2405E DAC buildroot FM3ペリフェラル BeagleBoneBlack FM3評価ボード library OpenGL mingw ODROID-U2 TL-WR700N Edison bitbake KiCad 計測 VMware シングル FM4 ミニワッター 6N6P プリアンプ 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter