« 2013年7月 | トップページ | 2013年9月 »

2013.08.25

Artix-7用の拡張ボードの動作テスト

Artix-7でHDMI出力したり、ネットワークを使ったり、SD/MMCカードを使ったりしたい!!!

ということを手軽に試せるように、拡張ボードを作りました。

水曜日にP板.comの最短コースで4層基板で発注し、本日届きました。

左が拡張ボード、右が特電Artix-7ボードです。今日基板が届いたばっかりで、まだLANの部分のはんだ付けができていません。

Artixext_1

何が苦労したかというと、

  • HDMIコネクタの固定用の穴が長穴なのに、丸穴をあけてしまった
  • 最初、家庭用テレビにHDMIでまったく絵が出なかった
  • コネクタが干渉する

順番に説明していきます。

one

まず、HDMIコネクタは、ケーブルを抜くとき比較的強い力が加わるので、固定用の端子はみなスルーホールでできています。で、その固定用のピンは丸いピンではなく、だいたいが平べったい板です。

だから、基板も長穴にしなければならなかったのですが・・・coldsweats01

Artixext_connhole

このように小さな丸穴をあけてしまいました。これでは挿すことができないので、ちょっと切ったり加工してなんとか取り付けました。

two

次に、家庭用のテレビのHDMI入力につないだのですが、まったく絵が出ない。wobbly

これにはさんざん悩みました。配線の長さが長いからなのか?それともTMDSの各レーンの配線の差に問題があるのか?隣の配線と干渉しているのか・・・などです。

ピンを抜いてケーブルで引っ張って意図的に配線長を増やして、レーン間スキューを増やしてみたり、様々な実験をしたけどすべてダメでした。

一日中悩んで、回路図を見ならがら、先日作った万能基板の試作基板と見比べてみると、なんと、SDAとSDLがプルダウンされていて、HPDがプルアップされている!!

回路図の作図のときに、プルダウンとプルアップを間違えたようです。

試しに、この抵抗を外してみると見事に動きました。HDMIは、SDAとSDLをプルアップしなければ、テレビがソース機器を認識してくれないことがあるようです。

three

最後に、現在残っている悩みとして、この基板とArtix-7ボードを重ねるときにコネクタが干渉してしまうという問題があります。

Artixext_interfe_2

拡張ボードを下にするとLANのコネクタがぶつかるし、Artix-7ボードを下にするとUSB3.0のコネクタがぶつかってしまいます。

本当は、Digikeyに背の低いLANコネクタ 87180-388LF があったので、これを注文していたのですが、何を間違えたか、Digikeyは全く違う部品を送ってきました(この2週間は暑さのあまり中の人が間違えやすかったのか、2回も違う部品が届くという事故がありました)

この87180-388LFは、「TQFP144ピン版 RX63NのArduino互換評価ボード」で使ったことがあったので、今回も使おうとしていたのですが、今からDigikeyに注文していてはすぐに実験ができない。だから、上の写真はRSで買った適当なLANコネクタを使って撮影しています。

調べたところ、マルツで扱っているLinkmanのMJ11-KX06-0808-LFというLANコネクタが同一寸法形状のようです。これを使えばLANコネクタが干渉しないようにできるのではないかと期待しています。

もしくは、秋月電子の連結ピンヘッダを使えばいいんでしょう。

明日か明後日には秋葉原にいって買ってこようと思います。

| | コメント (0)

2013.08.23

Artix-7でぐるんぐるん

特電Artix-7ボードからHDMIを出力して、HDTV1080pでぐるぐる回る画像を出力することができました。

百聞は一見にしかず。まずは次の動画をご覧ください。

どうやっているかというと、基本的にアフィン変換で縞模様を回転させています。

つまり、画面の捜査している点をx,yとして(x=-960~+959,y=-545~+544)、

x' = xcosθ-ysinθ

y' = ycosθ+xsinθ

で変換した後の座標を求めます。ここでθは時間とともに増えていく値です。

Hdmiguruguru

