2015年4月30日木曜日

テスラさんに出会えた幸運

某月某日、といってもつい最近の出来事ですが、テスラさんに遭遇してしまいました.ニコラ・テスラに出会ったのではもちろんなくて、自動車のテスラです.

レアなクルマも居るもんなんですねぇ...

恵比寿から青山へ抜ける道をバイクで走っていて、TAXIの後ろをトロトロとついて行ってたとき、TAXIの前になにやらテンパッた運転の高級車が路地から右折で割り込んできました.
危ねぇかも、、、と思って警戒しつつTAXIの後ろをついていきましたが、ほどなくして南青山七丁目の信号でつかまって、そのテンパリ高級車の右の車線で斜め後ろにわたしは停車しました.

見慣れない車種だったので、電脳との一致を試みましたが適合する車種が判明せず、外部記憶とも照合したのだけれど、該当車ナシってことで、「アストン・マーチンの新型なのかな?」とわたしのゴーストがささやいていました.
けれどリアを見ると、なにか見たことのない謎めいたエンブレムがついてるじゃありませんか? こんなの在ったっけ??? 支援AIも照合不能メッセージを送ってきてます.

え~なになに?と思ってリアの文字を読んだら「TESLA」だったんですねぇ.日本でも走っているんだって感銘をうけました.燃えるなよ、リチウム...

プリウスのようにUFOみたいな疑似アイドリング音を発しているのかと興味が湧きましたけれど、こちらはヘルメットを被っているし行き交うクルマの騒音で聴取できませんでした.残念.

いったいどんな人が運転してるんだろうと運転席を見たら、
ハンドルを抱きかかえるように前のめりになってるのはただのオバサン
またしても意外な展開です.
テスラってエンスーが乗るような、好事家のためのクルマだとばかり思っておりましたものでね.ハンドルを抱きかかえるように前のめりになって運転するオバサンにならベンツのEでも与えとけとばかり思っておりますものでね.だがしかし、アセッて強引な右折しちゃう奥様でも乗って幸せになれるのならテスラというクルマってのは良いクルマなんだろうと認識を改めねばならん...

あれ? 助手席に男性が居る? 営業マン風の30歳ぐらいの男性が助手席に乗ってます.なんだか主従関係が逆転してるなぁ.と思ったらその男性が助手席側からウインカーレバーの使い方をレクチャーしてるじゃありませんか? ぁぁ試乗車ですか.それでアセッった運転してたんですね.事情を飲み込めました. (今調べたら、六本木にTESLAの販売店があるようです)

奥様が試乗されるTESLAは高速3号へと入って行きました.

かしこ


人気ブログランキングへ

2015年4月29日水曜日

Corei7よりも速いCeleronがあるという微かに心の痛む話

IntelのCorei7とwidows7が流通し始めて1年後ぐらい、2010年に買ったDELL Studio 17/1747を今でも使っています.17インチの巨大サイズでずっしりと重いです.

FPGAの論理合成などにも使うつもりだったので処理が高速なノートPCが欲しくて、Corei7が乗ったこの機種を買いました.2010年にしては破格の¥99800ぐらいでした.あの時のDELLがどうしてあんなバーゲンをやっていたのかは不明です.現在でもCorei7+17inchLCDだと最安値が同価格帯ですから.

ところがこの機種が、Corei7を100%負荷で計算させると見る間に動作が遅くなってブツッとサーマルシャットダウンしてしまうという、熱設計がどうなんだかねぇと思ってしまう機種なのです.エア流路を掃除してもこの熱ダレ状況は変わらずで、これから迎える夏の季節はますます悩ましい.MPEGの圧縮とかでCPUをブン回す時には、下から扇風機で冷却するコトまでして使っています.ちなみに載っているCPUはCorei7 720Q 1.6GHzで TDP 45Wですから、さほど発熱の多いCPUではありません.Turboモードでclockが最高2.8GHzまで上昇した時にヤバいのではと推測してます.

そんな不便さのため、そろそろPCを買い換えたくなってきているこの頃です.ノートはやめてデスクトップを自作するか?と思って、いろいろなCPUを調べたら、DELL Studio17/1747が搭載しているCorei7よりもベンチマークが高いCeleronが存在するコトに気付いて驚いているところです.

参考にしたのはこちらのページです.x86系の古今東西のCPUを網羅してるみたいです.

↓これがそのサイトから抜粋したCeleron G1850 2.9GHzのベンチマーク(3095)と、Corei7 Q720 1.6GHzのベンチマーク(3052)です.
5年前のCorei7を僅かながら超える現代のCeleronがあるっていうんだからCeleron侮りがたしです.G1850はclock周波数が2.9GHzなので高速であるようです.Celeron G1850は今フツーに出回っており、最安¥6275で価格.comに出てます.Corei7と謂えども5年も経てばCeleronにすら追い越されちゃってるという超現実に心がシクシクと痛むのが人情ってものじゃありませんか.

ちなみに、現在最速で値段が10万円を軽く超えるであろうCorei7 5960X 3GHzのベンチマークは16004ですって... 金の力はすごいぜ.

-----
最近AMDが出したAM1 socketの廉価版CPUがあります.Athlon Quad-Core 5350 (¥6350)というのがそれでして、これのベンチマーク値=2608で、同価格帯のCeleron G1850に負けています.当初はAthlon Quad-Core 5350で組もうかと思ったのですが、Celeron G1850を知って候補から脱落しました.

-----
ちなみに、わたしが他に所持しているPCのベンチマークはどんなかというと、AMD A8-55004023です.これがわたしの最速機種.BDのオーサリングなどに使用中.
録画マシーンとして使っているAthron II x2 250のベンチマークは1885で他のPCに見劣りしますがとくに不自由は感じていません.
先日LinuxをインストールしたEPSON NP11は、Atom D425 1.8GHzが載っていて、こちらのベンチマークはなんとたったの350しかありません.やっぱAtomって遅いんだなとしみじみ実感.

----
これらのベンチマークが実際の計算速度を反映しているのかどうか?をpov-rayというレイトレーシングソフトで試してみました.こんな複雑なレンダリングをやらせます.512x384画素で、アンチエイリアシングを入れています.
ベンチマーク値(引用)とレイトレ所要時間(実測)は、こんな相関でした.わりと相関しているように思いました.
    AMD A8-5500             4023      321秒    (メモリ4GB)
    Corei7 Q720 1.6GHz    3052      538秒    (メモリ8GB)
    Atom D425 1.8GHz        350      4722秒   (メモリ1GB)

