static int pem_reg_read()

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;
}