x'とy'は-960~+959程度の範囲にあるはずです。この値のx'を赤の値、y'を緑の値とするとカラーのグラデーションが回転するようになります。ここで、x'やy'を引数にして三角関数のテーブルを引く(つまり、r_val = sin(2πn*x/1024)+α)ようにするとネオンサイン風の棒(というか、波のような棒)になります。ここでαを時間とともに増やすと、その棒が移動します。

あと、x'=0,y'=0ならば真っ白にします。これが中央で回転する十字になります。

こんな感じで、三角関数やら並行移動を計算して、1ピクセルごとにリアルタイムに計算し、HDTVに表示しているわけです。

特電Artix-7ボードやSpartan-6をお使いのお客様で、FPGAのソースコードをご希望の方には提供したいと思いますので、ご興味のある方はメールください。

| | コメント (0)

2013.08.22

Artix-7にMicroBlazeを入れてU-Bootが動いた!

Artix-7用Linux開発プロジェクトの一環として、まずはMicroBlazeを入れてU-Bootが動くようにしました。

こんな感じで、特電Artix-7ボードからUARTの線を取り出して、USB-UARTケーブルでパソコンにつないでいます。Artix-7のJTAG信号はPlatformUSBでつないでいます。

Artixuart

U-Bootをビルドするときに注意しなければならないのはエンディアンです。

MicroBlazeのバスがPLBだったころはビッグエンディアンだったのですが、AXIになってからはリトルエンディアンになっています。Xilinx MicroBlaze用のU-Bootはデフォルトでビッグエンディアンになっているので、リトルエンディアンに変更しなければなりません。

そして、うまくビルドできて書き込んでみたら・・・

Mbuboot

ちゃんと起動しました。

といっても、まだネットワークもSDカードも使えない、UARTだけのU-Bootですが、SRECの流し込みやなどはできるはずです。

まずはこれをROM化してMicroBlazeのファーストステージブートローダからU-Bootが起動できるようにしたいと思います。

おととい出図した基板が、明日、出来上がってきます。この基板にはEthernetやSD/MMCカード、HDMI出力などがついています。Artix-7ボードでLinuxを愉しむための十分な周辺部品が載っています。大森まで取りに行けば明日中には手に入りますし、ふつうに宅配してもらっても土曜日には試すことができるでしょう。楽しみです。

| | コメント (0)

2013.08.20

Artix-7拡張ボードを出図

本日、Artix-7拡張ボードを出図しました。

こんなボードです。

Artixexttop

裏面は、

Artixextbot

こう見えて実は4層基板です。品質に関わる部分はケチケチしません。

機能と特徴は、

  • Arduinoの形状
  • 100BASE-TX LAN
  • DVI HDMI出力
  • マイクロSD/MMCカード
  • USB仮想シリアルポート

です。

一方、Artix-7のLinuxの開発のほうも順調に進んでいます。まずは練習としてSpartan-6 Linuxを自力でビルドするとことから始めています。今年特電に入ったアルバイトさんはとても優秀な方で、驚くべき速度でXILINXの難解なツールチェーンの使い方を解読してくれています。今日、U-Bootの動作確認までできたとのこと。

そんな感じでArtix-7の開発を進めていたら、なんと、おどろくべきことが起きました。

来週の29日(木)に品川カンファレンスセンターで開催されるXILINXのセミナー「Xilinx All Programmable Day」の会場内ミニブースで、特電のArtix-7ボードを展示させていただけることになりました。

あと8日しかないので、急いでパンフレットやパネル、デモの用意をしようと思います。

| | コメント (0)

2013.08.17

特電Artix-7ボードでHDTV1080pの表示に成功

昨日、Spartan-6ボードでHDMI表示に成功したので、今日はArtix-7ボードでやってみました。

まず、特電Artix-7ボードにピンヘッダを立てて、万能基板に乗せます。ちょっとスイッチを可愛くしてみました。

Artixhdmiboard

HDMIコネクタは千石電商で270円で売られていたものです。万能基板にドリルで穴をあけて裏側からラッピングワイヤで配線を引き出します。