1990年代の初め頃、MacがMC68040+コプロセッサで動いていました.そのMacでガラス玉のレイトレするのに数時間かかってしましたが、いまやこんなに複雑なモデルを500秒でサクサク計算できるんだからすごいや.AtomですらMC60840+コプロの10倍ぐらい高速なのではなかろうか?

というわけで、侮りがたしなCeleronでPCを組もうと思った次第でありました.

かしこ


人気ブログランキングへ

2015年4月28日火曜日

【Raspberry Pi】 ラズベリーパイ2を動かしてみた

買ったけど1ヶ月ほど放置していた「ラズベリーパイ2」を動かしました.

【電源】
Raspberry Pi は最大で650mAぐらい消費する可能性があるらしいので、PCのUSBポートだと電流不足なので、最大2AのUSB充電器を5V電源として使いました. (650mAはラズパイ1の話なので、ラズパイ2はもっと省電力なのかもしれません)

【いきなり通電】
初期状態でSDも挿さずに通電しても、HDMIの画面は真っ暗で何も表示されません.やっぱOSを入れなくちゃダメだわ.このブランク状態ですとUSB 5Vは50mAしか消費してませんでした.
【OS入手】
OS入手のため、こちらにアクセス.   http://raspbian.org/
debian LinuxのRaspberry版ということで「ラズビアン」と読むのでしょうか? なんだか百合っぽい名前だなぁ.まぁ深く考えるのはよしておこうと思ふ.

そのサイトで、
2015-02-16-raspbian-wheezy.zip (974MBもある) 
をDL.気長に待つ.これを解凍すると、
2015-02-16-raspbian-wheezy.img (3GBもある)
が現れる.これがPC Linuxでもお馴染みのdisk imageって奴.

別途、disk imgをSDカードに書き込むツールが必要です.win32diskimagerで検索して、
Win32DiskImager-0.9.5-binary.zip
をDL.これはSDにimageを書き込むツールですからOSとは関係ないですが無いと困るツールです.

win32diskimagerを起動するとこんな画面.image fileにさっき解凍した.imgを指定して、DeviceがSDカードのドライブ番号であるコトを3回ぐらい指差呼称してから、おもむろにWriteボタンを押す.ちなみに、SDカードは8GBを使いました.10分ぐらいで書き込み完了.

【OS起動・設定】
Rapsberry Pi 2のSDカードスロットにOS imgを書いたSDカードを挿す.(奥までは挿さらない)
↓ここで立ち止まってしげしげと基板を観ると、LSI chipがたったの3つしか乗ってないんだよね.Audio DACすら無いんだもん.電源ICはあるけど.なんだかSoC極まれりですね.そのうちLAN/USBもSoCになるんだろう.SDRAMはSoCにならないかもですが...
電源投入し起動時にUSB 5Vの消費電流は350mAが最大でした.(瞬時的にはもっと大きいかも)

↓するとHDMIで接続したディスプレイにこんな表示が出ます.PCのマザーボードのBIOS設定画面に似た雰囲気です.
↓ここで、キーボードを接続してないコトに気づき、アタフタとKBDを探して小さいのを見つけました.ラズベリーパイ2が小さいのにKBDが大きくてなんだかバカピーみたいです.
↓設定menuにはこんなのがあります.
Enlarge filesystem
必ずやるべきなんじゃなかろうか? 一瞬で終わる.次回起動時にfilesystemが大きくなってるとかいうメッセージが出る.8GBのSDを入れたので、4GBぐらいはユーザーが使えるのかしら?

Change user password
passwordを聞かれる.やる気がないので4桁の誕生日を入力しました.

Enable boot to desktop/scratch
ログイン画面がtext画面なのか、GUIなのかを問われているらしい.GUIにしました.

Internationalization options
-change locale    なんとなく EUC-JP にしておきましたが、それが吉なのかどうかは謎.その後、default localeは「英語でいいか?」と聞かれるので英語にしときました.
-change timezone         GMT+9にしました
-change KBD layout     放置

Enable camera  放置
Add to Rastrack   放置      地図応用サービスらしい
Overclock    放置
Advanced options     放置

↓設定を抜けると、GUIが起動しました.画面解像度は1920x1080です.
↓ここでさらにマウスを追加.ちいさいRaspberry Pi 2に比較して周辺機器がやけに巨大に見える.Raspberry Pi 2のUSBは4ポートあるので、これでまだ2ポート余っています.
↓スタートメニューの風景.PC Linuxほどはゴテゴテとしたアプリは入ってません.SDカードがすぐに満杯になってしまうからだと思います.
↓なぜかmathematicaが入ってます.通常のPCで動かすよりも計算速度が20~30倍遅いらしい.
【動画を再生してみる】
GUIのレスポンスは悪くないです.Atom CPUのマシンよりもGUIの動作は機敏です.4 Core CPUの恩恵なのかもしれません.

Terminalはbashが起動しました.デフォルトで gcc はさすがに動きました.ifconfigも動きました.

telnetは入ってなかったので、入れました.
sudo apt-get install telnet
sudo apt-get install telnetd
これでPCからrloginできました.Atom CPUのマシンよりも、net越しのレスポンスは速いです.

動画再生をしたくて、vlc playerをインストールしてみました.
sudo apt-get -t wheezy-backports install vlc
これがなぜかダメなので、素直に、
sudo apt-get install vlc
こうしたらvlcをインストールできました.

↓terminal上でvlcと打つと、DISPLAY=:0.0とかしないでもいきなりvlc playerが起動しました.なんという手回しの良さ、、、  しか~し、mpegファイルの再生はできなかった.1枚目の画面でfreezeという症状.
どーせcodecの問題じゃろってコトで、これを導入してみたがやはりダメ.
sudo apt-get install libavcodec-extra-54

そしたら、omxplayer というのがRaspberry Pi向けにあるそうで、
sudo apt-get install omxplayer
とやったら、既にインストールされていると判りました.なんという手回しの良さ、、、

しか~し、やはりmpeg2を再生できません.

vlcとかavcodecをインストールしたのがアダになったかと思い、両者をuninstallしてみましたが、やはりomxplayerでmpeg2を再生できませんでした.

