SKS3200M-4GPY2XFの修理

network

ポートのエラーが出てたりリンク速度がおかしくなっていたので、ケーブルチェックついでに電源入れ直したところ、無事SYS点滅のみになって壊れた八丁です。この点滅の症状は、ファームが読めてない場合に起こる状態で、SPIフラッシュが故障状態の場合に起こります。他にすべてのLEDが点いたままになる症状もあるようで、これは基板の故障らしいです。今回はSYS点滅のみの状態のため、SPIフラッシュの交換をしていきます。

なので、修理道具持ってない場合は買い替えたほうが早いです。

なお次のリポジトリなどを参考に行った作業まとめです。

GitHub – up-n-atom/SWTG118AS: SWTG###AS RE
SWTG###AS RE. Contribute to up-n-atom/SWTG118AS development by creating an account on GitHub.

必要なものを用意

・CH341A ICプログラマー
・SPIフラッシュ W25Q16 が推奨です。W25Q16JVSNIQかW25Q16JVSSIQどちらかお好みで。
  元チップはFM25Q16Aです 秋月にあるやつも一応使えます(※ただしRTLPlayground専用)
・ハンダゴテ (PX-280は推奨)
・はんだ
・はんだ吸取線
・フラックス (少し塗っておくとよく流れるので吸い取ったり剥がしたりしやすい
・低温はんだ (低温ハンダを盛ると剥がすのが楽です)
・ピンセット 熱くなったIC剥がすのに使うので適当に用意。最悪割り箸でもいい
・フラックス洗浄剤 とか イソプロピルアルコール(IPA) とか ダイソーの歯ブラシ
 ICを剥がしたあと基板の掃除用

マジ道具持ってない場合は買い替えたほうが早いです。

交換作業

まずフラッシュを読んでみる

両サイドにあるネジ2つずつを外してフタをあけます。

SPIフラッシュの位置はここ

CH341Aのクリップでつまんで読めるか試してみます。

CH341のソフトはここから https://dwdvb.com/
最新を追っかけるとこっち? https://www.right.com.cn/forum/thread-8289988-1-1.html

なおクリップはすぐスッポ抜けるので、指で押さえつけてないと安定しない模様

ソフトはドライバを入れてから起動。HardwareからCH341 Blackを選択。
上部にある?のアイコンか、Detectを押すとICが自動認識されます。

問題なく認識したら、上の左側にあるアイコンでRead ICでフラッシュ読み、下部のログ画面でCRC32を確認。
もう一度読んで。CRC32が一致したら正常に読めたと判断して保存します。

認識できない場合はクリップが正しく取り付けられてないので、何度もやり直します。
クリップがどうしても駄目な場合、剥がして読み出し用の基板に付けるか、ソケットを使って読みます。

SPIフラッシュを取り外す

SPIフラッシュはSOP8の表面実装品なので、単にはんだを吸取りしただけでは剥がれてくれません。
はんだを両サイドに少し盛って、それぞれ温めてピンセットで剥がします。コテ先は幅が広い型推奨
盛ったはんだをそれぞれ交互に温めながらピンセットでズラすのを意識する感じ。かなり大変。
はんだごて2本持ってる場合は2本使ったほうが早くて楽です。

剥がしたら、吸取り線とフラックスで基板のはんだを掃除します。基板上のフラックス残りは除去剤とIPAでクリーニングします。

新しいSPIフラッシュの準備

新しいSPIフラッシュは取り付ける前に中身を書き込んでおきます。
今回取り付けるフラッシュはWinbond W25Q16JVSSIQです。200milソケット使うと楽です。

まずフラッシュをCH341にセットして認識させます。

FM25Q16AはSecuritySectorというところにチップのUIDを変換した値が書かれていて、ブート時にチェックしています。チェック値が不一致だと起動せずにリセットループとなるので、元のファームに戻す場合はSecuritySectorの値を書き込みをしないといけません。

W25Q16用に専用スクリプト用意が必要でFM25Q16A用を改造して作ってみたのでコレ
Script画面に貼り付けて使います。

// W25Q16JV - FM25Q16A-compatible
// FM25Q16A Modified https://github.com/up-n-atom/SWTG118AS/blob/main/tools/FM25Q16A_SS.pas

{$readUID} // 64bit unique ID
begin
  if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
  SPIWrite(0, 5, $4B, 0,0,0,0);
  SPIReadToEditor(1, 8);
  SPIExitProgMode();
end

{$readSR} // SR1 byte0, SR2 byte1 (LB1-3 = SR2 bit3-5)
begin
  if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
  SPIWrite(0, 1, $05);
  SPIReadToEditor(1, 1);
  SPIWrite(0, 1, $35);
  SPIReadToEditor(1, 1);
  SPIExitProgMode();
end

{$eraseSS} // erase Security Register page 0 (addr 000000h)
begin
  if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');

  SPIWrite(1, 1, $06);                 // Write Enable
  SPIWrite(1, 4, $44, 0, 0, 0);

  sreg := 0;
  repeat
    SPIWrite(0, 1, $05);
    SPIRead(1, 1, sreg);
  until((sreg and 1) <> 1);

  SPIExitProgMode();
end

{$readSS} // read Security Register page 0, 256 bytes
begin
  if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
  SPIWrite(0, 5, $48, 0, 0, 0, 0);     // cmd + addr(3) + dummy
  SPIReadToEditor(1, 256);
  SPIExitProgMode();
end

{$writeSS} // program Security Register page 0 (erase first!)
begin
  if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');

  SPIWrite(1, 1, $06);                 // Write Enable
  SPIWrite(0, 4, $42, 0, 0, 0);
  SPIWriteFromEditor(1, 256, 0);

  sreg := 0;
  repeat
    SPIWrite(0, 1, $05);
    SPIRead(1, 1, sreg);
  until((sreg and 1) <> 1);

  SPIExitProgMode();
end

スクリプトでSection=READUIDを選んでExecuteすると、読み込みのタブにUIDが読み込まれます。

読み込まれたバイナリ4バイトを次のpythonスクリプトで変換して数値を取得します。
encuid.py https://github.com/up-n-atom/SWTG118AS/blob/main/tools/encuid.py

python環境用意が面倒な場合は、AIにURLとUID渡すと自動でencuidの文字列もらえます。楽な時代。

取得したencuidの文字列はREADSSして読み込んだSFDPの頭に書き込みます。
ここに書き込まないとリセットループになるので書き込みます。

ScriptでまずREADSSをExecuteして一旦読み出し。
さっき取得したencuidの文字列をメモリー画面にコピペ貼り付けます。
その後ScriptでERASESSをExecute。そのままWRITESSをExecuteして、READSSをExecuteして確認します。

問題なく書き込みできていたら、以前保存したFM25Q16Aのフラッシュのデータを開いて、Write ICでフラッシュに書き込みます。念のため、書き込み後はRead ICでCRC32一致するか確認します。

取り付けて動作の確認

一通り準備ができたら、SPIフラッシュをはんだ付けをします。

そして一旦通電テスト。
これでSYS点滅以外にLANポートのLEDもつくはず。

SYS点滅とLANポートのリセットが繰り返される場合は、encuidの書き込み間違いと思われるので、クリップ使ってUIDの書き込みを再チェックします(1敗)

ちゃんと動いているか心配な場合、一番右のSFPの後ろの方に、TX GND RXと書いてあってシリアル接続出来る場所があるので、ピン立てるかテストワイヤーでシリアルポートに繋いで、57600bpsで接続するとブートログが見れます。覗くとリブート繰り返し等も判別できます。

復旧モードで起動が止まってファームアップ待ちになってたりする場合があります。
IP:192.168.1.1/255.255.255.0 GW:192.168.1.254で待機してるので、ブラウザで開いて、ファーム投げてあげると復旧できるかもしれません。

RF_V1.9_SKS3200M-4GPY2XF_0104.bin https://github.com/charleshuang13/xikestor-sks3200m-4gpy2xf-firmware/tree/main/firmware

というわけで今回はこれで復旧ができました。

あとは基板の掃除をしてフタして完了です。

RTLPlaygroundという選択肢

GitHub – logicog/RTLPlayground: A Playground for Firmware development for RTL8372/RTL8373 based 2.5GBit Switches
A Playground for Firmware development for RTL8372/RTL8373 based 2.5GBit Switches – logicog/RTLPlayground

今回の件で色々と探し回っていたところ出会ってしまったカスタムファーム。UIも日本語になるし、SFP情報も見れるし。MANAGEDでも元々そんなに機能無いので、これでもいいかもしれない。encuidの書き込み不要、秋月のAT25SF321B-SSHBに交換して焼いても使えたので気楽に修理できます。

今のところバイナリ配布はないみたいなので、ビルド環境は必要です。

おわり

というわけで直し方探したのはいいですけど、正直めんどくさいので買い替えたほうが早いです。
原因の解明という点では勉強になったとおもいます。
もう当分ヤラネ

コメント

タイトルとURLをコピーしました