Artixhdmiboard_bot

TMDS信号のGNDは信号のリターンとして重要な意味を持つ配線なのでこんな処理方法でいいのかどうかは悩むところですが、後の実験では問題なくいきました。

SDAとSDLは4.7kΩでプルアップ。HPDは4.7kΩでプルダウン。CECはオープンです。

そして、XAPP495をArtix-7向けに書き換えます。XAPP495はSpartna-6向けに書かれたものなので、そのままではArtix-7でビルドできません。

変更すべき個所はいくつかあって、

  1. クロック入力部分のBUFIO2プリミティブを削除する
  2. OSERDES2プリミティブを使っているところをOSERDESE2に変える
    (serdesstrobe信号は不要になる)
  3. DCM_CLKGENは使えない。(MCMM_ADVとかを使うことになるのだろうけど未実装)
  4. PLL_BASE+BUFPLLの部分は削除して、CoreGenのクロックジェネレータに置き換える

です。

Spartan-6で使っていたDCM_CLKGENというのは何かというと、解像度に応じてPLLのMやDの値を動的に切り替えるためのDCMです。SPI通信を使ってPLLの比を変えられるというものです。ところがArtix-7には同じものはないので、今回は解像度固定で作りました。

あとはリセットボタンの極性などを直せば、Artix-7からSXGA(1280×1024)の60pが出力されました。

Artixhdmi2

sun

さて、次はいよいよFULL HDを動かします。

あらためてFPGAマガジンを読んでみたのですが、1920×1080pの場合のクロック周波数や、水平同期信号の幅や位置などに関する記述がまったくどこにもないですね。うーん。各解像度におけるクロック速度みたいな表はあったけど、なんか別のページにある表と違うし。筆者によってクロック速度が異なる!???

もうFPGAマガジンVOL1を解読するのはあきらめて、Interface2011年9月号を読みました。こちらにはちゃんとパラメータが書いてあります。

それを元に自分で書いてXAPP495に追加してみます。

//1920x1080@60HZ
parameter HPIXELS_HDTV1080P = 12'd1920; //Horizontal Live Pixels
parameter  VLINES_HDTV1080P = 11'd1080;  //Vertical Live ines
parameter HFNPRCH_HDTV1080P = 12'd88;   //Horizontal Front Portch
parameter HSYNCPW_HDTV1080P = 12'd44;  //HSYNC Pulse Width
parameter HBKPRCH_HDTV1080P = 12'd148;  //Horizontal Back Portch
parameter VFNPRCH_HDTV1080P = 11'd4;    //Vertical Front Portch
parameter VSYNCPW_HDTV1080P = 11'd5;    //VSYNC Pulse Width
parameter VBKPRCH_HDTV1080P = 11'd36;   //Vertical Back Portch

ところで、XAPP495の回路は水平カウンタが11bitで作られているので、12bitに拡張してあげなければなりません。結構たくさんの箇所があるので大変ですが、11bitの記述を全部つぶしていきます。

そして、HDTV1080P用のパラメータを定義したら、tc_hsblnkなどの信号を作るセレクタに、

SW_HDTV1080P:
begin
hvsync_polarity = 1'b0; // positive polarity tc_hsblnk = HPIXELS_HDTV1080P - 12'd1;
tc_hssync = HPIXELS_HDTV1080P - 12'd1 + HFNPRCH_HDTV1080P;
tc_hesync = HPIXELS_HDTV1080P - 12'd1 + HFNPRCH_HDTV1080P + HSYNCPW_HDTV1080P;
tc_heblnk = HPIXELS_HDTV1080P - 12'd1 + HFNPRCH_HDTV1080P + HSYNCPW_HDTV1080P + HBKPRCH_HDTV1080P;
tc_vsblnk =  VLINES_HDTV1080P - 11'd1;
tc_vssync =  VLINES_HDTV1080P - 11'd1 + VFNPRCH_HDTV1080P;
tc_vesync =  VLINES_HDTV1080P - 11'd1 + VFNPRCH_HDTV1080P + VSYNCPW_HDTV1080P;
tc_veblnk =  VLINES_HDTV1080P - 11'd1 + VFNPRCH_HDTV1080P + VSYNCPW_HDTV1080P + VBKPRCH_HDTV1080P;
end

