ZHCACL8A october 2022 – april 2023 LP8764-Q1 , TPS6594-Q1
更新第 3 頁和第 1 頁寄存器 CRC 內(nèi)容的過程使用 PMIC 中的 CRC 更新特性。運行 CRC 更新之前,請清除地址 0xF0 到 0xFB 中的寄存器 CRC 內(nèi)容。設(shè)置第 0 頁寄存器 0xEF 的位 1 后,將執(zhí)行 CRC 更新。該位會自行清除。更新完成后,第 0 頁地址 0xFB 的內(nèi)容變?yōu)榉橇阒?。建議對寄存器 0xFB 執(zhí)行這項從 0 變?yōu)榉橇阒档臋z查以確認(rèn) CRC 完成,然后再嘗試?yán)^續(xù)執(zhí)行下一步。
PMIC CRC 更新特性計算第 0、1、3 和 4 頁的 CRC。第 2 頁是受保護(hù)的存儲空間以及相關(guān)的 CRC,本文檔未對此進(jìn)行介紹。在大多數(shù)應(yīng)用中,用戶寄存器的計算(第 1 頁和第 4 頁的組合)不正確。第 0 頁寄存器 0x82 的值與默認(rèn)值不匹配,請參閱AppendixB,并且只能從串行接口讀取寄存器中的 SPMI_LPM_EN 位和 FORCE_EN_DRV_LOW 位。
第 0 頁和第 4 頁寄存器 CRC 有兩個組成部分:包含持續(xù)和排除持續(xù)。如表 5-4 所示,包含持續(xù) CRC 信息存儲在第 0 頁寄存器 0xF0 和 0xF1 中,排除持續(xù)存儲在第 0 頁寄存器 0xF2 和 0xF3 中。
寄存器 | 地址,第 0 頁 | Bit7-Bit0 |
---|---|---|
CRC_1 | 0xF0 | REGMAP_USER_INCLUDE_PERSIST_CRC16_LOW |
CRC_2 | 0xF1 | REGMAP_USER_INCLUDE_PERSIST_CRC16_HIGH |
CRC_3 | 0xF2 | REGMAP_USER_EXCLUDE_PERSIST_CRC16_LOW |
CRC_4 | 0xF3 | REGMAP_USER_EXCLUDE_PERSIST_CRC16_HIGH |
以下代碼片段中顯示的 CRC 計算取自可擴(kuò)展 PMIC GUI(請參閱參考文獻(xiàn) 3)。AppendixC 作為寄存器信息的數(shù)組提供。與看門狗相關(guān)的信息將映射到適當(dāng)?shù)奈恢?,如果不?NVM 支持,寄存器將填充默認(rèn)設(shè)置,如果未定義,則填充 0x00。
const CRC_POLYNOMIAL = 0x755b;
var calculate_register_crc = function(registers, regmap_json, include_persist, page) {
crc = 0xffff;
for (var address = 0; address < 0x100; address++) {
var data;
var json_address;
if (address >= 0xf0 && page === 0) {
// Watchdog registers is mapped from 0x0fX in array to 0x40X in register map
// Offset by 1 since 0x0f0 is mapped to 0x401
json_address = address + 0x310 + 1;
} else {
json_address = address + (page * 0x100);
}
if (registers[address] === undefined) {
if (json_address in regmap_json) {
// Non-NVM register uses reset value
data = regmap_json[json_address].reset;
} else {
// Register does not exist, so reads 0s
data = 0;
}
} else {
// Regsiter is NVM-backed, use value from device
data = registers[address];
}
var crc_mask = 0x00;
if (json_address in regmap_json) {
if (include_persist) {
crc_mask = regmap_json[json_address].crc_mask_include_persist;
} else {
crc_mask = regmap_json[json_address].crc_mask_exclude_persist;
}
}
data = data & crc_mask;
crc = crc_d8(crc, data);
}
return crc;
};
// Calculate CRC based on look-up table
var crc_d8 = function(crc, data) {
var table_index = data ^ ((crc & 0xff00) >> 8);
crc = (crc << 8) ^ lookup_table[table_index];
return crc & 0xffff;
};
// Compute lookup-table used for CRC calculation
crc = 0x8000;
for (var i = 1; i < 256; i <<= 1) {
if ((crc & 0x8000) !== 0) {
crc = ((crc << 1) ^ CRC_POLYNOMIAL) & 0xffff;
} else {
crc = (crc << 1) & 0xffff;
}
for (var j = 0; j < i; j++) {
lookup_table[i+j] = crc ^ lookup_table[j];
}
}