それで、もう一度、disk imageをSDカードに焼き直して、クリーンインストールしてみたけれど、やっぱりmpeg2をomxplayerで再生できませんでした.

↓omxplayerはmpeg2を再生できないのか? と思い、mp4にコンバートして試してみました.
omxplayer -o hdmi /media/8GB/pyun.mp4
そしたらmp4ならば再生できました.mpeg2もcodec次第ではpmxplayerで再生できるのかもしれませんが、その情報は持っておりません.
omxplayerのインターレースによる走査線の乱れが気になったので、デインターレース オプション -dを試みましたが改善しませんでした.また、omxplayerで再生すると全画面表示になってしまいます.

ちなみに、上記コマンドラインの /media 以下のパスは、挿したUSBメモリのパスです.近頃のLinuxは自動的にmountされるようで手間いらずでいいですね.

ネット越しの動画ファイルも再生できるようですからなにげに便利かもしれません.

「ピュンピュン丸」再生におけるUSB 5Vの消費電流は360mAでした.

かしこ


人気ブログランキングへ

2015年4月27日月曜日

【謎の彼女X】 2015星雲賞コミック部門にノミネート

とても久しぶりな「謎の彼女X」の話題です.

第46回星雲賞コミック部門の候補作品として「謎の彼女X」がノミネートされました.

ハサミが趣味の卜部美琴に報告したら星雲賞なんか知らないって言ってました.(T_T)

星雲賞への投票は、こちらのページで誰でもできるみたいなので、皆さんもお好みな作品に一票を投じてはいかがでしょう?

今年のコミック部門ノミネート作品はこうなっています.
 『新世紀エヴァンゲリオン』全14巻
 『もやしもん』全13巻
 『ああっ女神さまっ』全48巻
 『神のみぞ知るセカイ』全26巻
 『月光条例』全29巻
 『謎の彼女X』全12巻
へ~っ完結したのかぁ、、、と思う作品がチラホラですねw.

しかしどう考えてもこのラインナップだと、星雲賞を獲得するのはアレだろうと思ってしまいますがいかがなものか??? もちろん「謎かの」に頑張って欲しいですけど.

↓ちなみにこれが過去の星雲賞(コミック部門)受賞作品のリストです.以下引用.

1970年代
78 地球(テラ)へ…(竹宮惠子) 79 不条理日記(吾妻ひでお)

1980年代
80 スター・レッド(萩尾望都) 81 伝説(水樹和佳) 82 気分はもう戦争(大友克洋) 83 銀の三角(萩尾望都) 84 童夢(大友克洋) 85 X+Y(萩尾望都) 86 アップルシード(士郎正宗) 87 うる星やつら(高橋留美子) 88 究極超人あ〜る(ゆうきまさみ) 89 人魚の森(高橋留美子)

1990年代
90 So What?(わかつきめぐみ) 91 宇宙大雑貨(横山えいじ) 92 ヤマタイカ(星野之宣) 93 OZ(樹なつみ) 94 DAI-HONYA(とり・みき)/ グラン・ローヴァ物語(紫堂恭子) 95 風の谷のナウシカ(宮崎駿) 96 寄生獣(岩明均) 97 うしおととら(藤田和日郎) 98 SF大将(とり・みき) 99 ルンナ姫放浪記(横山えいじ)

2000年代
00 イティハーサ(水樹和佳子) 01 カードキャプターさくら(CLAMP) 02 プラネテス(幸村誠) 03 クロノアイズ(長谷川裕一) 04 彼方から(ひかわきょうこ) 05 ブレーメンII(川原泉) 06 陰陽師(夢枕獏・岡野玲子) 07 ヨコハマ買い出し紀行(芦奈野ひとし) 08 20世紀少年、21世紀少年(浦沢直樹・長崎尚志) 09 トライガン・マキシマム(内藤泰弘)

2010年代
10 PLUTO(浦沢直樹・手塚治虫) 11 鋼の錬金術師(荒川弘) 12 機動戦士ガンダム THE ORIGIN(安彦良和) 13 星を継ぐもの(ジェイムズ・P・ホーガン・星野之宣) 14 成恵の世界(丸川トモヒロ)

いやはや、♪思い出~がいっぱい♪と歌ってしまいますー.

昨年の「成恵の世界」にはかなり驚きを禁じ得ず.ずいぶん前にアニメ化されて観ましたけど、完結したの去年でしたか、、、長い.星雲賞を受賞するほどだったのかな、アニメは記憶に薄いけれど.ファン投票ですから「関係機関」がフル回転したんだったりしてw.
ジョジョがノミネートされる日はいつ訪れるのだろうか?

かしこ


人気ブログランキングへ

2015年4月26日日曜日

オーロラと公開鍵とスペースデブリとクラッシャージョー

ダンブラウンの小説というと、なぜか「デセプション・ポイント」を読んだっきりなんですが、それに米軍のデルタフォースの暗殺部隊が操縦する「オーロラ」という航空機が出てきます.シャーベット状の水素を燃料として、マッハ6で飛ぶとか.
----「殺センセイ」のマッハ20よりはだいぶ遅いが----

その小説には、昆虫サイズで昆虫の様に飛んで家屋に侵入し、敵方の政治家や企業家の弱みを握るために写真撮影のできるデバイスも登場する.たまにはチクッと暗殺もしてみたりする.

ダンブラウンって「ダビンチコード」のような歴史や宗教から題材を取った小説ばかりではなくてSFも書いてるんですね、と思うわけだが、「デセプション・ポイント」の冒頭のページには、「本作の中に登場するデバイスはすべて実在する」と書かれているんです. (わたしの記憶による)
シャーベット水素のたぶんラムジェットエンジンのスゲー航空機も、昆虫型偵察・暗殺マシンも、既に実用化されているとダンブラウンさんはおっしゃっているわけですね.

かように軍事技術というものは一般人の知らぬ処で思いもよらぬテクノロジが実現されていたりするものなのかもしれません.原爆もその一つでしたし.

----
最近知ったのですが、公開鍵暗号の発明者は一般的にはホイットフィールド・ディフィー(右写真の魔法使い風な人)だと言われている(1976年)のですが、本当の発明者はジェイムズ・エリスというUKの政府機関の人で、彼は1969年にすでに公開鍵暗号を発明していたが、UK政府の機密として秘匿されていたのだそうです.これはRSA暗号についてのwikiにもそう書かれています.

