Scripting polling DDM lewat I2C: byte A2h mana yang menyimpan nilai live dan mana yang threshold
Saya sedang menulis poller kecil yang menarik temperature, voltage, bias, dan optical power langsung dari modul-modul di whitebox kami, jadi kami dapat trend line, bukan cuma orang yang melototin link setelah dia mulai error. NOS-nya mencetak nilai yang rapi, tapi saya mau angka mentahnya dengan threshold vendor di sebelahnya supaya level alarm-nya konsisten lintas optik campuran, bukan ditulis tangan per model.
Setup-nya:
- host Linux, cage modul di belakang I2C mux biasa, bus 1
- optik SFP, SFP+, dan SFP28 campuran dari tiga vendor
- baca cuma pakai i2c-tools, tanpa SDK vendor
Saya baca halaman diagnostik-nya begini:
# i2cdump -y 1 0x51
dan ini draft parser saya, di sinilah saya tidak yakin:
temp = s16(a2[96:98]) / 256.0
vcc = u16(a2[98:100]) * 100e-6
bias = u16(a2[100:102]) * 2e-6
Yang sudah saya lakukan:
- bandingkan nilai hasil hitungan saya dengan yang dicetak NOS: dekat di sebagian modul, jelas meleset di yang lain
- baca SFF-8472, tapi saya masih belum bisa bilang dengan yakin di mana blok threshold berakhir dan di mana area kalibrasi mulai
- singkirkan mux-nya dengan dump modul yang sama di bus langsung, angkanya sama
Jadi: bagaimana peta sebenarnya A2h, di mana threshold-nya tinggal, di mana nilai real-time-nya mulai, dan apa ada flag di suatu tempat yang bilang ke saya apakah modulnya mengharapkan saya melakukan sesuatu ke raw word itu sebelum saya percaya?
Comments 7
Nilai mana yang jelas meleset, keempatnya atau cuma bias dan kedua power-nya? Itu biasanya menentukan seluruh jawabannya. Sekalian dump A0h juga selagi kamu di situ dan lihat byte 92: itu memberi tahu apakah modulnya melaporkan diagnostik sama sekali, dan apakah dia dikalibrasi internal atau eksternal. Kalau sebagian fleet kamu dikalibrasi eksternal dan parser kamu memperlakukan semuanya sama, maka ketidakcocokan itu perilaku yang diharapkan, bukan bug di aritmetika kamu.
Sudah tarik byte 92 A0h di seluruh tray dan tidak seragam. Sebagian modul menandai kalibrasi eksternal, sebagian tidak, dan yang tidak cocok dengan output NOS itu persis yang eksternal. Temperature dan voltage-nya dalam batas noise di semuanya; bias dan kedua power-nya yang melenceng. Jadi kelihatannya saya melewatkan satu langkah, bukan baca offset yang salah. Apa sebenarnya yang harus saya lakukan ke raw word di subset itu?
A2h di 0x51 terbagi jadi empat bagian yang relevan buat kamu:
Unit di blok live-nya: temperature signed, 1/256 C per LSB; voltage 100 uV per LSB; bias 2 uA; TX dan RX power 0.1 uW. Snippet kamu sudah men-scale itu dengan benar, jadi offset bukan masalah kamu.
Bagian yang hilang itu flag yang baru saja kamu temukan. Di modul yang dikalibrasi eksternal, word di 96-105 itu raw ADC output, dan konstanta di 56-95 harus diterapkan dulu sebelum artinya jadi jelas; modul yang dikalibrasi internal sudah melakukan itu untuk kamu. Percabangan itulah bedanya dua kelompok kamu.
Kalau kamu mau layout untuk dicek ulang, bukan cuma percaya omongan saya, header sff8472.h FreeBSD dan py-sfp-eeprom sama-sama menjabarkan offset-nya field demi field. Saya tetap akan verifikasi satu modul per vendor terhadap nilai yang kamu percaya sebelum menggantungkan alarm ke situ.
Layak ditambahkan kenapa blok threshold-nya separuh yang menarik. Nilai di 0-55 itu unit-nya sama dengan blok live-nya, jadi begitu scaling kamu benar, kamu dapat titik alarm dan warning milik vendor sendiri secara gratis dan tidak pernah perlu mengarang limit per model. Itu saja sudah membenarkan baca A2h langsung, bukannya parsing pretty printer punya orang lain.
Satu catatan praktis dari menjalankan ini di tray campuran: jaga poll interval-nya tetap moderat. Halaman itu cuma I2C read biasa dan controller modulnya tidak cepat. Menghantam tiap modul tiap detik di bus yang juga duduk di belakang mux itu cara bagus untuk mengumpulkan short read yang kelihatan persis seperti optik yang flapping di graph kamu.
Hati-hati cara mengucapkannya, karena orang membacanya sebagai "selalu terapkan konstantanya" lalu bingung kenapa angka mereka malah jadi lebih buruk. Konstanta di 56-95 cuma berlaku kalau byte 92 di A0h bilang modulnya dikalibrasi eksternal. Terapkan itu ke modul yang dikalibrasi internal dan kamu mengubah pembacaan yang sudah bagus jadi omong kosong, karena modulnya sudah melakukan pekerjaan itu. Baca flag-nya dulu, percabangan berdasarkan itu, simpan kedua jalur di parser-nya dan log jalur mana yang diambil modul tertentu supaya kamu bisa membedakan dua mode kegagalan itu belakangan.
Jebakan sejenis dengan temperature: itu signed. Parse sebagai unsigned dan apa pun di bawah nol kembali sebagai angka yang tinggi sekali, yang lumayan menghibur di pagi dingin pertama waktu itu nge-page kamu.
Update dari sisi saya. Saya bikin percabangan di byte 92 A0h dan terapkan konstanta cuma di tempat modulnya bilang eksternal. Bias dan kedua power sekarang mengikuti apa yang dicetak NOS di setiap modul yang bisa saya bandingkan, dan temperature sama voltage memang dari awal tidak pernah jadi masalah. Dua modul masih melaporkan diagnostik ada tapi mengembalikan threshold yang tidak saya percaya, jadi untuk itu saya fallback ke limit saya sendiri dan tandai modulnya di inventory, bukannya pura-pura. Belum saya sebut ini selesai total, tapi peta di atas itu persis yang saya lewatkan.
Satu hal lagi sebelum ini masuk produksi. Byte 110 ada di halaman yang sama dan isinya status plus control, dan separuh control-nya termasuk TX disable. Poller sebenarnya tidak punya urusan menulis ke A2h sama sekali, tapi kalau library kamu melakukan read-modify-write di mana pun, atau kamu salah pencet i2cset waktu testing di box yang live, kamu bisa menjatuhkan link customer dari userspace. Buka bus-nya read-only di poller dan simpan jalur write apa pun di tool terpisah yang harus kamu jalankan sengaja.
Byte yang sama memberi kamu TX fault dan RX LOS, dan keduanya layak diekspor di samping nilai analognya. Modul yang duduk di RX power yang wajar dengan LOS ter-assert itu cerita yang sangat berbeda dibanding yang cuma terbaca rendah.