という記述を追加します。

また、50MHzから148.5MHzを作るために、モジュールPCLK_GEN_INST内のPLLの比をM=37.125、D=6.25に設定します。もはや整数じゃありませんね。こんなすごい比に設定できるのがArtix-7のすごいところです。

そしてコンパイル。多少のタイミングエラーは気にしないでいきましょう。Artix-7のI/Oは本来1.4Gbpsの信号を出すようには作られていないのですから。

家庭用のテレビにつなぐと・・

Artixhdmi_fullhd

はい。このとおり無事に1080pで表示されました。

オシロで同期信号をみてみると、確かに設計したとおり垂直60Hz、水平67.5kHzになっていました。

汎用I/Oから1450Mbpsの信号が出せるとは、なんとおそろしいFPGAでしょう。

| | コメント (0)

2013.08.16

特電Spartan-6ボードでHDMI出力に成功

HDMIとかDVIとかいうものを無性に扱ってみたくなって、特電Spartan-6ボードで作ってみることにしました。何も予備知識がない段階でまず読んだのが、FPGAマガジンのVOL1。

しかし、これがさっぱりわからない。

  • 結局のところ、どんな信号を出せばいいの?
    (9ページの図5は、なんだかすごい絵だけど、2番目の絵の説明がない)
  • DVIとHDMIの画像の電気信号は同じなのか?
    (CECがないとかあるとかそういうことが知りたいんじゃないんだ)
  • XILINX FPGAの端子からHDMIに信号を出していいのか?
  • ソースコードはどこにある?ダウンロードできるの?有料?無料?
  • CECとかHPDとか、どう配線を処理すればいいの?
    (ホットプラグですなんて解説はいらない。Lになったらどうなる!?そういうこと書いてほしい)
  • とにかく回路図出せ!回路図!
    (変換ICの使い方の回路図なんていらない!)

各筆者がそれぞれいろんなことを書いているけど、肝心な部分は知ることができませんでした。

次に読んだのがInterfaceの2011年9月号。これを読んでようやくわかりました。長嶋毅さんの記事にちゃんと書かれていました。FPGAから直接HDMIに出す回路図もありました。

こうして疑問が解けました。

  • DVI-DとHDMIの電気信号は同じ。どちらもTMDSで、タイミングも同じ。おおざっぱに言えば、コネクタのピン配置が違うだけ。
  • XILINX FPGAの端子からHDMIに信号を出してよい。直列抵抗もプルアップもプルダウンもいらない。
  • HPDは10kΩでGNDに落とせばよい。

ということでした。

そして、ザイリンクスのアプリケーションノートXAPP495に付属のHDMI/DVI出力のコードをダウンロードしてきて、特電Spartan-6ボード用にビルドしてみました。

XAPP495には、dvi_demoとvtc_demoの2つのトップモジュールが入っていますが、使うのはvtc_demoのほうです。dvi_demoはHDMI入力と出力を試すもの(HDMI入力が必要)で、vtc_demoはカラーバーを出力するだけのサンプルです。

Vtcdemo_compiled

XAPP495はATLYSというボード用に作られているので、いくつか書き換えなければなりません。以下のように書き換えました。

① rtl\tx\vtc_demo.vの77行目を

BUFIO2 #(.DIVIDE_BYPASS("FALSE"), .DIVIDE(2))

から

BUFIO2 #(.DIVIDE_BYPASS("FALSE"), .DIVIDE(1))

に書き換える。これはATLYSボードのクロックが100MHzなのに対し、特電ボードのクロックが50MHzだからです。

BUFIO2はDIVIDE2で使ってはいけないというアンサーもあるし、もともとのアプリケーションノートが正しかったのかどうかはわからない

② UCFファイル(vtc_demo.ucf)の該当する部分を以下のように書き換える。