PCが無かった1969年に公開鍵暗号を実用化するのは無理だっただろうから、発明者がエリスさんであろうとなかろうと歴史は大筋で不変だったかもしれませんが.

軍事・諜報分野で秘匿されたテクノロジは(原爆や公開鍵のように)実在したわけで、ならば現在でも何かが秘匿されているかもしれないと、陰謀論者はネタにしたいわけでありまして、地震兵器やフリーエネルギーや悪い宇宙人のグレイも秘匿されているに違いないというのが学研のムーのネタに何度も採用されていたりするわけです.

----
それでこのニュースはというと、
http://scienceportal.jst.go.jp/news/newsflash_review/newsflash/2015/04/20150423_02.html
「レーザーを撃って、スペースデブリを地球へ向けて墜としちゃえ」といってます.
う~ん、でもこれってすでに米軍の衛星が実用化してるってオチじゃないかなぁ? 標的はデブリじゃなくて衛星かもですが.

今頃ペンタゴンの人が、「民間さんご苦労様だが、我が軍の反射衛星砲には100年は追いつけなかろうよ、フォッフォッフォ」とか言ってるんじゃないかと思ってしまうのはわたしだけでありましょうか????

スペースデブリの排除というと、「クラッシャー・ジョー」であろうよ.懐かしい、、、
陰謀よしっ、、、


人気ブログランキングへ

2015年4月24日金曜日

EZ-USB FX2LP を動かしてみる (26) 転送レート測定のソースコード

本連載の第一回は3月12日でした.

それ以前は、PCのインターフェースというと、COMポートを扱った経験しかなかったわたしでした.USBについてはどうだったかというと、書籍をチラ読みして、ディスクリプタとかエンドポイントとかFIFOとかpipeとかという用語は目にしていましたが、ディスクリプタを格納してるのがデバイスなのかPCなのかすら知らない人でありました.

それが今や、USBデバイスのFIFO越しにある回路の制御ならできますってところまで進化したのですから、思えば遠くまで来たものだと遠い目をしておこう.(HIDはまだ全然わからないけど)

今回は、前回やった転送レート測定システムのソースコード解説などです.

【全体構成】
データ流はIN方向ですから、PC←EZ-USB←FPGAの方向へ流れます.FPGAが発生したデータをPCにまで到達させるのが目的です.
ソースコードはホストアプリ、EZ-USB、FPGAの3つ存在するのですが、FPGAのソースなんか解説しても無駄なのでFPGAの解説は割愛します.
FPGAの機能
1) IFCLK発生
48MHzをEZ-USBのIFCLKピンへ供給する.IFCLKは、スレーブFIFOへのwriteでのみ使用され、それ以外の回路はEZ-USBが自力で発生した別の48MHzで動きます.48MHzにした理由は、EZ-USBの最高周波数だからです.

2) データ発生
32bitのインクリメンタルデータを発生し、FD[7:0]へ8bitに区切って出力します.WRパルスでFIFOへ1BYTE書き込みます.最大書き込み速度48MBYTE/Secです.FD[7:0]ではなくFD[15:0]にするコトもEZ-USBは出来ますが、今回の実験では配線が簡単なFD[7:0]にしました.

3) FIFO full(FF)の監視
FIFOはすぐに満杯になってしまいます.するとEZ-USBはFFを出力します.FPGAはFFを受信したらそれ以上FIFOへの書き込みをせず、FFが消えるまで待ちます.

EZ-USBの機能
・USB2.0 EP6 IN BULK転送
・FIFOは、512BYTEx4本 または 1024BYTEx2本 のいずれか
・スレーブFIFO関連外部ピン     (FPGAへ配線するのは太字の信号のみ)
  -IFCLKは、FPGAから48MHzをもらう
  -FD[15:0]のうちFD[7:0]しかここでは使わない
  -FFは、外部ピンCTL1=FLAGBへ出てくる  (負論理)
  -WRは、外部ピンRDY1=SLWRへ入力する  (負論理)
  -EP6 FIFOの指定は、FIFOADR[1:0]=2 で指定する  (0=EP2,1=EP4,2=EP6,3=EP8である)
  -SLOEはOUTの時に使うので、ひとまずここでは使わないで de-assertのまま  (負論理)
  -PKTENDは、ひとまずここでは使わないで de-assertのまま   (負論理)
ホストアプリの機能
・EP6へ、IN要求を出す
・EP6からのデータを受信する
・受信したBYTE数を積算し、所定のBYTE数を超えたらEXITする  (所要時間を表示する)
・HDDへのwriteはしない.CRCチェック等もしない. (ホスト処理能力要因を排除するため)

【EZ-USBのソースコード】
EZ-USB開発環境のフォルダはこちらです.    FIFO512BYTE版     FIFO1024BYTE版

【512BYTE版】
以下ではまず、512BYTE版の説明をします.
このコードは、Cypressのサンプルの「bulkloop」というのをベースにしています.

dscr.a51
このファイルにはディスクリプタの中身が記述されています.(構造体宣言はFx2.hにある)
EP6 INを使うのが主目的ですが、EP2 OUTも活かしてあります.EP4,EP8は殺しました.
そのために少し変更しました.

DeviceDscr:     デバイスディスクリプタ
      db   DSCR_DEVICE_LEN      ;; Descriptor length
      db   DSCR_DEVICE   ;; Decriptor type
      dw   0002H      ;; Specification Version (BCD)
      db   00H        ;; Device class
      db   00H         ;; Device sub-class
      db   00H         ;; Device sub-sub-class
      db   64         ;; Maximum packet size
      dw   0B404H      ;; Vendor ID                            ホストアプリで使う情報  04B4
      dw   0410H      ;; Product ID (Sample Device)       ホストアプリで使う情報  1004
      dw   0000H      ;; Product version ID
      db   1         ;; Manufacturer string index
      db   2         ;; Product string index
      db   0         ;; Serial number string index
      db   1         ;; Number of configurations

     中略

