in meta-facebook/recipes-utils/pem/files/pem.c [288:376]
static int pem_reg_write(int fd, uint8_t reg, int value) {
uint8_t byte;
uint16_t word;
if (fd <= 0)
return -1;
switch (reg) {
case ENERGY:
case TIME_COUNTER:
case EE_SCRATCH:
case VIN:
case VOUT:
case VGPIO:
case VSENSE:
case POWER:
case STATUS:
break;
case CONTROL:
case ALERT:
case VGPIO_MIN:
case VGPIO_MAX:
case VSOURCE_MIN:
case VSOURCE_MAX:
case VSENSE_MIN:
case VSENSE_MAX:
case POWER_MIN:
case POWER_MAX:
word = value & 0xFFFF;
word = i2c_smbus_write_word_data(fd, smbus_ltc4282[reg].reg, word);
break;
case EE_CONTROL:
case EE_ALERT:
/* ltc4282 eeprom not support word write */
word = value & 0xFFFF;
if(wait_eeprom_done(fd) == -1)
return -1;
byte = (word & 0xFF00) >> 8;
byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[reg].reg, byte);
if(wait_eeprom_done(fd) == -1)
return -1;
byte = word & 0xFF;
byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[reg].reg + 1, byte);
break;
case FAULT_LOG:
case ADC_ALERT_LOG:
case FET_BAD_FAULT_TIME:
case GPIO_CONGIG:
case VGPIO_ALARM_MIN:
case VGPIO_ALARM_MAX:
case VSOURCE_ALARM_MIN:
case VSOURCE_ALARM_MAX:
case VSENSE_ALARM_MIN:
case VSENSE_ALARM_MAX:
case POWER_ALARM_MIN:
case POWER_ALARM_MAX:
case CLOCK_DIVIDER:
case ILIM_ADJUST:
case ALERT_CONTROL:
case ADC_CONTROL:
byte = value & 0xFF;
byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[reg].reg, byte);
break;
case EE_FAULT:
case EE_ADC_ALERT_LOG:
case EE_FET_BAD_FAULT_TIME:
case EE_GPIO_CONFIG:
case EE_VGPIO_ALARM_MIN:
case EE_VGPIO_ALARM_MAX:
case EE_VSOURCE_ALARM_MIN:
case EE_VSOURCE_ALARM_MAX:
case EE_VSENSE_ALARM_MIN:
case EE_VSENSE_ALARM_MAX:
case EE_POWER_ALARM_MIN:
case EE_POWER_ALARM_MAX:
case EE_CLOCK_DECIMATOR:
case EE_ILIM_ADJUST:
if(wait_eeprom_done(fd) == -1)
return -1;
byte = value & 0xFF;
byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[reg].reg, byte);
break;
default:
break;
}
return 0;
}