NET "RSTBTN"        LOC = "D6" | IOSTANDARD = LVCMOS33;
NET "LED<0>"        LOC = "F13" | IOSTANDARD = LVCMOS33;
NET "LED<1>"        LOC = "C11" | IOSTANDARD = LVCMOS33;
NET "LED<2>"        LOC = "C9" | IOSTANDARD = LVCMOS33;
NET "LED<3>"        LOC = "A9" | IOSTANDARD = LVCMOS33;
NET "SYS_CLK"       LOC = "D11" | IOSTANDARD = LVCMOS33;
NET "SW<0>"         LOC = "U13" | IOSTANDARD = LVCMOS33 | PULLDOWN;
NET "SW<1>"         LOC = "U15" | IOSTANDARD = LVCMOS33 | PULLDOWN;
NET "SW<2>"         LOC = "U16" | IOSTANDARD = LVCMOS33 | PULLDOWN;
NET "SW<3>"         LOC = "R10" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "DEBUG[0]" LOC = "U10" | IOSTANDARD = LVCMOS33;
NET "DEBUG[1]" LOC = "V11" | IOSTANDARD = LVCMOS33;
NET "TMDS(0)"   LOC = "N10" | IOSTANDARD = TMDS_33 ; # Blue
NET "TMDSB(0)"  LOC = "P11" | IOSTANDARD = TMDS_33 ;
NET "TMDS(1)"   LOC = "R8" | IOSTANDARD = TMDS_33 ; # Red
NET "TMDSB(1)"  LOC = "T8" | IOSTANDARD = TMDS_33 ;
NET "TMDS(2)"   LOC = "T4" | IOSTANDARD = TMDS_33 ; # Green
NET "TMDSB(2)"  LOC = "V4" | IOSTANDARD = TMDS_33 ;
NET "TMDS(3)"   LOC = "R3" | IOSTANDARD = TMDS_33 ; # Clock
NET "TMDSB(3)"  LOC = "T3" | IOSTANDARD = TMDS_33 ;

これでビルドします。

SW3,SW2,SW1,SW0はピンヘッダに出していますが、プルアップ、プルダウン、プルダウン、プルダウンとすることで1000の初期値を与えています。この1000という初期値を与えることで、XAPP495の回路はSXGA(1280×1024)の解像度になります。

sun

特電Spartan-6ボードの左下のところからHDMI信号が出てくるので、これをケーブルにつなぎます。

Sp6hdmi

本当はHDMIのコネクタを使いたかったのですが、あいにく会社においてきてしまったので、HDMIケーブルをぶった切って中から配線を取り出して直接つなぎました。

このケーブルは千石で買った 「YOKO イーサネット対応ハイスピード」と書かれた1mのHDMIケーブルなのですが、おそらくシールドの配線の取り方が間違っていると思われます。TMDSのデータ2のリターンがデータ1の配線のリターンを通るようになっています。MADE IN CHINAだし。

そして、家庭用のテレビのHDMI入力につないでみると・・・

Hdmitv

カラーバーが表示されました。ケーブルのピン配置の解析や、クロックの件で、ここまで結構苦労したので、これが出たときには感動しました。

テレビがハイビジョンなのにSXGAで出力しているので、「この信号は推奨していません」と出ています。次は1920×1080に挑戦してみたいです。

さて、本を読んでもわからなくて実際に触ってみてはじめてわかったことは、

  • CECはオープンで良い。
  • SCLとSDAは、プルアップしておけばよい。実際には使わない。
  • 5Vは供給しなくてよい。
  • HPDは、LでもHでもオープンでも、何でもよい

ということでした。最初、DDC(SDAやSCL)を使って解像度の情報をやりとりしなければいけないのかと思ったのですが不要でした。テレビは画像データを見て判断しているようです。

結論は、Spartan-6の汎用I/O※が8本(差動4ペア)あれば、外付け部品なしでHDMI出力ができる、ということです。

※Bank0,Bank2に限る。

次はこのデザインをArtix-7に移植してみたいと思います。