;; Interface Descriptor       インターフェースディスクリプタ
      db   DSCR_INTRFC_LEN      ;; Descriptor length
      db   DSCR_INTRFC         ;; Descriptor type
      db   0               ;; Zero-based index of this interface
      db   0               ;; Alternate setting
      db   2               ;; Number of end points       EPを2ヶにしました
      db   0ffH            ;; Interface class
      db   00H               ;; Interface sub class
      db   00H               ;; Interface sub sub class
      db   0               ;; Interface descriptor string index
      
;; Endpoint Descriptor      EP2のディスクリプタ
      db   DSCR_ENDPNT_LEN      ;; Descriptor length
      db   DSCR_ENDPNT         ;; Descriptor type
      db   02H               ;; Endpoint number, and direction     EP2 OUTの意味
      db   ET_BULK       ;; Endpoint type                        バルク転送
      db   00H               ;; Maximun packet size (LSB)
      db   02H               ;; Max packect size (MSB)          512バイト
      db   00H               ;; Polling interval

;; Endpoint Descriptor      EP4はコメントアウトで使わなくする
;      db   DSCR_ENDPNT_LEN      ;; Descriptor length
;      db   DSCR_ENDPNT         ;; Descriptor type
;      db   04H               ;; Endpoint number, and direction
;      db   ET_BULK        ;; Endpoint type
;      db   00H               ;; Maximun packet size (LSB)
;      db   02H               ;; Max packect size (MSB)
;      db   00H               ;; Polling interval

;; Endpoint Descriptor      EP6のディスクリプタ
      db   DSCR_ENDPNT_LEN      ;; Descriptor length
      db   DSCR_ENDPNT         ;; Descriptor type
      db   86H               ;; Endpoint number, and direction     EP6 INの意味
      db   ET_BULK       ;; Endpoint type                        バルク転送
      db   00H               ;; Maximun packet size (LSB)
      db   02H               ;; Max packect size (MSB)       512バイト
      db   00H               ;; Polling interval

;; Endpoint Descriptor      EP8はコメントアウトで使わなくする
;      db   DSCR_ENDPNT_LEN      ;; Descriptor length
;      db   DSCR_ENDPNT         ;; Descriptor type
;      db   88H               ;; Endpoint number, and direction
;      db   ET_BULK            ;; Endpoint type
;      db   00H               ;; Maximun packet size (LSB)
;      db   02H               ;; Max packect size (MSB)
;      db   00H               ;; Polling interval

    以下略

fw.c
このファイルにはmain()があります.bulkloopサンプルから何も変更する部分がありません.

main()の構造を単純化するとこうなっています.

void main(void)
{
   TD_Init();      様々な初期化    カスタマイズする必要がある

デバイスディスクリプタの先頭アドレスを採取しているところ
   pDeviceDscr = (WORD)&DeviceDscr;
   pDeviceQualDscr = (WORD)&DeviceQualDscr;
   pHighSpeedConfigDscr = (WORD)&HighSpeedConfigDscr;
   pFullSpeedConfigDscr = (WORD)&FullSpeedConfigDscr;
   pStringDscr = (WORD)&StringDscr;

割り込みenable
   EZUSB_IRQ_ENABLE();            // Enable USB interrupt (INT2)
   EZUSB_ENABLE_RSMIRQ();            // Wake-up interrupt
   EA = 1;                  // Enable 8051 interrupts

   while(TRUE)       メインループ
   {
データ転送に関与する大事なお仕事をするルーチンですが、ここではこの関数の中身は空っぽです.USB転送にCPUは介在しないAUTOMODEであるため.
      TD_Poll();

      if(GotSUD)       セットアップコマンドを受信したか?
      {
         SetupCommand();       セットアップ処理をする(ディスクリプタ送信など)
      }
   }
}

bulkloop.c
TD_Init()と、TD_poll() をカスタマイズする必要があります.

ここでのEZ-USBの使い方は、AUTOMODEといって、データ通信にCPUが何ら介在しないモードです.なので、初期化だけがCPUの作業と言っても過言ではありません.なので、TD_Init()をいろいろと変更しました.bulkloopサンプルの元のコードではEP2,4,6,8が全て活かされていたのですが、EP4,8を殺したのが大きな変更点です.

void TD_Init(void)
{
   CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;     CPU clock 48MHz

   IFCONFIG = 0x43;     1)IFCLK=外部入力   2)FIFO同期モード   3)スレーブFIFOモード
   SYNCDELAY;            お定まりの遅延時間

EP1の設定
  EP1OUTCFG = 0xA0;    OUT バルク転送モード
  EP1INCFG = 0xA0;       IN  バルク転送モード
  SYNCDELAY;

EP2の設定
  EP2CFG = 0xA0;      OUT  バルク転送モード   FIFO=512BYTE 4本
  SYNCDELAY;

EP4の設定
  EP4CFG = 0x00;      殺しておく
  SYNCDELAY;

EP6の設定
  EP6CFG = 0xE0;       IN   バルク転送モード    FIFO=512BYTE  4本
  SYNCDELAY;

EP8の設定
  EP8CFG = 0x00;       殺しておく
  SYNCDELAY;

FIFOをリセットする
  FIFORESET = 0x80;     全FIFOリセット(たぶん)
  SYNCDELAY;
  FIFORESET = 0x82;     EP2 FIFOリセット
  SYNCDELAY;
  FIFORESET = 0x84;     EP4 FIFOリセット  (死んでいるが念のため)
  SYNCDELAY;
  FIFORESET = 0x86;     EP6 FIFOリセット
  SYNCDELAY;
  FIFORESET = 0x88;     EP8 FIFOリセット  (死んでいるが念のため)
  SYNCDELAY;
  FIFORESET = 0x00;     FIFOリセット終了  (たぶん)
  SYNCDELAY;
  OUTPKTEND = 0x82;    何かよく判らんが、EP2 FIFO 4本を全て初期化するために4回やる
  SYNCDELAY;
  OUTPKTEND = 0x82;
  SYNCDELAY;
  OUTPKTEND = 0x82;
  SYNCDELAY;
  OUTPKTEND = 0x82;
  SYNCDELAY;

EP2をAUTOMODEにする   (及びFD[7:0]にも設定している)
  EP2FIFOCFG = 0x10; // EP2 is AUTOOUT=1, AUTOIN=0, ZEROLEN=0, WORDWIDE=0
  SYNCDELAY;

