Данные берутся из документации на аккумулятор и результатов тестирования, после чего жестко прописываются в коде драйвера (например, через Device Tree в Linux) или инициализируются динамически.
Кто и как формирует эти данные?
1. Разработчик платы (Hardware/Firmware Engineer)
Вы задаете базовые параметры вашей схемы и требования к работе устройства:
cur_sense_val: Номинал токоизмерительного резистора, который распаян на вашей плате (в миллиомах).
valrt_thresh, talrt_thresh, soc_alrt_thresh: Пороги прерываний (Alert) по напряжению, температуре и уровню заряда, которые нужны вашей системе.
cell_technology: Химия батареи (например, Li-ion или LiFePO4) для системного API.
2. Производитель ячейки (Battery Datasheet)
Эти значения вы копируете из официального паспорта (Datasheet) на выбранный аккумулятор:
design_cap: Номинальная емкость батареи.
ichgt_term: Ток окончания зарядки (из алгоритма CC/CV в даташите).
vempty: Напряжение, при котором батарея считается полностью разряженной (например, 3.0V или 2.75V).
3. Компания Maxim Integrated (ныне Analog Devices)
Самый сложный блок — это массив cell_char_tbl (таблица характеристик) и сопутствующие регистры rcomp0, temp_co, qrtblXX.
Как их получить: Вы отправляете несколько экземпляров вашей батареи в лабораторию Analog Devices. Они проводят циклы заряда/разряда при разных температурах.
Результат: Лаборатория выдает готовый текстовый файл конфигурации (обычно с расширением .ini), содержащий шестнадцатеричные значения для этих регистров. Вы просто копируете их в код.
Как это работает при загрузке?
Микросхема MAX17042 сбрасывает свои регистры при потере питания.
При старте системы ваш драйвер считывает структуру max17042_config_data.
Драйвер поочередно записывает эти конфигурационные параметры во внутренние регистры микросхемы по I2C/SMBus.
Только после этого алгоритм ModelGauge m3 начинает точно считать проценты заряда (SoC).