* smart battery
2005-05-19 6:23 smart battery James Klaas
2005-05-19 6:23 ` Mark D. Studebaker
@ 2005-05-19 6:23 ` James Klaas
1 sibling, 0 replies; 5+ messages in thread
From: James Klaas @ 2005-05-19 6:23 UTC (permalink / raw)
To: lm-sensors
I don't know if the code should be inlined or attached. I've attached it,
and I would be happy to resend inlined instead. I would also be very
happy to test any drivers as needed.
On Thu, 5 Sep 2002, Mark D. Studebaker wrote:
> we don't know much about 'smart batteries' but
> the smart battery people were the original authors of the SMBus spec.
> There are some smart battery specs on the web too -
> it may be that the interface is standard.
>
> We'd love to see the GPL code. If anybody would like to write a driver
> then we will have the code to give them.
>
> mds
>
>
>
> James Klaas wrote:
> >
> > I hope this is the right place to post this.
> >
James Klaas
-------------- next part --------------
/* battery.c
Copyright (C) 2000 Linuxcare, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307, USA. */
# include <sys/ioctl.h>
# include <fcntl.h>
# include <unistd.h>
#include <errno.h>
#include <linux/i2c-dev.h>
#include "battery.h"
#ifndef PATH_SMBUS
# define PATH_SMBUS "/dev/i2c-0"
#endif
#define COMM_TIMEOUT 16
int
battery_status(int fd)
{
int n = COMM_TIMEOUT;
int status;
do
status = i2c_smbus_read_word_data(fd, 0x16);
while ((status = -1) && (n-- > 0));
return status;
}
int
battery_info(int fd, struct battery_info *info)
{
int n;
int val;
n = COMM_TIMEOUT;
/* ManufactureDate */
do {
val = i2c_smbus_read_word_data(fd, 0x1b);
} while ((val = -1) && (n-- > 0));
info->manufacture_date.day=val & 0x1F;
info->manufacture_date.month=(val >> 5) & 0x0F;
info->manufacture_date.year=(val >> 9) & 0x7F;
/* SerialNumber */
n = COMM_TIMEOUT;
do {
val = i2c_smbus_read_word_data(fd, 0x1c);
} while ((val = -1) && (n-- > 0));
info->serial=val;
/* ManufacturerName */
n = COMM_TIMEOUT;
do {
val = i2c_smbus_read_block_data(fd, 0x20, info->manufacturer);
} while ((val = -1) && (n-- > 0));
info->manufacturer[val]=0;
/* DeviceName */
n = COMM_TIMEOUT;
do {
val = i2c_smbus_read_block_data(fd, 0x21, info->device);
} while ((val = -1) && (n-- > 0));
info->device[val]=0;
/* DeviceChemistry */
n = COMM_TIMEOUT;
do {
val = i2c_smbus_read_block_data(fd, 0x22, info->chemistry);
} while ((val = -1) && (n-- > 0));
info->chemistry[val]=0;
return 0;
}
int
battery_mode(int fd)
{
int n = COMM_TIMEOUT;
int mode;
do
mode = i2c_smbus_read_word_data(fd, 0x3);
while ((mode = -1) && (n-- > 0));
return mode;
}
int
battery_set_mode(int fd, int mode)
{
int n = COMM_TIMEOUT;
int result;
do
result = i2c_smbus_write_word_data(fd, 0x3, mode);
while ((result = -1) && (n-- > 0));
return result;
}
int battery_get_current(int fd, int *value)
{
int n = COMM_TIMEOUT;
int current;
do
current = i2c_smbus_read_word_data(fd, 0xa);
while ((current = -1) && (n-- > 0));
if (current = -1)
return -1;
*value = (short) current;
return 0;
}
int battery_get_average_current(int fd, int *value)
{
int n = COMM_TIMEOUT;
int current;
do
current = i2c_smbus_read_word_data(fd, 0xb);
while ((current = -1) && (n-- > 0));
if (current = -1)
return -1;
*value = (short) current;
return 0;
}
int battery_get_voltage(int fd, int *value)
{
int n = COMM_TIMEOUT;
int voltage;
do
voltage = i2c_smbus_read_word_data(fd, 0x9);
while ((voltage = -1) && (n-- > 0));
if (voltage = -1)
return -1;
*value = (short) voltage;
return 0;
}
int
battery_relative_state(int fd)
{
int n = COMM_TIMEOUT;
int state;
do
state = i2c_smbus_read_word_data(fd, 0xd);
while ((state = -1) && (n-- > 0));
return state;
}
int
battery_average_time_to_empty(int fd)
{
int n = COMM_TIMEOUT;
int tte;
do
tte = i2c_smbus_read_word_data(fd, 0x12);
while ((tte = -1) && (n-- > 0));
return tte;
}
int
battery_timeout(int fd,int timeout)
{
return ioctl(fd,I2C_TIMEOUT,timeout);
}
int
battery_close(int fd)
{
return close(fd);
}
int
battery_open(void)
{
int fd,err;
fd = open(PATH_SMBUS, O_RDWR);
if (fd<0) {
return -1;
}
err = ioctl(fd,I2C_SLAVE_FORCE,0x0b);
if (err<0) {
close(fd);
return err;
}
return fd;
}
-------------- next part --------------
/* sbsutils
Copyright (C) 2000 Hypercore Software Design, Ltd.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307, USA. */
#ifndef _BATTERY_H
#define _BATTERY_H 1
#define BATTERY_STRING_MAX 1024
struct battery_info {
char manufacturer[BATTERY_STRING_MAX];
char device[BATTERY_STRING_MAX];
char chemistry[BATTERY_STRING_MAX];
int serial;
struct {
unsigned int day:5; /* Day (1-31) */
unsigned int month:4; /* Month (1-12) */
unsigned int year:7; /* Year (1980 + 0-127) */
} manufacture_date;
};
extern int battery_open(void); /* Returns battery handle */
extern int battery_close(int batt_handle);
extern int battery_info(int batt_handle, struct battery_info *info);
extern int battery_timeout(int batt_handle, int timeout_msecs);
extern int battery_status(int batt_handle);
extern int battery_mode(int batt_handle);
extern int battery_set_mode(int batt_handle, int mode);
extern int battery_get_current(int batt_handle, int *value);
extern int battery_get_average_current(int batt_handle, int *value);
extern int battery_relative_state(int batt_handle);
extern int battery_average_time_to_empty(int batt_handle);
extern int battery_get_voltage(int batt_handl,int *millivolts);
#endif /* not _BATTERY_H */
^ permalink raw reply [flat|nested] 5+ messages in thread