EP6をAUTOMODEにする   (及びFD[7:0]にも設定している)
  EP6FIFOCFG = 0x0C; // EP6 is AUTOOUT=0, AUTOIN=1, ZEROLEN=1, WORDWIDE=0
  SYNCDELAY;

EP6 FIFOに512BYTE溜まったら送信する意味だと思う
  EP6AUTOINLENH = 0x02; // Auto-commit 512-byte packets
  SYNCDELAY;
  EP6AUTOINLENL = 0x00;
  SYNCDELAY;


EP2 AUTOMODEスタート    FIFO4本なので4回やる
  EP2BCL = 0x80;
  SYNCDELAY;                    
  EP2BCL = 0x80;
  SYNCDELAY;                    
  EP2BCL = 0x80;
  SYNCDELAY;                    
  EP2BCL = 0x80;
  SYNCDELAY;    

FIFOアクセスのためのオートポインタスタート  (DMAに似た仕組み)
  AUTOPTRSETUP |= 0x01;
}

次はTD_Poll()ですが、元のコードではいろいろと仕事をしていましたけれど、不要なので中身を全部削除しました.AUTOMODEだからデータ転送に逐一CPUが関与する必要が無いからです.
void TD_Poll(void){;}

-----
【1024BYTE版】
つぎに、1024BYTE版にするために何処を変更したかを記します.

512BYTE版と1024BYTE版ではFIFOの構造が異なります.(EZ-USBの都合で)
<512BYTE版>
EP2    FIFO長512BYTE     4本
EP6    FIFO長512BYTE     4本

<1024BYTE版>
EP2    FIFO長1024BYTE     2本
EP6    FIFO長1024BYTE     2本

このコトをソースコードに反映させる必要があります.

dscr.a51
;; Endpoint Descriptor      EP2のディスクリプタ
      db   DSCR_ENDPNT_LEN      ;; Descriptor length
      db   DSCR_ENDPNT         ;; Descriptor type
      db   02H               ;; Endpoint number, and direction   
      db   ET_BULK       ;; Endpoint type                        
      db   00H               ;; Maximun packet size (LSB)
      db   04H               ;; Max packect size (MSB)          1024バイト
      db   00H               ;; Polling interval

;; Endpoint Descriptor      EP6のディスクリプタ
      db   DSCR_ENDPNT_LEN      ;; Descriptor length
      db   DSCR_ENDPNT         ;; Descriptor type
      db   86H               ;; Endpoint number, and direction    
      db   ET_BULK       ;; Endpoint type                    
      db   00H               ;; Maximun packet size (LSB)
      db   04H               ;; Max packect size (MSB)       1024バイト
      db   00H               ;; Polling interval

