BOOT問題決着

BOOT問題に関しては仮説をコミュニティに対して投げたものの反応が無く。結局自分でブートROMのソースコードを読むことで完全解決に至りました。

現象

bfin-elf-ldr 2014R1-RC2で作成したLDRを使うと、ADSP-BF533 Rev 5がSPI Slave bootしない。この問題は小規模プログラムで発現しにくく、大規模プログラムで発現しやすい。

結論

技術的原因はHWAIT信号が出力されないことであり、一方でこれはドキュメントの問題です。

ADSP-BF533のブートROMのソースコード(VisualDSP++ 5.0に同梱されている。EZ Kit Licenseでも読むことが出来る)にはSSB_CHECK_IGNORE_BITルーチンの先頭に次の通りコメントされています。

/*  Additionally evaluate the PFLAG field of the flag word to determine,       */
/*  PF pin is used to handshake with host device.                              */

このルーチンはIGNOREブロックが発見されたときにだけ呼ばれ、そしてこのルーチンだけがSET_FLAGルーチンを呼び出してPFxピンを出力設定にします。

結局、PFxを出力にするにはIGNOREブロックをHWAITに使うピン指定と一緒に宣言しなければなりません。IGNOREブロックが無い場合には、おそらくHWAITは内部的にトグルされるだけで信号として出力されません。

これだけはっきり書いてあるにもかかわらず、EE-240 ADSP-BF533 Blackfin Booting Process Rev 4には

The current VisualDSP++® tools support IGNORE blocks for global headers only (currently the 4- byte DXE Count, see Multi-Application (Multi-DXE) Management section below)

と書いてあります。

と言うわけで、この文書を参照したbfin-elf-ldrの作者が「シングルDXE構成だからIGNOREブロックは入らない」という判断を下したのでしょう。

ワークアラウンド

ワークアラウンドは単純です。bfin-elf-ldrが生成したLDRファイルの先頭にHWAITに使うPFピンとともにIGNOREフラグを付けたダミーブロックをおけば、この問題は解決します。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください