本日のリンク元スパムはどーしようもないなこれは.... ここ2ヶ月くらいApache側でアクセス禁止するイタチごっこを続けていたけど、もう限界だわ。 内容については 検索サイトに偽装した Referer spam サイト (2)を参照のこと。
発信源は a++ My RSS 管理人ブログ という糞野郎なのだが、お詫びなどかいている反対側で、対策が行われつつあるwww.sfa-cms.comに 代わってsfa-cms.netを立ち上げるなど、全く反省の色もないぞ。マジで死ねばいいのに。
本家tDiaryの対策を(勝手に)期待していたのだけど、どうも普通の運用者は disp_referer2.rbの、予めリストに登録した特定のリンク元以外は表示しない という機能を使っているらしく、全く話題にものぼりはしない。もはや絶望的である。
検索エンジンからのリンクだけ表示してもなあ.......
いわゆるWeb日記時代から書きつづけてきた俺としては、 1,2件のリファラが話題に花を咲かせる発端になった経験から 消したくはないんだけど。はうンとのゆるーい結び付きもこれ経由だったりするしね。
が、さすがに耐えられないので05referer.rbのreferer_transcation内で next if count.to_i < 5しましたわ。パワプロやらなんやらでアクセスしてくんじゃねーよバーカバーカ!
日本語(UTF-8?)を含むURLの正規表現ってどうかけばいいの?
前回の手順でファームウェアサンプルであるex3をコンパイルすると、 いろいろファイルが生成されるのだが、実行ファイルに相当するものは ex3.ihxというファイル。 Intel Hex形式で 記述された8051のオブジェクトコードだ。
:03000000020008F3 :0300610002000397 :0500030012011780FE50 :080064007A007BF87C007D02AC
でも、これだとなんだかわからないので中身を覗いてみる。逆アセンブラはdis51。
$ dis51 < ex3.ihx CSEG AT 0000h LJMP L0001 L0004: LCALL L0005 L0006: SJMP L0006 L0001: MOV SP, #9h LCALL L0002 MOV A, DPL JZ L0003 LJMP L0004
おお、それらしいじゃないですか。演算はほぼ全てAレジスタ(アキュームレータ)を起点として 行うようです。どのアドレスが内部メモリでどれがI/Oマップなのか未だにわかりませんが。 ex3は基本的にEP6をIN(PCからみた場合、ターゲットからだと出力になる)に初期化して いるだけのようです。が、ex3.c本体も、できあがったihxを逆汗した結果も、 割り込みテーブルの初期化とか全くしてないように見えるんだが...これでいいのかな。 スタートアップコードはほとんど全く付加されず、元ソース由来のニモニックばかりだねえ。
ex3に添付されているprogram_and_start.shというシェルスクリプトが、 そのままfx2_programmerの使用例になっている。
EZ-USBは認識のたびにバスID,デバイスIDが変わってしまう。むろんEEPROMで独自のIDを 持ったファームウェアを毎回ブートするようにすれば変わらないようにもできるが、 今割り当てているのはLinux Kernel側のusbdevだ(多分)。
fx2_programmerを使うと状態がダンプできる。上記のシェルスクリプトは ダンプした結果から'UNCONFIGURED'という行をgrepで抽出して、バスIDを環境変数BUS, デバイスIDをDEVICEにセットする。本来、ネイティブドライバではベンダーIDや プロダクトIDで(もちろんEZ-USB、Cypressが決めたIDではなく自社で取得したIDね) 検索する部分を、半自動でやってくれるわけね。
# fx2_programmer any any dump_busses Dump of USB subsystem: bus 006 device 001 vendor id=0x1d6b product id=0x0001 bus 005 device 001 vendor id=0x1d6b product id=0x0001 bus 004 device 001 vendor id=0x1d6b product id=0x0001 bus 003 device 001 vendor id=0x1d6b product id=0x0001 bus 002 device 002 vendor id=0x04b4 product id=0x8613 (UNCONFIGURED FX2)
以降、環境変数BUS,DEVICEを使ってfx2_programmerコマンドを呼び出せば、 ある程度対話的にEZ-USBを制御できるというわけ。8051をリセットする場合は
# fx2_programmer $BUS $DEVICE set 0xE600 1
となる。0xE600は何なの?と思ってfx2regs.hを見ると、CPUを外部から コントロールするためのI/Oアドレスのようだ。
EXTERN xdata _AT_(0xE600) volatile BYTE CPUCS ; // Control & Status
書いてる値「1」は、Cypressの開発キットと同時にインストールされる テクニカルリファレンス(EZ-USB_TRM.pdf)をひくと、1でCPUがHOLDされ、さらに 0を書くとリセットかかるみたいなことがかいてある。
ここがEZ-USBのおもしろいところなんだけど、 CPUCSってのはUSB coreのポート であって、それがCPUのリセット信号に直結されている構造なんだな。 一般的なマイコンボードだとCPUが絶対的支配者でUSBペリフェラルがサブであるが、 EZ-USBではUSB Coreのほうがえらいということか(TRMのFigure7-1)。
program_and_start.shは、先ほどコンパイルしたファームウェアを以下のコマンドで ダウンロードしている。
# fx2_programmer $BUS $DEVICE program ex3.ihx
その後0xE600に0を書いて、この瞬間から8051が動き出すというわけだ。 うまくできてるなあ。
# fx2_programmer $BUS $DEVICE set 0xE600 0
fx2_programmerにはbluk_benchというコマンドが用意されていて、 ひたすら指定したエンドポイントを所定バイト数、所定チャンクで読み出して時間を測定してくれる。
# fx2_programmer $BUS $DEVICE bulk_bench 0x86 102400000 2048
Read 102400000 bytes in 26 seconds and 184313 microseconds. Rate of 3910738 bytes/second
約4MB/s (32Mbps)。USBバルク転送でこれだけ出てれば十分というべき...いや やはり遅いのか?400Mbpsくらい出すにはどうしたらいいんだろう。
ex3.cのソースみてたらバグ発見。
/* configure ep6 to be quad buffered */ EP6CFG=(EP6CFG & ~3)|3;
これだとEP6CFGの値は0xe3になる。TRM 8-4をみるとquadバッファするためには0xe0に しないといけない。下位2bitが11だとトリプルバッファだね。
しかもトリプルといいつつFIFOBUFの設定は各1回しかやってない。どういうことなんだろうか。 なんとなくだが、上記ベンチマークは シングルバッファの結果 な予感がする。 実質的にはSlaveFIFOで動作しているわけではない(入力側の回路がない)ので、 USB的には固定バッファを送り出しているだけだから、最大速度出てる可能性もあるけどね。 あとはバッファ長か?PC側ドライバの問題か?
![]() |