sys_initialize()を修正し、未初期化PLLを正しく認識できるようにした。
ただし、この変更は完全ではない可能性がある。ADIのanomaly によれば、PLL_CTLの値はチップリビジョンにより変わりうる。この点は不明確であり、現在ADIに問い合わせ中。
ADIの回答 http://ez.analog.com/thread/14209
Chip Rev 0.0, 0.1ではPLL_CTLの初期値は0x0a00であるが、0.2では0x0b00 である。
修正点は以下の通り。
Blackfin 依存部 3.3.0 にてリリース
Blackfinの各チップ依存部は、initialize()関数の中でPLLの初期化を行うべきか否か判定している。この判定が必要になるのは、同じ実行バイナリがGDBによって直接SRAMにロードされることもあれば、uBootのような高機能ローダーによってブートされることもあるからである。高機能ブートローダーはPLLやSDRAMCを初期化してプログラムを展開する。この場合、アプリケーション内部で再度PLLやSDRACMを初期化すると、SDRAMにブートローダーが配置したリソースが破壊される。したがって、この場合はPLLの初期化を行うべきではない。一方、GDBが直接ロードする場合にはPLLは初期化されていないため、PLLを自分自身で初期化したほうが便利である。これは高機能ローダーを使わない場合にも言える。 TOPPERS/JSP for Blackfinはこの判定を自動的に行う。具体的にはBF518の場合、config/blackfin/_common_bf518/chip_config.cの95行目で行なっている(関数はsys_initialize() )。
BF518の実装では、この判定にバグがある。この部分はPLL_CTRLレジスタが初期値でなければPLLの初期化を放棄するが、その初期値の設定が間違っている。0x0a00が正しい。