#include "unistd.h" #include <linux/power_ic.h> #include <linux/moto_accy.h> #include <sys/ioctl.h> #include <fcntl.h> typedef struct { int time; int timeout; int direction; int bat; int cur; } BAT_INFO; typedef struct { int channel; int result; } CHANNEL_REQUEST; int main(int argc, char *argv[]) { int fd; int ret; BAT_INFO info; CHANNEL_REQUEST ch; info.time = 0; int n; unsigned char charger = 0; unsigned char temp = 0; if (argc < 2) { printf ("Usage: %s -t[emperature] or-b[attary] or -c[charger] or -a[ttached cables]\n",argv[0]); return 1; } fd = open("/dev/power_ic",O_RDWR); switch (argv[1][1]){ // battary case 'b': ret = ioctl (fd,POWER_IC_IOCTL_ATOD_BATT_AND_CURR,&info); printf("battary: %d\n", info.bat); break; // charger case 'c': if (argc == 3) { int voltage = atoi(argv[2]) ; int mode; ret = ioctl (fd, POWER_IC_IOCTL_CHARGER_SET_CHARGE_CURRENT, mode); printf("set charge current %d: %d\n", voltage,ret); } else { for (n=0; n<10; n++){ ch.channel = 3; ioctl (fd,POWER_IC_IOCTL_ATOD_SINGLE_CHANNEL, &ch); charger += ch.result >> 2; } printf("charger: %d\n", charger/10); break; } // temp case 't': ch.channel = 4; for (n=0; n<10; n++){ ioctl (fd,POWER_IC_IOCTL_ATOD_SINGLE_CHANNEL, &ch); temp += (ch.result >> 2); } printf("temp: %d\n", temp/10); break; case 'a': close(fd); fd = open("/dev/accy",O_RDWR); unsigned long int devs; int ret; char* devinfo[] = { "none", "invalid", "not supported", "charger mid", "charger mix mpx", "charger fast", "charger fast mpx", "charger fast 3g", "carkit mid", "carkit fast", "carkit smart", "usb cable", "regression cable", "factory cable", "mono headset", "stereo headset", "emu mono headset", "emu stereo headset"}; ioctl(fd, MOTO_ACCY_IOCTL_GET_ALL_DEVICES, &devs); while (devs){ ret = generic_ffs((devs)) - 1; printf("%d:%s\n", ret,devinfo[ret]); devs &= ~(1 << (ret)); } break; } return 0; }