| | コメント (2)

MicroBlazeシステム拡張ボード

Spartan-6/Artix-7用の拡張ボード第一弾といたしまして、MicroBlazeシステム拡張ボードなるものを考えました。気の利いた名前が思い浮かばないので、ベタなネーミングでご容赦ください。

Mbduino_img

あからさまなDuino型のボードで、これを特電Spartan-6ボードや、特電Artix-7ボードに乗せて使うわけです。

そもそもこのようなボードを作ろうとしたきっかけは、「Spartan-6やArtix-7にMicroBlazeを入れて、SDカードや、LANをつかってみたりする実験がしたいときに、手軽に使えるものがほしいなぁ」という思いと「HDMIをやってみたい」という好奇心が融合して、このボードを作ることにしました。

8月15日の夕方に突然思い立って、およそ5時間で回路設計から基板設計という、我ながら即興設計です。

このボードの特徴と機能は、

  • 100BASE-TXのLANを搭載
  • LANのコネクタは背の低いコネクタのみ(トランス非内蔵型)を使うので、ピンヘッダとピンソケットを使って基板を重ねたときでも上の基板にぶつからない
  • その代りパルストランスをバラで乗せている
  • HDMI出力付(たぶん1920x1080x30pまではいける)
  • Arduino互換サービスピン(上側16本、下側6本)
  • MicroSD/MMC Microコネクタ
  • プッシュスイッチ(汎用)1個
  • Arduinoのアナログ端子は、Artix-7の内蔵A/D入力端子に接続される
  • 特電Spartan-6ボードまたは特電Artix-7ボードの上に乗せて使う

基板の表面はこんな感じ。

Mbduino_top

基板の裏面はこんな感じ

Mbduino_bot

このボードは単体では動かなくて、FPGAボードに乗せて使います。つまりこういう↓ボードの上に乗せて使います。

Artixboard

ところで、以前のブログにも書きましたが、もう、安い系のマイコンとか*duinoの互換機を作るつもりはありません。昨年、さんざんな目にあいました。

だから、このボードはMicroBlazeで*duinoを動かすためのものではなく、MicroBlazeでTCP/IPを動かしたり、FPGAからHDMIやDVIを試すための実験用ボードと位置付けています。

たしかにXILINXの純正評価ボードにはLANもSDカードもビデオ出力もあるけど、基板のサイズが大きくて邪魔だし、2.54mmピッチのピンヘッダではなくて基本的にメザニンコネクタだから、拡張する気にならないのです。

だから、このような手軽な手のひらサイズで、ピンヘッダで拡張できるボードとしてこのボードを設計しました。

最終目標はMicroBlazeでLinuxを動かすことです。コンソールだけのLinuxではなく、SD/MMCカードやLAN、HDMI出力も動かせる完全な形のLinuxのひな形を作ることです。そのためには独自デバイス用のドライバの作り方とかいろいろ勉強しなければならないことが多いので大変ですが、やりがいはありそうです。

| | コメント (0)

2013.08.09

残暑見舞い申し上げます

残暑見舞い申し上げます。

お客様宛に「かもめーる」を送らせていただきました。

昨日からインクジェットプリンタがフル稼働です。

Shochu2013_1

今日、459通発送しました。あと34通送る予定だったのに、はがきが足りない!

もう、この時期になると「かもめーる」の無地のインクジェットのはがきが売っていないのです。いろいろ探し回って墨田区の郵便局で見つけました。

来週月曜日には、残りの34通の発送を予定しています。

お楽しみに。

| | コメント (0)

2013.08.07

RXduinoのイーサネットライブラリの更新β1

とりあえず、本日のライブラリ&サンプルプログラムを当ブログにアップロードします。

rxduino-107ether1.zipをダウンロード

上のライブラリとサンプルプログラムは究極のRX62NボードやRaXinoをお買い上げいただいた特電のお客様がダウンロードできます。上のZIPファイルには、究極のRX62NボードとRaXino用のライブラリ、およびTCP/IPサンプルアプリが入っています。