bulkloop.c
void TD_Init(void)
{
EP2の設定
  EP2CFG = 0xAA;      OUT  バルク転送モード   FIFO=1024BYTE 2本

EP6の設定
  EP6CFG = 0xEA;       IN   バルク転送モード    FIFO=1024BYTE  2本

FIFOをリセットする
  OUTPKTEND = 0x82
  SYNCDELAY;
  OUTPKTEND = 0x82;
  SYNCDELAY;
//  OUTPKTEND = 0x82;;    EP2 FIFO 2本になってので初期化は2回でいいだろう
//  SYNCDELAY;
//  OUTPKTEND = 0x82;
//  SYNCDELAY;

EP6 FIFOに1024BYTE溜まったら送信する意味だと思う
  EP6AUTOINLENH = 0x04; // Auto-commit 1024-byte packets
  SYNCDELAY;
  EP6AUTOINLENL = 0x00;
  SYNCDELAY;

EP2 AUTOMODEスタート    FIFO2本なので2回でいいだろう
  EP2BCL = 0x80;
  SYNCDELAY;                    
  EP2BCL = 0x80;
  SYNCDELAY;                    
//  EP2BCL = 0x80;
//  SYNCDELAY;                    
//  EP2BCL = 0x80;
//  SYNCDELAY;    


【Linuxホストのソースコード】
ソースコードはこちらです.libusb0.1が必要です.コンパイルするには、こんな感じでどうぞ.
gcc fx2e.c -lusb -lm -o fx2e
EZ-USBをLinuxマシンに接続してから、fx2eをrunさせます.コマンドオプションがあります.

使い方
転送レートを測定するための最もフツーなコマンドはこうです.10^8乗=100MBをEP6から受信して、所要時間を表示します.
time fx2e 8
すると次のような表示が出ます.
device serching
device found VID=04b4 PID=1004
EP6 BULK IN (completed 512B TTL134217728B REQ134217728B)
real    0m32.795s     これが所要時間でよいと思う
user    0m0.744s
sys     0m5.996s
100MBは正確には134MBですから、転送レートは、134÷32.8=4MB/Sec と計算されます.
ちなみにここでは、512BYTE/FIFO、512BYTE/IN要求 で動かしました.

別の条件で転送レートを測定してみます.
time fx2e 7 n n 4096
こうすると、10^7=10MBを、4096BYTE/IN要求 でEP6から受信しました.結果は、1.539Secかかったコトになり、10MBは正確には16.8MBですから、16.8÷1.539=10.9MB/Secと計算されます.
device serching
device found VID=04b4 PID=1004
EP6 BULK IN (completed 4096B TTL16777216B REQ16777216B)
real    0m1.539s
user    0m0.032s
sys     0m0.092s

なお、FIFO長はEZ-USBのプログラムで決まりますので、ホストからでは変更できません.(やればできるがやってない)

他の使い方では、vオプションをつけると、
fx2e 4 v
途中経過がたくさん表示されますが、表示動作の分転送レートは遅くなります.
device serching
device found VID=04b4 PID=1004
EP6 BULK IN (512B TTL512B REQ16384B) 4E 48 E4 2F 4F 48 E4 2F
EP6 BULK IN (512B TTL1024B REQ16384B) CE 48 E4 2F CF 48 E4 2F
EP6 BULK IN (512B TTL1536B REQ16384B) 4E 48 E4 30 4F 48 E4 30
   中略
EP6 BULK IN (512B TTL14848B REQ16384B) 4E 48 E4 3D 4F 48 E4 3D
EP6 BULK IN (512B TTL15360B REQ16384B) CE 48 E4 3D CF 48 E4 3D
EP6 BULK IN (512B TTL15872B REQ16384B) 4E 48 E4 3E 4F 48 E4 3E
EP6 BULK IN (completed 512B TTL16384B REQ16384B)

ソースコード
「USB2.0 インターフェース設計術 電波新聞社」のサンプルコードを流用させていただきました.

デバイスディスクリプタで確認したVIDとPIDをここで利用します.EZ-USBをサーチするキーとして使われますので必須な情報です.
#define USB_VENDOR 0x04B4 /* ベンダID(Cypress) */
#define USB_PRODUCT 0x1004 /* プロダクトID */

int main(int argc, char *argv[])
{
これはlibusbの初期化のお決まりの4行なので深く考えても仕方なし
  usb_init(); /*内部構造のセットアップ処理 */
  usb_find_busses(); /*本システム上の全てのバスを見つける*/
  usb_find_devices(); /*各々のバスで全てのUSBデバイスを発見します。*/
  bus=usb_get_busses(); /*USBバスのリストを取得する*/

USBデバイスのVID/PIDをサーチして、EZ-USBを見つける
  printf("device serching\r\n");
  for(bus=bus; bus; bus=bus->next){
    for(dev=bus->devices; dev; dev=dev->next) {
      if(d) print_dev_descr(&(dev->descriptor));
      if( (dev->descriptor.idVendor==USB_VENDOR) && (dev->descriptor.idProduct == USB_PRODUCT) ){
find_dev= dev;   VIDとPIDが合致したデバイスのコンテキストを保存
goto find_devicelabel;
      }
    }
  }
 中略  エラー処理

EZ-USBをopenし、ハンドルを入手する
  h_dev=usb_open(find_dev);
  中略  エラー処理

CONFIGURATION=1にセットする.これにどれだけ意味があるのかは謎.
  if( usb_set_configuration(h_dev,1)<0 ){  中略エラー処理  }

インターフェースを要求.たぶんだが、Linuxデバドラからlibusbに制御を奪っているのではないだろうか?
  if( usb_claim_interface(h_dev,find_dev->config->interface->altsetting-> bInterfaceNumber)<0 ) { 中略エラー処理  }

fx2eの”w”コマンドオプションだったら、EP2へお試しOUTを1回だけやる  (何度もやるとFIFOがoverflowしてしまうので何度もやらない)
  if(w){
    ret=usb_bulk_write(h_dev,2,dat,size,1000);
    中略  エラー処理
  }

usb_bulk_write(h_dev,2,dat,size,1000);は大切な関数なので引数を解説すると、
 第1引数    デバイスへのハンドル、open()で得たもの
 第2引数    EP番号、ここではEP2へOUTしている
 第3引数    OUTするデータを格納した配列
 第4引数    OUTするバイト数
 第5引数    timeoutまでのmSec

fx2eのコマンドオプションで10^xが指定されたので、最寄りの2^xを探しておく.後で使う.
  while(1){
    if(pow(2,i)>pow(10,digit)) break;
    else i++;
  }

  double reqbyte=pow(2,i);    EP6から受信したい総BYTE数
  double ttlbyte=0;      EP6から受信した途中経過BYTE数

EP6 INループ
  while(1){

EP6 BULK INデータの受信
    ret=usb_bulk_read(h_dev,6,dat,size,1000);      引数は上記のusb_bulk_write()と同じ
    中略  エラー処理
    ttlbyte=ttlbyte+ret;     受信BYTE数加算

受信したい総BYTE数を超えたらexit
    if(ttlbyte>=reqbyte) {
      printf("EP6 BULK IN (completed %dB TTL%dB REQ%dB)\n",ret,(int)ttlbyte,(int)reqbyte);
      return 0;
    }

fx2eの”w”コマンドオプションだったら、INデータの詳細を表示する
  if(v){
      printf("EP6 BULK IN (%dB TTL%dB REQ%dB) ",ret,(int)ttlbyte,(int)reqbyte);
      for(i=0;i<8;i++)printf("%02X ",dat[i]);
      printf("\n");
    }
  }

EZ-USBをcloseする
  if (usb_close(h_dev)<0)  { 中略エラー処理  }


その25へ    その27へ

かしこ


人気ブログランキングへ

ボンジュール鈴木の曲調って全部ああなんですね

「ユリ熊嵐」で「ピングドラム」よりも難解な作品をリリースした幾原邦彦にはまた今回も、ぐぬぬっ、、、とか言わされちゃったとです.

「ユリ熊嵐」といえばOPがこれまた独特なソフトさで耳がくすぐったいったらありゃしない.そのOPの作詞・作曲・歌が「ボンジュール鈴木」という人でした.「宅録系アーティスト」という職業だそうです.幾原邦彦にinterviewされる形でアニソン番組にも出演していましたが、後ろ姿のみでした.

↓これが「ユリ熊嵐」OP


定期愛読している「ステレオサウンドonline」の記事にて、このOP曲を納めたアルバムが、「ハイレゾ音源ランキングでDL数1位になった」というので、どれどれと記事を読んでみたわたしでした.

その記事からリンクが張られていたのが、ototoyのこちらのページで同アルバム収録曲のサビを聴けるようになっています.

どれどれと聴いてみて驚いたのは、ボンジュール鈴木の曲って全部が「ユリ熊嵐OP」みたいなんですね.そういう人だったのかぁ...

アルバムの中で「アゲハ蝶の破片とキミの声」が一番ヨカッタのでflacをDL購入しました.「ユリ熊OP」よりもこっちが好き. あと、「allo allo」もイイ感じだと思ったけど、こちらはまだDLしてない.

↓youtubeにあったので「アゲハ蝶の破片とキミの声」をリンクしておこう.


「少女革命ウテナ」観てないんだよね、、、立場上これはヤバい、、、

かしこ


人気ブログランキングへ

EZ-USB FX2LP を動かしてみる (25) IN転送レート実測16MB/Sec

EZ-USB FX2LPに、外部からデータをトロ~りと流し込んでやり、そのデータをLinuxマシンがしゃかりきに読んだとき、どれだけの転送レートが出るか???

これを実験で知るために、EZ-USBのFIFOをスレーブモードで使い、スレーブFIFOに最大48MHzでデータを流し込めるFPGAを作成し、libusbで作ったアプリをLinuxマシンで動かし、IN転送レートを実測しました. INとはPC←USB←FPGAの方向のデータ流のことです.

結論は、ちょっとした最適化が必要だったが、16MBYTE/Secが出た.
16Mbit/Secぢゃないよ (^_^;

測定環境の諸元を記しますと、、、

【USB chip】
・EZ-USB FX2LP 56pin
・USB2.0モード
・EP6 IN BULK転送
・FIFO  512BYTEx4 または 1024BYTEx2 のいずれか
・FIFO-FPGAバスは8bit/48MHz

【Linuxマシン】    かなり非力なマシン
・EPSON NP11
・CPU atom230 (1.6GHz) (L2=512KB)
・メモリ1GB
・Kona Linux 3.0

【FPGA】
・EZ-USB FIFOへ最大48MB/Secでインクリメンタルデータ(32bit)をwriteする
・ただし、EZ-USBがFIFO-fullを表明したら、writeせずに待つ
・FIFO-FPGAバスは8bit/48MHz

【Linuxマシンのホストアプリ】
・libusb0.1  (libusb1.0ではない)
・EZ-USB EP6へ、IN要求を打ち、IN関数が受信したバイト数を積算する.
・所望のMB数を受信し終えたらexitし、所要時間を表示する.
・受信する作業のみ.
・HDDへのwriteはしない.CRCチェック等もしない. (ホスト処理能力要因を排除するため)

インクリメントデータをダンプして見て、それっぽいデータが採取できたので、USB伝送はマトモと考えて転送レート測定へ進みます.CRCチェックは後日やります.

-------------
今回は、転送レートの結果のみ掲載します.(回路図やソースコードは次回に廻します)

転送レートを測定するパラメータとして、FIFOサイズ(512か1024)と、IN要求数を考えてみました.

1) 512BYTE/FIFO  512BYTE/IN
この設定は、よく使われるバルク転送の設定かと思います.EZ-USBのFIFOが512BYTEなので、ホストのIN要求も512BYTEにしておくのがお行儀が良い感じだよねっていう心です.
がっ、いろんなオーバーヘッドが介在するためか、4MB/Secぐらいしか出ませんでした.これじゃダメだ!!!みたいなショボイ成果です.
2) 1024BYTE/FIFO  1024BYTE/IN
FIFOが512BYTEじゃショボイのかな? と思って、FIFOを1024BYTEにしてみました.1024BYTEはEZ-USBの最大値です.
このトライで、サクッと8MB/Secに改善しました.コマンドオーバーヘッドは相当大きいのでしょう.USB2.0のチャネルレート=480Mbit/Sec=60MB/Secが理論上限ですから、まだまだ行けるんじゃないかと思うわたくし.
3) 1024BYTE/FIFO  2048BYTE/IN
EZ-USBのFIFOは1024が最大なのであきらめるとして、ホストが発するIN要求を2048BYTEにしてみました.(libusbによると4096が最大らしいが英語なので不詳)
これだと、IN要求一発でFIFO2本を一気に空っぽにするだけのバースト転送が生じているはずです.この使い方ですと、FIFOが一時的に空っぽになってFIFOにデータが積まれるまでボケーっと待つ状況が出現してしまうかもと予想します.だとすると、FPGA→FIFOへのレートも総合的転送レートの制限要因として浮上してくると思われる.現状、FPGA→FIFOは8bit/48MHz(48MB/Sec)にしてあるが、16bitに拡張できるので、その場合はFPGA→FIFOが96MB/Secになって上へ逃げられる公算が高まると推測する.
ともあれ、この設定で16MB/Secを得た.これなら満足.
4) 1024BYTE/FIFO  3072BYTE/IN
ホストが発するIN要求を2048BYTEにして改善したので、それじゃぁもっと大きくしようぜってことで3072BYTEにしてみました.
意外なコトに、12MB/Secに劣化してしまいました.
3072BYTEのIN要求だと、FIFO2本で2048BYTEとの相性が悪そうに思うので、FIFO-fullフラグが頻繁に立ち、FPGA→FIFOへの転送レートが制限要因になっているんじゃないかと推測するが、あくまでも推測.この仮説は16bitバスにすりゃ検証できる.
5) 1024BYTE/FIFO  4096BYTE/IN
ホストが発するIN要求を4096BYTEにしたところ、2048BYTEの時と同じく16MB/Secでサチッてる.
追記:
5-2) 1024BYTE/FIFO  4096BYTE/IN   fwrite()でファイルに書き込みした場合
ファイルに書いたらどれだけ遅くなるか? 13MB/Secなので2割ダウンってとこかと.使ったマシンがとても非力なマシンなので、非力なマシンでもこの程度のダメージという参考になるだろう.

