2026-09-16 完成、当时未提交,这里补提交(原样,不含 09-27 上板的修改)。 - 器件层 / 拓扑层整体从 R1 换到 R2:TCA9548A 分通道、五路同址 INA226 0x40 + 输入侧 0x43、 刀片 PCA9555(VBUS_EN 挪到 P0.4)、CH224A 只读驱动、风扇闭环 t_thermal - 新增 i2cbus(mux 原子事务)、slot(刀片 I/O 门面)、host/qtest.sh - 74HC595 链退役(代码与测试保留) - 判据阈值与时间常量未动;19 个 ctest 全绿,idf.py build 通过 Co-Authored-By: Claude Opus 5.5 <[email protected]>
67 行
1.8 KiB
C
67 行
1.8 KiB
C
/* CH224A 驱动(只读)。只经 hal_i2c_*,不碰任何平台头文件。契约见 ch224a.h。
|
||
⚠️ 本文件里**没有任何写寄存器的函数**,那是有意的(头文件那个框)。 */
|
||
#include "ch224a.h"
|
||
|
||
#include <stddef.h>
|
||
|
||
#include "hal_i2c.h"
|
||
|
||
/* 0x50 的单位是 50 mA/LSB(R2 §36.2)。 */
|
||
uint32_t ch224a_ma_from_reg(uint8_t reg) { return (uint32_t)reg * 50u; }
|
||
|
||
uint32_t ch224a_power_limit_mw(uint32_t ma)
|
||
{
|
||
/* 20 V × ma(mA) = mW。20000 mV × mA / 1000 = 20 × mA。 */
|
||
return (uint32_t)((uint64_t)CH224A_FIXED_MV * ma / 1000u);
|
||
}
|
||
|
||
bool ch224a_addr_ok(uint8_t addr)
|
||
{
|
||
/* 主干上的器件 + 刀片支路上的两个。任何一个撞上都会让「选到通道 5」
|
||
之后的读写打到错的器件上。 */
|
||
static const uint8_t others[] = { 0x20, 0x40, 0x43, 0x4A, 0x4B, 0x70 };
|
||
|
||
if (addr > 0x7f) {
|
||
return false;
|
||
}
|
||
for (size_t i = 0; i < sizeof(others); i++) {
|
||
if (others[i] == addr) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
static hal_err_t read_reg(uint8_t addr, uint8_t reg, uint8_t *val)
|
||
{
|
||
return hal_i2c_write_read(addr, ®, 1, val, 1);
|
||
}
|
||
|
||
hal_err_t ch224a_probe(uint8_t addr)
|
||
{
|
||
uint8_t st = 0;
|
||
return read_reg(addr, CH224A_REG_STATUS, &st);
|
||
}
|
||
|
||
hal_err_t ch224a_read_status(uint8_t addr, uint8_t *status)
|
||
{
|
||
if (status == NULL) {
|
||
return HAL_ERR_ARG;
|
||
}
|
||
return read_reg(addr, CH224A_REG_STATUS, status);
|
||
}
|
||
|
||
hal_err_t ch224a_read_max_ma(uint8_t addr, uint32_t *ma)
|
||
{
|
||
if (ma == NULL) {
|
||
return HAL_ERR_ARG;
|
||
}
|
||
uint8_t reg = 0;
|
||
const hal_err_t err = read_reg(addr, CH224A_REG_CURRENT, ®);
|
||
if (err != HAL_OK) {
|
||
return err; /* 读失败时不动调用方的值:旧的上限比一个 0 可信 */
|
||
}
|
||
*ma = ch224a_ma_from_reg(reg);
|
||
return HAL_OK;
|
||
}
|