GR-SAKURAで使いたいという方はこちらをダウンロードしてください。

「grsakura-etherlib.zip」をダウンロード  (2013/8/7 23:41更新)

サンプルアプリでは、pingやtelnet、nslookupなどが使えます。

Rx_ether_4

sun

中に入っているlibtkdnhal.aとlibtkdnip.aのライブラリを入れ替えれば新しいライブラリで動くようになるはずです。

今回のライブラリからは、tketh_processをループの中で呼び出す必要はありません。呼び出しても害はありません。

sun

TCPのクライアント側はかなり良くなったと思います。

サーバ側はまだ手を付けていません。サーバ側の整備は今夜から行います。

| | コメント (0)

RXduinoのネットワークまわりが動かない理由

RXマイコンをArduino風にするライブラリ「RXduino」のネットワークまわりをデバッグしています。

このライブラリはとても不安定だったのですが、その理由は、イーサ受信割り込みを使って駆動していると、あるとき突然受信できなくなってしまう、という問題を回避するため、割り込む駆動ではなくloopの中で繰り返しイーサ受信関数 ether_read() を呼び出していたという点にあります。

イーサ受信関数の中では、エラーパケットなどによってETHERCが受信停止している状況を解除して、受信バッファをクリアするので、エラーからの復帰に使えたわけです。ルネサスのアプリケーションノートにあるWebサーバのサンプル(lwipだかuipを使用)でも、loopの中で繰り返し受信関数を呼び出していました。

ところが、この仕様がとても問題なのです。イーサが正常に動作するには、常にtketh_processという関数を繰り返し呼び出してやらねばなりません。

たとえば、getchをやって受信待ちになっている間にARPとかのパケットを受信しても応答できないわけです。

そこで、まずは「受信割り込みでイーサ受信処理を行う」というところから手をつけました。

少し想像が入っていますが、RXのイーサ受信のしくみは次の図のようになっています。

Rx_ether_1

ハードウェアが受信したデータは、いったん、受信FIFOというものに入ります。受信FIFOはペリフェラルの中にあって、メインメモリとは別の場所にあります。ユーザはこの受信FIFOを操作できません。

受信FIFOにデータが入ると、EDMAC(イーサ専用のDMA)が起動して、メインメモリの中にそのデータを転送します。

普通は受信FIFOに入ったデータはすぐにEDMACによってメインメモリに転送されるのですが、受信FIFOの大きさは2048バイトしかありません。そのため、1400バイトのパケットを2個、ものすごく短い時間に受け取ると、ひょっとすると転送が間に合わないことが起こるかもしれません。

Rx_ether_2

こういったことが起こると、

① EDRRRフラグが0になって、ETHERCが受信を停止する

② 壊れたディスクリプタがメインメモリ上に残ってしまう

ということが起こるようです。

①の問題はイーサ受信関数 ether_read() を呼び出せば回復しますが、②の問題を回復させるには、2回以上呼び出さなければならないのです。なぜならば2個以上のディスクリプタが壊れているためです。

この問題はどうやら解決できたようで、loopの中で繰り返し受信関数を呼び出さなくてもよくなりました。

その結果、極めて安定するようになってきました。

EXPINGを1000回打ってもノーエラーです。UDP負荷プログラムで負荷をかけても落ちません。割り込み駆動でここまで安定に動作するようになったのは初めてです。

Rx_ether_3

開発途中のライブラリと、サンプルアプリは当ブログの次の記事に掲載します。

| | コメント (2)

2013.08.02

RXマイコンでCMSIS-DAPをつっついてみた

ARMのデバッグ用アダプタであるCMSIS-DAPがどういう動作をしているのか解析しようとして、RXマイコン(究極のRX62Nボード)のUSBホスト機能を使って、CMSISにさまざまなパケットを送ってその挙動を解析しています。

Rxcmsis

RXマイコンにはUSBホスト機能があるので、RXduinoライブラリを使えば簡単にパケットを作って送ることができるわけです。

作業中の画面はこちら。

Analyze_cmsis_packet1

