昨今の半導体不足とディスコン対策として、自作ロボット制御用Zynq7020ボードのイーサネットPHYとして使っているKSZ9031が後継のKSZ9131に置き換えられてしまった。
公式の移行ガイド(https://www.microchip.com/content/dam/mchp/documents/UNG/ApplicationNotes/ApplicationNotes/AN2918-KSZ9031RNXtoKSZ9131RNXMigrationGuide.pdf)も作成されているためメーカーも移行を推奨しているようだ。
ハード的な変更は14pinをNCにするだけでよく、仕様の違いはMode Strapping Pinsの対応モードが異なるため多少の見直し・確認が必要だった。また9131は1000BT Half Duplex(1G半二重)には未対応であることに留意した。
ソフト的にはKSZ9131に対応したLinuxカーネルにする必要があった。
現状のLinuxカーネルバージョンは4.9(https://github.com/Xilinx/linux-xlnx/tree/xlnx_rebase_v4.9)であり、PHYを置き換え後起動してみたらそのままでいけそうな雰囲気だった。しかし、ethデバイスとは認識されるものの通信ができない。
カーネル作成のコンフィグには検索してもKSZ9131の項目は見つからない。(コンフィグ画面で/を押すと検索できるのを今更知った。しっかり/ for Search.と書いてあるのに)
またドライバのソース(linux-xlnx/drivers/net/phy/micrel.c)を検索したところ9031の記述はあるものの9131に関しての記述はない。microchip.cにもない。
バージョン5以降のmicrel.cは9131に対応しているっぽそうだったので、micrel.cだけ新しいものに変えてビルドするもエラーで通らず。(皆考えることは同じで、同じ轍を踏んでいるようだ)
仕方がないのでカーネルのバージョンを上げることにした。
githubに上がっているXilinx/linux-xlnxのカーネルは現在5.15まで対応しているようだったが今回はなんとなく5.10(https://github.com/Xilinx/linux-xlnx/tree/xlnx_rebase_v5.10)を選択。
4.9から微妙にコンフィグ項目が変わっていたりするが、それっぽいものを選んでビルド。
特にトラブルなくカーネルのバージョンを5.10に上げることができた。
起動時もMIcrochip KSZ9131 Gigabit PHYとして認識されたことを確認。
これで行けるかと思いきやリンクアップするのに通信できない。
リンクアップ時に「eth0: unable to generate target frequency: 125000000 Hz」と表示されている。PHYに与える125MHzクロックがミスっている?水晶が故障している?など疑ったが水晶の波形や配線を見ても問題なさそうだった。
何気なくドライバのソースmicrel.cを見ているとデバイスツリーにスキューに関して記述する際の指定方法が9031ではxxx-skew-psだったのに、9131ではxxx-skew-psecに変わっていることに気が付いた。
早速デバイスツリーを書き換えると見事に通信も問題なく動作した。xxx-skew-psecの値を変えるとイーサの通信がもっさりしたり(変えすぎると通信できない)するのでスキュー設定は効いているようだった。
スキューの設定値はこのドキュメントを参照した。(https://www.kernel.org/doc/Documentation/devicetree/bindings/net/micrel-ksz90x1.txt)たしかカーネルソースにもどこかにこのドキュメントが入っていた気がする。
デバイスツリーにはxxx-skew-ps、xxx-skew-psecどちらの記述も記載しておくことでKSZ9031、KSZ9131両方に対応できることもわかった。
スキューを設定する必要がない場合はカーネルバージョンを上げるだけで通信も問題なく可能らしい。
KSZシリーズのPHYメーカーのmicrelはmicrochipに買収されたため、企業としてのmicrelは消えmicrochipに吸収となった。しかしKSZシリーズのカーネルコンフィグやデバイスドライバのソースは引き続きmicrelとして別に存在する。
KSZのデバイスドライバの追加の際はmicrochipではなくmicrelをチェックすること。
0 件のコメント:
コメントを投稿