Fix GL518SM hardware monitor

This commit is contained in:
RichardG867
2020-11-11 14:47:46 -03:00
parent 31e36b98c0
commit 63ad6202fc

View File

@@ -122,19 +122,45 @@ gl518sm_smbus_read_word_cmd(uint8_t addr, uint8_t cmd, void *priv)
static uint16_t static uint16_t
gl518sm_read(gl518sm_t *dev, uint8_t reg) gl518sm_read(gl518sm_t *dev, uint8_t reg)
{ {
uint16_t ret = dev->regs[reg & 0x1f]; uint16_t ret;
reg &= 0x1f;
switch (reg) { switch (reg) {
case 0x07: case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x04: /* temperature */
/* two-byte registers: leave as-is */ ret = (dev->values->temperatures[0] + 119) & 0xff;
break; break;
default: case 0x07: /* fan speeds */
/* single-byte registers: duplicate low byte to high byte (real hardware behavior unknown) */ ret = GL518SM_RPM_TO_REG(dev->values->fans[0], 1 << ((dev->regs[0x0f] >> 6) & 0x3)) << 8;
ret |= (ret << 8); ret |= GL518SM_RPM_TO_REG(dev->values->fans[1], 1 << ((dev->regs[0x0f] >> 4) & 0x3));
break;
case 0x0d: /* VIN3 - AOpen System Monitor requires an approximate voltage offset of 13 at least here */
ret = 13 + GL518SM_VOLTAGE_TO_REG(dev->values->voltages[2]);
break;
case 0x13: /* VIN2 */
ret = 13 + GL518SM_VOLTAGE_TO_REG(dev->values->voltages[1]);
break;
case 0x14: /* VIN1 */
ret = 13 + GL518SM_VOLTAGE_TO_REG(dev->values->voltages[0]);
break;
case 0x15: /* VDD */
ret = 13 + GL518SM_VDD_TO_REG(dev->values->voltages[3]);
break;
default: /* other registers */
ret = dev->regs[reg];
break; break;
} }
/* Duplicate the low byte to the high byte on single-byte registers, although real hardware behavior is undefined. */
if ((reg < 0x07) || (reg > 0x0c))
ret |= ret << 8;
gl518sm_log("GL518SM: read(%02X) = %04X\n", reg, ret); gl518sm_log("GL518SM: read(%02X) = %04X\n", reg, ret);
return ret; return ret;
@@ -176,26 +202,22 @@ gl518sm_write(gl518sm_t *dev, uint8_t reg, uint16_t val)
return 0; return 0;
case 0x0a: case 0x0a:
dev->regs[0x13] = (val & 0xff); dev->regs[0x13] = val & 0xff;
break; break;
case 0x03: case 0x03:
dev->regs[reg] = (val & 0xfc); dev->regs[reg] = val & 0xfc;
if (val & 0x80) /* Init */ if (val & 0x80) /* Init */
gl518sm_reset(dev); gl518sm_reset(dev);
break; break;
case 0x0f: case 0x0f:
dev->regs[reg] = (val & 0xf8); dev->regs[reg] = val & 0xf8;
/* update fan values to match the new divisor */
dev->regs[0x07] = (GL518SM_RPM_TO_REG(dev->values->fans[0], 1 << ((dev->regs[0x0f] >> 6) & 0x3)) << 8);
dev->regs[0x07] |= GL518SM_RPM_TO_REG(dev->values->fans[1], 1 << ((dev->regs[0x0f] >> 4) & 0x3));
break; break;
case 0x11: case 0x11:
dev->regs[reg] = (val & 0x7f); dev->regs[reg] = val & 0x7f;
break; break;
default: default:
@@ -214,21 +236,14 @@ gl518sm_reset(gl518sm_t *dev)
dev->regs[0x00] = 0x80; dev->regs[0x00] = 0x80;
dev->regs[0x01] = 0x80; /* revision 0x80 can read all voltages */ dev->regs[0x01] = 0x80; /* revision 0x80 can read all voltages */
dev->regs[0x04] = ((dev->values->temperatures[0] + 119) & 0xff);
dev->regs[0x05] = 0xc7; dev->regs[0x05] = 0xc7;
dev->regs[0x06] = 0xc2; dev->regs[0x06] = 0xc2;
dev->regs[0x07] = ((GL518SM_RPM_TO_REG(dev->values->fans[0], 8) << 8) | GL518SM_RPM_TO_REG(dev->values->fans[1], 8));
dev->regs[0x08] = 0x6464; dev->regs[0x08] = 0x6464;
dev->regs[0x09] = 0xdac5; dev->regs[0x09] = 0xdac5;
dev->regs[0x0a] = 0xdac5; dev->regs[0x0a] = 0xdac5;
dev->regs[0x0b] = 0xdac5; dev->regs[0x0b] = 0xdac5;
dev->regs[0x0c] = 0xdac5; dev->regs[0x0c] = 0xdac5;
/* AOpen System Monitor requires an approximate voltage offset of 13 at least on 3.3V (voltages[2]) */
dev->regs[0x0d] = 13 + GL518SM_VOLTAGE_TO_REG(dev->values->voltages[2]);
dev->regs[0x0f] = 0xf8; dev->regs[0x0f] = 0xf8;
dev->regs[0x13] = 13 + GL518SM_VOLTAGE_TO_REG(dev->values->voltages[1]);
dev->regs[0x14] = 13 + GL518SM_VOLTAGE_TO_REG(dev->values->voltages[0]);
dev->regs[0x15] = 13 + GL518SM_VDD_TO_REG(5000);
} }
@@ -254,14 +269,15 @@ gl518sm_init(const device_t *info)
/* Set default values. */ /* Set default values. */
hwm_values_t defaults = { hwm_values_t defaults = {
{ /* fan speeds */ { /* fan speeds */
3000, /* System */ 3000, /* usually Chassis */
3000 /* CPU */ 3000 /* usually CPU */
}, { /* temperatures */ }, { /* temperatures */
30 /* CPU */ 30 /* usually CPU */
}, { /* voltages */ }, { /* voltages */
hwm_get_vcore(), /* Vcore */ hwm_get_vcore(), /* Vcore */
RESISTOR_DIVIDER(12000, 150, 47), /* +12V (15K/4.7K divider suggested in the GL518SM datasheet) */ RESISTOR_DIVIDER(12000, 150, 47), /* +12V (15K/4.7K divider suggested in the datasheet) */
3300 /* +3.3V */ 3300, /* +3.3V */
5000 /* +5V */
} }
}; };
hwm_values = defaults; hwm_values = defaults;