先週のgpiospiを使ってKSZ8995MAのetherswitchのチップ対応をやってみました。だいたいの手順を書いてみたいと思います。
ターゲットのボードは@SRCHACK.ORGさんより分けてもらったものです。
データーシートを入手する
ターゲットのチップのデーターシートを入手します。これがないとはじまりません。チップの型番などでgoogleのですが、私は画像検索でデータシートらしきものを探す事が多いです。文字の検索だとサプライヤーなどが引っかかってなかななデーターシートが出てこない時もあります。
データシートを公開していない会社でもたまにもれているものが検索に引っかかったりすることもあります。
データーシートがないチップでもGPLなソースでレジスタ構成などを確認できるケースもあります。この場合レジスタの構成などを確認するのみにとどめ、GPLなコードは忘れる事が大切です。
似た構成のソースを探してコピーする
etherswitchの既存ソースでシンプルなもので、コントロールが同じものが良いです。
チップ名を一括置換
viだと%s/foo/bar/gみたいにして、一括置換でファイル内のチップ名を変換します。小文字のパターンと大文字のパターンで置換します。
レジスタアクセス部分削除
レジスタアクセス部分はチップ毎に違うので、とりあえず思い切って消してしまいます。どのような動作が必要か確認したい時はコピー元のソースを見てみるのが良いです。ただしifmediaなどの部分は、そのまま使えるので残しておくのが良いです。
コンパイルが通るようにする
ターゲットSOCのfilesにつっこんで、とりあえずカーネルのコンパイルが通るようにします。
素のレジスタ読み書き部分実装
機能的にはmustではないのですが、etherswitch_readregとetherswitch_writeregを作っておくと動きが変なときなどのデバッグに重宝します。etherswitchcfgでregで読めるのですが、この値は16ビットなので注意が必要です。
probe/attach/mii部分実装
probe/attach部分を実装してカーネルを起動すると、書いたコードが実行されるか確認できます。proble/attachの起動メッセージが問題なければmii部分を作ります。これで起動ログはデバイスが表示され、miiによりSwitchのphyがukphyとしてprobeされます。
setconfを実装
setconfを実装すると、PORT/DOT1Qな設定がetherswitchcfgコマンドでできるようになります。
getport/getvgroupを実装してetherswitchcfgで動作確認
getportやgetvgroupはチップのレジスタの値を参照して表示します。これが正しく表示できるように調整します。
返す値はチップのレジスタを参照します。
setport/setvgroupを実装してセットした値が読み出せるかを確認
etherswitchcfgコマンドで設定した値が正しく表示されるるかを確認します。表示が正しければ動作を確認します。.1qでタグ付きのパケットを送り出す設定はポートに設定するタイプのチップ(KSZ8995MAなど)とVLANグループに設定するタイプのチップ(RTL8366RBなど)があります。前者はsetportで設定して、後者はsetvgroupで設定します。
setportにはいくつかのフラグがあるので、チップが対応している場合は実装します。
コードのクリーンアップ&テスト
直値を使っているところはマクロにしたりstyleにあわせてコードを奇麗にします。動作はvlan(4)の組み合わせで確認する事になります。etherswitchcfg,ifconfigでコマンドで設定をおこない、pingやtcpdump -eなどのコマンドで確認をおこないます。基本レジスタが正しく設定できていれば、その通りに動いてくれるはずなので、設定内容の確認をおこなうと良いです。
レビューを出す
せっかく作ったものなので、headに入れてもらうためにレビューを出します。
最後に
etherswitchをいじりはじめたのは、たまたまハードオフから転がり込んだRT8366SRを動くようにしたのがきっかけでした。ジャンクをあさっているうちにいろいろなswitchチップが手に入り、使えるようにしてみたくなりました。100の頃のスイッチは比較的データーシートが入手しやすいというのも後押ししてくれました。もう蟹には手を出さないつもりで、Marvell,Micrel,Infineonをいじったので、これで一段落としたいと思っています。
Micrel,Infineonのチップは100の最後の頃のチップでいろいろ使われていな機能があります。実際使って効果があるのか試してみるのも面白いのではないかと思っています。