static int EC_Bat_get_battery_capacity(union power_supply_propval *val) { s32 ret; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x00); CurrCapacity = ret; if(ret == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery capacity, read again\n", __func__); msleep(500); ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x00); CurrCapacity = ret; if(ret == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery capacity\n", __func__); } else if(ret < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for capacity failed\n", __func__); return -EINVAL; } } else if (ret < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for capacity failed\n", __func__); return -EINVAL; } /* EC_Bat spec says that this can be >100 % * even if max value is 100 % */ val->intval = ( (ret >= 100) ? 100 : ret); return 0; }
static ssize_t BatStatus_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; int ACStatus; s32 Capacity, Present; Present = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x08);//read designcapacity to judge present msleep(100); Capacity = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x00);//read capacity ACStatus = gpio_get_value(gpio);//read ac exist gpio, 0 is exist if(Present == 0) { s += sprintf(s, "Absence\n"); } else { if(Capacity < 100) { if(ACStatus == 1) s += sprintf(s, "Discharging\n"); else s += sprintf(s, "Charging\n"); } else { s += sprintf(s, "Full\n"); } } msleep(100); return (s - buf); }
static ssize_t EcVer_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; s32 PjIDMaVer, MiVerTestVer, ret; PjIDMaVer = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x30); msleep(100); MiVerTestVer = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x31); msleep(100); ret = PjIDMaVer; ret = ret << 16 | (MiVerTestVer & 0xFFFF); s += sprintf(s, "%x\n", ret); return (s - buf); }
static ssize_t GyroGain_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { int i; char * s = buf; u8 val8[36] = {0}; u16 val16; s32 val32; for(i=0;i<=17;i++) { val32 = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x73); val16 = val32 & 0x0000ffff; TransformToByte(val16, &val8[2*i], &val8[2*i+1]); msleep(10); } for(i=35;i>=0;i--) { s += sprintf(s, "%02x",val8[i]); } s += sprintf(s, "\n"); return (s - buf); }
static ssize_t ECflashread_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { s32 ret; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,cmd); buf[0] = (ret & 0x0000ff00) >> 8; buf[1] = ret & 0x000000ff; return 2; }
static ssize_t BatDesignCapacity_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; s32 ret; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x08); msleep(100); s += sprintf(s, "%d\n", ret); return (s - buf); }
u16 BoardID(void) { s32 ret; u16 cur; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x32); cur = ret & 0x0000ffff; return cur; }
static ssize_t BatCtlEnable_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; s32 ret; s8 byteret; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x5b); byteret = ret & 0x000000FF; s += sprintf(s, "%d\n",byteret); return (s - buf); }
static ssize_t BatCycleCount_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; s32 ret; s16 cyclecount; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x0b); cyclecount = ret & 0x0000ffff; msleep(10); s += sprintf(s, "%d\n", cyclecount); return (s - buf); }
static ssize_t BoardID_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; s32 ret; s16 cur; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x32); cur = ret & 0x0000ffff; msleep(10); s += sprintf(s, "%d\n", cur); return (s - buf); }
static ssize_t BatSystemofHealth_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; s32 ret; u8 health; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x09); health = ret & 0x000000ff; msleep(10); s += sprintf(s, "%d\n", health); return (s - buf); }
static ssize_t ECRead_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; u16 val16; s32 val32; val32 = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0xF1); val16 = val32 & 0x0000ffff; s += sprintf(s, "0x%04x\n",val16); return (s - buf); }
static ssize_t SkuNumber_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; u8 val8[2] = {0}; u16 val16; s32 val32; val32 = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x68); val16 = val32 & 0x0000ffff; TransformToByte(val16, &val8[0], &val8[1]); msleep(10); s += sprintf(s, "%02x%02x\n",val8[1],val8[0]); return (s - buf); }
/* Using for enable/disable CABC when recording by internal MIC. */ void setAudioCABC(int enable) { s32 ret; u16 cur; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x4c); cur = ret & 0x0000ffff; msleep(10); if (enable) { cur = cur | (0x1 << 8); i2c_smbus_write_word_data_retry(EC_Bat_device->client,0x4d,cur); msleep(10); } else { cur = cur & (!(0x1 << 8)); i2c_smbus_write_word_data_retry(EC_Bat_device->client,0x4d,cur); msleep(10); } }
/* Bit0: If sim card plugs in/out, it will be 1 Bit1: GPS status, 1 is 3g/gps power on, 0 is power off Bit2: Echo cancellation remaining bits wait to be defined */ static ssize_t DeviceStatus_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { char * s = buf; char binary[20] = {0}; int i; s32 ret; u16 cur; ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x48); cur = ret & 0x0000ffff; for(i=15 ; i>=0; i--) { binary[i] = cur & 0x1 ? '1' : '0'; cur >>= 1; } s += sprintf(s, "%s\n", binary); return (s - buf); }
static ssize_t UUID_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) { int i; char * s = buf; u8 val8[16] = {0}; u16 val16; s32 val32; for(i=0;i<=7;i++) { val32 = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x60); val16 = val32 & 0x0000ffff; TransformToByte(val16, &val8[2*i], &val8[2*i+1]); msleep(10); } s += sprintf(s, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",val8[15],val8[14],val8[13],val8[12],val8[11],val8[10],val8[9],val8[8],val8[7],val8[6],val8[5],val8[4],val8[3],val8[2],val8[1],val8[0]); return (s - buf); }
static int EC_Bat_get_battery_presence_and_health(enum power_supply_property psp, union power_supply_propval *val) { s32 ret; if (psp == POWER_SUPPLY_PROP_PRESENT) { //read designcapacity to judge present ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x08); if(ret == 0)//no battery { dev_err(&EC_Bat_device->client->dev, "%s: No battery, read again\n", __func__); msleep(500); ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x08); if(ret == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery\n", __func__); val->intval = 0; return 0; } else if(ret < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for BatPresent failed\n", __func__); return -EINVAL; } } else if (ret < 0) { dev_err(&EC_Bat_device->client->dev,"%s: i2c read for battery presence failed\n", __func__); return -EINVAL; } val->intval = 1; } else if (psp == POWER_SUPPLY_PROP_HEALTH) { //read designcapacity to judge present ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x08); if(ret == 0)//no battery { dev_err(&EC_Bat_device->client->dev, "%s: No battery, read again\n", __func__); msleep(500); ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x08); if(ret == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery\n", __func__); val->intval = POWER_SUPPLY_HEALTH_UNKNOWN; return 0; } else if(ret < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for BatPresent failed\n",__func__); return -EINVAL; } } else if (ret < 0) { dev_err(&EC_Bat_device->client->dev,"%s: i2c read for battery presence failed\n", __func__); return -EINVAL; } val->intval = POWER_SUPPLY_HEALTH_GOOD; } return 0; }
static int EC_Bat_get_battery_property(int reg_offset, enum power_supply_property psp, union power_supply_propval *val) { s32 ret; int BatPresent, ACStatus; s32 Capacity; if (psp == POWER_SUPPLY_PROP_STATUS) { //read designcapacity to judge present //POWER_SUPPLY_PROP_PRESENT is after POWER_SUPPLY_PROP_STATUS BatPresent = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x08); if(BatPresent >= 0) { if(BatPresent == 0)//no battery { dev_err(&EC_Bat_device->client->dev, "%s: No battery, read again\n", __func__); msleep(500); BatPresent = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x08); if(BatPresent == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery\n", __func__); val->intval = POWER_SUPPLY_STATUS_UNKNOWN; return 0; } else if(BatPresent < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for BatPresent failed\n",__func__); return -EINVAL; } } //read capacity Capacity = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x00); if(Capacity == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery capacity, read again\n", __func__); msleep(500); Capacity = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x00); if(Capacity == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery capacity\n", __func__); } else if(Capacity < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for capacity failed\n", __func__); return -EINVAL; } } else if(Capacity < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for capacity failed\n", __func__); return -EINVAL; } //read ac exist gpio, 0 is exist ACStatus = gpio_get_value(gpio); if(Capacity < 100) { if(ACStatus == 1) { val->intval = POWER_SUPPLY_STATUS_DISCHARGING; } else { val->intval = POWER_SUPPLY_STATUS_CHARGING; } } else { if(ACStatus == 1) { val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; } else { val->intval = POWER_SUPPLY_STATUS_FULL; } } } else if(BatPresent < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for BatPresent failed\n", __func__); return -EINVAL; } } else if (psp == POWER_SUPPLY_PROP_TEMP) { ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x0a); if(ret == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery temperature, read again\n", __func__); msleep(500); ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x0a); if(ret == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery temperature\n", __func__); val->intval = 0; return 0; } else if(ret < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for temperature failed\n", __func__); return -EINVAL; } } else if(ret < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for temperature failed\n", __func__); return -EINVAL; } val->intval = ret - 2731; } else if (psp == POWER_SUPPLY_PROP_VOLTAGE_NOW) { ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x01); if(ret == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery voltage, read again\n", __func__); msleep(500); ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x01); if(ret == 0) { dev_err(&EC_Bat_device->client->dev, "%s: No battery voltage\n", __func__); } else if(ret < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for voltage failed\n", __func__); return -EINVAL; } } else if(ret < 0) { dev_err(&EC_Bat_device->client->dev, "%s: i2c read for voltage failed\n", __func__); return -EINVAL; } val->intval = ret * 1000; } return 0; }