【考察】
昔、テープストリーマでUSB2.0で10MB/Secを出していた.それなりに苦労して10MB/Secだったので、ここでサクッと16MB/Secが出たのは、まぁラッキーと言えると思う.

さらに転送レートを上げる余地があるのかどうか?

転送レートの上昇余地については必ずしも定かではないが、さしあたり3点の検討課題を挙げることができると思う.

1) FPGA→FIFOを16bit/48MHzバスにする

2) ホストをもっと高速のマシンに変更する

3) USBプロトコルアナライザを持っていたら、オーバーヘッドがホストにあるのかEZ-USBにあるのかの当たりをつけられるかもだけど、持ってないので実施は無理っぽい.

なんつって、とりあえず16MB出たのでやる気はないんだけどね.

次回は回路とソースを解説します.

その24へ    その26へ

かしこ


人気ブログランキングへ

2015年4月23日木曜日

auのCMを誰か止めてくれ (金太郎飴)

「ぱっかーん」とか言ってるくらいならばまだマシではあったのだが、、、、一連のau(英雄)のCMはつまらないので見るに耐えず、いい加減にしてくれタノム、と血反吐を吐きそうになってしまっているわたしであります.  (SBの犬CMもクソッタレなのは当然ではあるが)

ところが血反吐ごときではもはや済まなくなって、ドクターストップ級につまらないのが、「浦島太郎の金太郎飴」バージョンであります.

↓桃太郎の金太郎飴
↓浦島太郎の金太郎飴
↓金太郎の金太郎飴
↓あぁつまらない.ドローンで騒いでるよりも、このCMディレクターのセンスを封印するコトを優先処理してくださるよう安倍総理に意見具申したい.止めてくれ、タノム、、、、
↓別の処で金太郎、はっけーん
がくっ、、、


人気ブログランキングへ