Files
fan_controller-v2/src/i2c.h
2026-04-12 20:11:17 +02:00

38 lines
1.1 KiB
C

/* Bunch of i2c helper functions and defs mostly */
#ifndef I2C_H
#define I2C_H
#define I2C_DEVICE_ADDR 0x2b
#define I2C_REG_WHOAMI 0x00
#define I2C_REG_CURRENT_RPM 0x02
#define I2C_REG_TARGET_RPM 0x04
#define I2C_REG_CURRENT_DUTY 0x06
#define I2C_REG_MAX_DUTY 0x08
#define I2C_REG_STATE 0x0a
#define I2C_REG_MODE 0x0b
static void i2c_set_register_word(volatile uint8_t* reg, const uint8_t addr, const uint16_t value) {
if (addr % 2) return;
reg[addr] = value >> 8;
reg[addr + 1] = value & 0xff;
}
static uint16_t i2c_get_register_word(volatile uint8_t* reg, const uint8_t addr) {
if (addr % 2) return 0;
return (reg[addr] << 8) + reg[addr + 1];
}
static void i2c_registers_reinit(volatile uint8_t* reg) {
i2c_set_register_word(reg, I2C_REG_WHOAMI, 26923); // magic value ;)
i2c_set_register_word(reg, I2C_REG_MAX_DUTY, fan_driver_pwm_get_max_duty());
}
static void i2c_registers_set_defaults(volatile uint8_t* reg) {
i2c_set_register_word(reg, I2C_REG_TARGET_RPM, 750);
reg[I2C_REG_MODE] = 0x01; // target rpm mode, power enabled
}
#endif //I2C_H