CodingBox Q&A Ask question

Скрипт для опроса DDM по I2C: в каких байтах A2h живут текущие значения, а в каких - пороги

Asked Active Viewed 319 AI translation from English
7

Пишу небольшой опросчик, который снимает температуру, напряжение, ток смещения и оптическую мощность прямо с модулей на наших whitebox-коробках, чтобы получить график тренда вместо того, чтобы кто-то смотрел на линк глазами уже после того, как он начал сыпать ошибками. NOS печатает красивые значения, но мне нужны сырые числа рядом с вендорными порогами, чтобы уровни тревог были одинаковыми для разной оптики, а не прописаны вручную под каждую модель.

Стенд:

  • хост Linux, клетки модулей за обычным мультиплексором I2C, шина 1
  • смешанная оптика SFP, SFP+ и SFP28 от трёх вендоров
  • чтение только через i2c-tools, без вендорского SDK

Страницу диагностики я читаю так:

# i2cdump -y 1 0x51

а вот мой черновой парсер, в котором я не уверен:

temp = s16(a2[96:98]) / 256.0
vcc  = u16(a2[98:100]) * 100e-6
bias = u16(a2[100:102]) * 2e-6

Что я уже сделал:

  • сравнил свои вычисленные значения с тем, что печатает NOS: на одних модулях близко, на других явно не сходится
  • прочитал SFF-8472, но всё ещё не могу уверенно сказать, где заканчивается блок порогов и где начинается область калибровки
  • исключил мультиплексор, считав тот же модуль напрямую с шины - цифры те же

Итак: какова реальная карта A2h, где живут пороги, где начинаются значения реального времени, и есть ли где-нибудь флаг, который говорит мне, что модуль ожидает от меня какого-то действия над этими сырыми словами, прежде чем им можно доверять?

Comments 7

Какие значения именно не сходятся - все четыре, или только ток смещения и мощности? Обычно это и решает весь ответ. Также заодно считайте A0h и посмотрите байт 92: он говорит, сообщает ли модуль диагностику вообще, и калибруется ли он внутренне или внешне. Если часть вашего парка калибруется внешне, а ваш парсер обрабатывает всех одинаково, то расхождение - это ожидаемое поведение, а не ошибка в вашей арифметике.

1 United Statescoaxhawk46US Show original (English) AI translation

Считал байт 92 из A0h по всему лотку, и он неоднороден. Часть модулей отмечает внешнюю калибровку, часть нет, и именно те, что расходятся с выводом NOS, - это внешние. Температура и напряжение в пределах шума на всех модулях; расходятся именно ток смещения и обе мощности. То есть похоже, что я пропускаю какой-то шаг, а не читаю не те смещения. Что мне на самом деле нужно сделать с сырыми словами на этом подмножестве?

2 South KoreanetrunnerKR Show original (English) AI translation

A2h по адресу 0x51 делится на четыре важных для вас блока:

  • байты 0-55: пороги тревог и предупреждений, верхний и нижний для каждого из температуры, напряжения, тока смещения, мощности TX и мощности RX
  • байты 56-95: константы внешней калибровки
  • байты 96-105: значения реального времени
  • байт 110: статус и управление, включая TX disable, TX fault и RX LOS

Единицы в блоке текущих значений: температура со знаком, 1/256 °C на младший разряд; напряжение 100 мкВ на разряд; ток смещения 2 мкА; мощность TX и RX по 0,1 мкВт. Ваш фрагмент кода уже масштабирует это правильно, так что дело не в смещениях.

Недостающая часть - это тот флаг, который вы только что нашли. На модуле с внешней калибровкой слова по адресам 96-105 - это сырой вывод АЦП, и константы из 56-95 нужно применить к ним, прежде чем они станут осмысленными; модуль с внутренней калибровкой уже сделал это за вас. Эта развилка и есть разница между вашими двумя группами.

Если хотите сверить разметку, а не просто верить мне на слово, заголовок sff8472.h из FreeBSD и py-sfp-eeprom оба расписывают смещения поле за полем. Я бы всё же проверил по одному модулю на каждого вендора против значения, которому вы доверяете, прежде чем вешать на это тревоги.

3 United Statesporttech22US Show original (English) AI translation

Стоит добавить, почему блок порогов - интересная половина. Значения в 0-55 находятся в тех же единицах, что и блок текущих значений, так что как только ваше масштабирование верно, вы получаете собственные вендорские точки тревоги и предупреждения бесплатно и никогда не должны придумывать лимиты под каждую модель. Уже одно это оправдывает прямое чтение A2h вместо разбора чьего-то красивого вывода.

Одно практическое замечание из опыта работы с этим на смешанном лотке: держите интервал опроса умеренным. Эта страница - обычное чтение по I2C, а контроллер модуля не быстрый. Долбить каждый модуль каждую секунду на шине, которая к тому же сидит за мультиплексором, - хороший способ насобирать коротких чтений, которые на ваших графиках выглядят точь-в-точь как флапающая оптика.

1 Brazilopticnerd31BR Show original (English) AI translation

Формулируйте это осторожнее, потому что люди читают это как «всегда применяй константы», а потом удивляются, почему их числа стали хуже. Константы из 56-95 применяются только тогда, когда байт 92 в A0h говорит, что модуль калибруется внешне. Примените их к модулю с внутренней калибровкой, и вы превратите вполне хорошие показания в бессмыслицу, потому что модуль уже сделал эту работу сам. Сначала читайте флаг, разветвляйтесь по нему, держите обе ветки в парсере и логируйте, по какой ветке прошёл конкретный модуль, чтобы потом можно было отличить два вида отказа друг от друга.

Тот же класс ловушки с температурой: она со знаком. Разберите её как беззнаковую, и всё, что ниже нуля, вернётся диким высоким числом, что довольно забавно в первое же холодное утро, когда это разбудит вас пейджером.

4 United StatesqsfpwolfUS Show original (English) AI translation

Отчёт с моей стороны. Я сделал развилку по байту 92 из A0h и применяю константы только там, где модуль говорит про внешнюю калибровку. Ток смещения и обе мощности теперь совпадают с тем, что печатает NOS, на каждом модуле, который я мог сравнить, а температура и напряжение никогда и не были проблемой. Два модуля всё ещё сообщают, что диагностика присутствует, но возвращают пороги, которым я бы не доверял, так что для них я откатываюсь на собственные лимиты и помечаю модуль в инвентаре, а не притворяюсь. Не назову это полностью закрытым, но та карта выше была именно тем, чего мне не хватало.

3 South KoreanetrunnerKR Show original (English) AI translation

Ещё одна вещь перед тем, как это пойдёт в продакшен. Байт 110 находится на той же странице и содержит статус плюс управление, а в половине управления есть TX disable. Опросчику вообще нечего писать в A2h, но если ваша библиотека где-то делает read-modify-write, или вы промахнётесь пальцем с i2cset, тестируя на живой коробке, вы можете уронить клиентский линк из userspace. Открывайте шину только на чтение в опросчике и держите любой путь записи в отдельном инструменте, который приходится запускать намеренно.

Тот же байт даёт вам TX fault и RX LOS, и оба стоит выводить рядом с аналоговыми значениями. Модуль с адекватной мощностью RX, но выставленным LOS, рассказывает совсем другую историю, чем тот, что просто показывает низкое значение.

0 Indiawaverunner21IN Show original (English) AI translation
Log in to comment. Log in