Đọc và ghi lại EEPROM SFP qua bus I2C của Raspberry Pi thay vì mua programmer
Tôi giữ một kệ đầy SFP tháo ra ở nhà và muốn có thể đọc EEPROM của chúng, sửa một module bị hỏng checksum, và thỉnh thoảng recode một cái cho switch khó tính về vendor string. Mua một programmer thương mại chỉ để dùng cho vài module mỗi năm thì không hợp lý ở đây, nên tôi đang tìm hiểu xem một bộ rig tự chế thực sự làm được đến đâu.
Những gì có trên bench:
- Raspberry Pi với bus I2C nối ra một cage SFP tôi tự đấu dây
- một board programmer USB CH341A còn dư từ một lần sửa BIOS
- một đống module SFP/SFP+ 1G và 10G lẫn lộn, cộng thêm hai module QSFP+ tôi cũng muốn xem thử
Việc đọc thì có hoạt động, ít nhất theo nghĩa có thứ gì đó trả lời trên bus:
$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
$ i2cdump -y 1 0x50
Những gì đã làm được đến giờ:
- dump A0h bằng tay rồi so từng byte với offset các trường trong SFF-8472, cách này chậm và rất dễ sai
- ghi vài byte bằng CH341A: chúng vào được, nhưng không có gì tự tính lại checksum cho tôi, nên module trả về như rác cho tới khi tôi tự vá lại
- để nguyên các module QSFP+ chưa đụng vào, vì cage tôi tự làm chỉ nhận SFP
Vậy tooling mã nguồn mở cho việc này thực ra trông như thế nào: có thứ gì biết layout bộ nhớ, kiểm tra byte checksum sau khi ghi, và điều khiển được cả khe QSFP+ không? Và một bộ rig tự chế thì dừng lại ở đâu là không còn đủ nữa?
Comments 4
Với công việc SFP/SFP+ thông thường thì Pi là đủ. Module chỉ là hai thiết bị I2C, đúng như output i2cdetect của bạn cho thấy ở 0x50 và 0x51, và không có gì huyền bí hơn thế. Thứ giúp bạn khỏi phải đếm byte là sfppi: nó điều khiển bus I2C của Pi, giải mã các trường cho bạn, và kiểm tra CC_BASE với CC_EXT rồi đề nghị tự sửa sau khi ghi. Đó chính xác là bước mà CH341A không làm cho bạn. CH341A không phải vô dụng, nó đọc và ghi tốt, chỉ là không biết các byte đó nghĩa là gì, nên mọi checksum vẫn là việc của bạn.
Với QSFP+ thì cage hàn tay của bạn sẽ không giúp được gì. Thiết kế cộng đồng hay nhắc tới là Hubble, một programmer mở có khe QSFP ngay cạnh khe SFP, nên đó là hướng nếu bạn muốn động vào hai loại module đó. Cũng có một bản dựng tối giản của Reveltronics hay được dùng để brute-force password ghi trên các module từ chối ghi hoàn toàn. Bản thân tôi chưa bao giờ cần đến cái đó, nên cứ coi như một gợi ý và tự kiểm chứng trên phần cứng bạn chấp nhận mất được.
Khớp với những gì tôi thấy ở đây. Trang thứ hai cũng có sẵn, nên cả hai nửa bộ nhớ đều đọc được:
Tôi sẽ đấu lại dây cho cage cho đàng hoàng rồi thử hướng checksum trên một module không tiếc trước khi đụng vào bất cứ thứ gì muốn giữ lại. QSFP+ thì tạm gác lại, xây thêm một cage thứ hai chỉ cho hai module một năm thì khó biện minh, nên chúng sẽ ở dạng chỉ đọc cho tới khi tôi quyết định Hubble có đáng công hay không.
Bổ sung thêm từ đầu bên kia của thang giá, vì không phải ai cũng tự chế: các tool hay thấy dùng hàng ngày là SNR SFP Writer, dòng SFPTotal Plus, và nhiều thiết bị tự làm khác nhau xây quanh board CH341, đúng loại chip bạn đã có sẵn trên bench.
Điều đáng biết trước khi đi sâu hơn là không phải module nào cũng là một EEPROM trơn. Một số mang theo microcontroller riêng giả lập bộ nhớ A0/A2 thay vì phơi ra một chip thật, ví dụ hay được nhắc tới là một Medick SFP-10G-BX với con C8051F392 bên trong. Những loại đó có thể cài password ghi hoặc cơ chế challenge riêng của vendor, và có chọc vào bus kiểu gì cũng không biến chúng thành một EEPROM đơn giản được. Trường hợp gai góc nhất người ta hay nhắc là EEPROM tương tác kèm key của HP/Aruba.
Một lưu ý thực tế cho cage tự làm của bạn: phải đúng pinout, không thì sẽ đuổi theo bóng ma suốt. TX_Disable là chân 3, Mod_Abs là chân 6, VeeR là chân 9. Mod_Abs đặc biệt quan trọng vì nó quyết định có bất cứ thứ gì tin là module đang hiện diện hay không.
Và về phía rủi ro, vì chuyện này hiếm khi được nhắc tới cho tới khi ai đó có một module chết hẳn. Rất nhiều module đòi password 4 byte trước khi chấp nhận ghi. Phần lớn các password đó trôi nổi công khai và không có utility nào là chung cho tất cả, nên cuối cùng bạn có cả đống tool riêng theo từng vendor và image lấy từ database firmware hoặc từ nhà sản xuất. Sai một chút trong đó là brick mất một module đắt hơn cả cái programmer.
Vậy nên trước khi đụng vào EEPROM, hãy chứng minh module thực sự hỏng đã: đọc nhiệt độ, điện áp, bias current và TX/RX power từ DDM ở A0h/A2h, vệ sinh chốt cài, tiếp điểm và lens, thử thay bằng một module chắc chắn còn tốt, và load-test link bằng iperf3. Một nửa số module tưởng cần reflash thực ra chỉ cần vệ sinh.
Nếu thích trả tiền hơn là hàn, nên biết là các hộp thương mại cũng có chiêu riêng của chúng. FS Box recode khá mượt, người ta từng làm module FS SFP-GE-BX chạy được trên một Intel X710 với autoselect theo cách đó, nhưng nó chỉ lập trình được module của FS thôi, và cắm một module không phải FS vào đã khiến người dùng bị khóa tài khoản cả tuần.