コード例 #1
0
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;
}
コード例 #2
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);
}
コード例 #3
0
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);
}
コード例 #4
0
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);
}
コード例 #5
0
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;
}
コード例 #6
0
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);
}
コード例 #7
0
u16 BoardID(void)
{

	s32 ret;
	u16 cur;
	ret = i2c_smbus_read_word_data_retry(EC_Bat_device->client,0x32);
	cur = ret & 0x0000ffff;
	return cur;
}
コード例 #8
0
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);
}
コード例 #9
0
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);
}
コード例 #10
0
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);
}
コード例 #11
0
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);
}
コード例 #12
0
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);
}
コード例 #13
0
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);
}
コード例 #14
0
/* 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);
	}
}
コード例 #15
0
/*
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);
}
コード例 #16
0
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);
}
コード例 #17
0
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;
}
コード例 #18
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;
}