in meta-facebook/recipes-utils/pem/files/pem.c [154:259]
static int pem_reg_read(int fd, uint8_t reg, void *value) {
uint8_t byte;
uint16_t word = 0;
if (fd <= 0 || value == NULL)
return -1;
switch (reg) {
case ENERGY:
case TIME_COUNTER:
case EE_SCRATCH:
return -1;
case VGPIO:
byte = i2c_smbus_read_byte_data(fd, smbus_ltc4282[ILIM_ADJUST].reg);
/* Select GPIO3 */
byte &= (~0x03);
byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[ILIM_ADJUST].reg, byte);
msleep(100);
word = i2c_smbus_read_word_data(fd, smbus_ltc4282[reg].reg);
*(uint16_t *)value = ((uint16_t)(word << 8) | word >> 8);
break;
case VIN:
byte = i2c_smbus_read_byte_data(fd, smbus_ltc4282[ILIM_ADJUST].reg);
/* Select Vin, Enable 12-bits mode */
byte |= 0x05;
byte &= (~0x03);
byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[ILIM_ADJUST].reg, byte);
msleep(100);
word = i2c_smbus_read_word_data(fd, smbus_ltc4282[reg].reg);
*(uint16_t *)value = ((uint16_t)(word << 8) | word >> 8);
break;
case VOUT:
byte = i2c_smbus_read_byte_data(fd, smbus_ltc4282[EE_ILIM_ADJUST].reg);
/* Select Vout, Enable 12-bits mode */
byte |= 0x01;
byte &= (~0x05);
byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[ILIM_ADJUST].reg, byte);
msleep(100);
word = i2c_smbus_read_word_data(fd, smbus_ltc4282[reg].reg);
*(uint16_t *)value = ((uint16_t)(word << 8) | word >> 8);
break;
case CONTROL:
case ALERT:
case STATUS:
case VGPIO_MIN:
case VGPIO_MAX:
case VSOURCE_MIN:
case VSOURCE_MAX:
case VSENSE:
case VSENSE_MIN:
case VSENSE_MAX:
case POWER:
case POWER_MIN:
case POWER_MAX:
case EE_CONTROL:
case EE_ALERT:
word = i2c_smbus_read_word_data(fd, smbus_ltc4282[reg].reg);
*(uint16_t *)value = ((uint16_t)(word << 8) | word >> 8);
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:
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:
case APP_FW_MAJOR:
case APP_FW_MINOR:
case BL_FW_MAJOR:
case BL_FW_MINOR:
byte = i2c_smbus_read_byte_data(fd, smbus_ltc4282[reg].reg);
*(uint8_t *)value = byte;
break;
default:
return -1;
break;
}
return 0;
}