USBパケットアナライザ(左上)では、RXマイコンから送ったパケットや、CMSISから返ってきたパケットを表示しています。

左下はRXマイコン上のコンソール画面。任意のパケットを入力して、CMSISに送って、CMSISから返ってきたパケットをRXで解析して表示します。

右の画面は、解析結果をメモしているところです。デバッガ上のLEDを点滅させるくらいのことはできました。

sun

なんでわざわざRXマイコンを使っているのかというと、CMSISはHIDのクラスになっていて、パソコンから任意のパケットを送る方法がわからないからです。

HIDといってもマウスやキーボードではなく、サブクラスが0の0とい謎デバイスです。パソコンからどうやって操作すればいいのかわからないので、RXマイコンを使うことにしたきっかけでもあります。

RXマイコンは、RXduinoのUSBホストライブラリを使えば、任意のエンドポイントに好きなデータを送ったり受けたりできるので、とっても楽です。

しかも、究極のRX62NボードはUSBのポートが2つあって、1つをUSBホスト、もう一つをUSB仮想COMポートにできるので、こういう作業がとても楽にできます。

sun

最終的には、CMSISやCoreSightの仕組みを解析して、RXマイコンを通じてCORTEXをデバッグできるようにしたいです。

| | コメント (1)

RXduinoで複数のSPIポートを使えるようにした

あるお客様から、究極のRX62NボードでRSPI0を使いたいというご要望をいただきました。

そこで、RXduinoのSPIのプログラムを見直してみると、なんと! ボードごとに使えるポートが固定されてしまっているではないですか。これでは拡張性がなさすぎる。我ながらひどい設計でした。

そういうわけで、SPIのライブラリを作り直しました。その名もspi_ex。

試しに、究極のRX62NボードのPORTCから2番目のSPIの配線を引き出して、基板外のSPI ROMにつなげました。

Rxduinomultispi

究極のRX62Nボードには既にSPI ROMが乗っているので、異なるポート(RSPI0とRSPI1)につながった2つのSPI ROMにアクセスできます。

サンプルプログラムはこんな感じ。2つのSPI ROMのIDCODEを読んでみました。

#include <tkdn_spi_ex.h>
void setup() {
  spi_str spi1,spi2; // 2つのSPIを用意する

  spi_init_ex(&spi1,SPI_PORTEX_BA0); // RSPI1 SSLB0-A
  spi_set_bit_order_ex(&spi1,SPI_MSBFIRST);
  spi_set_bit_length_ex(&spi1,32);

  spi_init_ex(&spi2,SPI_PORTEX_AA2); // RSPI0 SSLA2-A
  spi_set_bit_order_ex (&spi2,SPI_MSBFIRST);
  spi_set_clock_divider_ex(&spi2,SPI_CLOCK_DIV128);
  spi_set_bit_length_ex(&spi2,32);
  ・・・
}

void loop() {
  unsigned long recv;
  recv = spi_transfer_ex(&spi1,0x9f000000); // コマンド送信
  printf("Onboard SPI ROM JEDEC ID=%08lx, \n",recv);
  recv = spi_transfer_ex(&spi2,0x9f000000); // コマンド送信
  printf("External SPI ROM JEDEC ID=%08lx, \n",recv);
}

実行結果は、

Rxduinomultispi_result

このようにして、2つのSPIのIDCODE(SST25V32,BF-24-51と AT25DQ321,1F-87-00)が読めるようになりました。

sun

ライブラリの更新差分はこちらに置いておきます。

サンプルプログラムはこちら「userapp.cpp」です。

どうぞダウンロードしてみてください。

sun

来週からは、RXduinoをいろいろバージョンアップしたいと思います。

  • 複数の任意の周波数をハードウェア・タイマーで出す関数
  • TMRタイマをユーザ用のタイマにするライブラリ
  • イーサネットライブラリの改良
  • 端子割り込みを16ポート以上にする

などを予定しています。

ご期待ください。

| | コメント (0)

« 2013年7月 | トップページ | 2013年9月 »