From 11ca8d00c0340ad428bbe590b963fc8e843487c5 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 17 May 2013 21:19:34 +0200 Subject: rename powerSwitch to i2c (more accurate) --- commandline/Makefile | 6 +- commandline/i2c.c | 217 ++++++++++++++++++++++++++++++++++++++++++++++ commandline/powerSwitch.c | 217 ---------------------------------------------- 3 files changed, 220 insertions(+), 220 deletions(-) create mode 100644 commandline/i2c.c delete mode 100644 commandline/powerSwitch.c (limited to 'commandline') diff --git a/commandline/Makefile b/commandline/Makefile index 4587b5e..4d33064 100644 --- a/commandline/Makefile +++ b/commandline/Makefile @@ -27,7 +27,7 @@ CC = gcc CFLAGS = $(USBFLAGS) -O -Wall LIBS = $(USBLIBS) -PROGRAM = powerSwitch$(EXE_SUFFIX) +PROGRAM = i2c$(EXE_SUFFIX) all: $(PROGRAM) @@ -35,8 +35,8 @@ all: $(PROGRAM) .c.o: $(CC) $(CFLAGS) -c $< -$(PROGRAM): powerSwitch.o - $(CC) -o $(PROGRAM) powerSwitch.o $(LIBS) +$(PROGRAM): i2c.o + $(CC) -o $(PROGRAM) i2c.o $(LIBS) strip: $(PROGRAM) strip $(PROGRAM) diff --git a/commandline/i2c.c b/commandline/i2c.c new file mode 100644 index 0000000..ce29dde --- /dev/null +++ b/commandline/i2c.c @@ -0,0 +1,217 @@ +/* Name: powerSwitch.c + * Project: PowerSwitch based on AVR USB driver + * Author: Christian Starkjohann + * Creation Date: 2005-01-16 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt) or proprietary (CommercialLicense.txt) + * This Revision: $Id$ + */ + +/* +General Description: +This program controls the PowerSwitch USB device from the command line. +It must be linked with libusb, a library for accessing the USB bus from +Linux, FreeBSD, Mac OS X and other Unix operating systems. Libusb can be +obtained from http://libusb.sourceforge.net/. +*/ + +#include +#include +#include +#include /* this is libusb, see http://libusb.sourceforge.net/ */ + +#define USBDEV_SHARED_VENDOR 0x16C0 /* VOTI */ +#define USBDEV_SHARED_PRODUCT 0x05DC /* Obdev's free shared PID */ +/* Use obdev's generic shared VID/PID pair and follow the rules outlined + * in firmware/usbdrv/USBID-License.txt. + */ + +#define PSCMD_ECHO 0 +#define PSCMD_GET 1 +#define PSCMD_ON 2 +#define PSCMD_OFF 3 +/* These are the vendor specific SETUP commands implemented by our USB device */ + +static int usbGetStringAscii(usb_dev_handle *dev, int index, int langid, char *buf, int buflen) +{ +char buffer[256]; +int rval, i; + + if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, langid, buffer, sizeof(buffer), 1000)) < 0) + return rval; + if(buffer[1] != USB_DT_STRING) + return 0; + if((unsigned char)buffer[0] < rval) + rval = (unsigned char)buffer[0]; + rval /= 2; + /* lossy conversion to ISO Latin1 */ + for(i=1;i buflen) /* destination buffer overflow */ + break; + buf[i-1] = buffer[2 * i]; + if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ + buf[i-1] = '?'; + } + buf[i-1] = 0; + return i-1; +} + + +/* PowerSwitch uses the free shared default VID/PID. If you want to see an + * example device lookup where an individually reserved PID is used, see our + * RemoteSensor reference implementation. + */ + +#define USB_ERROR_NOTFOUND 1 +#define USB_ERROR_ACCESS 2 +#define USB_ERROR_IO 3 + +static int usbOpenDevice(usb_dev_handle **device, int vendor, char *vendorName, int product, char *productName) +{ +struct usb_bus *bus; +struct usb_device *dev; +usb_dev_handle *handle = NULL; +int errorCode = USB_ERROR_NOTFOUND; +static int didUsbInit = 0; + + if(!didUsbInit){ + didUsbInit = 1; + usb_init(); + } + usb_find_busses(); + usb_find_devices(); + for(bus=usb_get_busses(); bus; bus=bus->next){ + for(dev=bus->devices; dev; dev=dev->next){ + if(dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product){ + char string[256]; + int len; + handle = usb_open(dev); /* we need to open the device in order to query strings */ + if(!handle){ + errorCode = USB_ERROR_ACCESS; + fprintf(stderr, "Warning: cannot open USB device: %s\n", usb_strerror()); + continue; + } + if(vendorName == NULL && productName == NULL){ /* name does not matter */ + break; + } + /* now check whether the names match: */ + len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, 0x0409, string, sizeof(string)); + if(len < 0){ + errorCode = USB_ERROR_IO; + fprintf(stderr, "Warning: cannot query manufacturer for device: %s\n", usb_strerror()); + }else{ + errorCode = USB_ERROR_NOTFOUND; + /* fprintf(stderr, "seen device from vendor ->%s<-\n", string); */ + if(strcmp(string, vendorName) == 0){ + len = usbGetStringAscii(handle, dev->descriptor.iProduct, 0x0409, string, sizeof(string)); + if(len < 0){ + errorCode = USB_ERROR_IO; + fprintf(stderr, "Warning: cannot query product for device: %s\n", usb_strerror()); + }else{ + errorCode = USB_ERROR_NOTFOUND; + /* fprintf(stderr, "seen product ->%s<-\n", string); */ + if(strcmp(string, productName) == 0) + break; + } + } + } + usb_close(handle); + handle = NULL; + } + } + if(handle) + break; + } + if(handle != NULL){ + errorCode = 0; + *device = handle; + } + return errorCode; +} + + + +#define SDA_1 usb_control_msg(handle, USB_TYPE_VENDOR \ + | USB_RECIP_DEVICE | USB_ENDPOINT_IN, \ + PSCMD_ON, 0, 6, (char *)buffer, sizeof(buffer), \ + 5000); + +#define SDA_0 usb_control_msg(handle, USB_TYPE_VENDOR \ + | USB_RECIP_DEVICE | USB_ENDPOINT_IN, \ + PSCMD_OFF, 0, 6, (char *)buffer, sizeof(buffer), \ + 5000); + +#define SCL_1 usb_control_msg(handle, USB_TYPE_VENDOR \ + | USB_RECIP_DEVICE | USB_ENDPOINT_IN, \ + PSCMD_ON, 0, 7, (char *)buffer, sizeof(buffer), \ + 5000); + +#define SCL_0 usb_control_msg(handle, USB_TYPE_VENDOR \ + | USB_RECIP_DEVICE | USB_ENDPOINT_IN, \ + PSCMD_OFF, 0, 7, (char *)buffer, sizeof(buffer), \ + 5000); + +int main(int argc, char **argv) +{ +usb_dev_handle *handle = NULL; +unsigned char buffer[8]; + + usb_init(); + if(usbOpenDevice(&handle, USBDEV_SHARED_VENDOR, "www.obdev.at", USBDEV_SHARED_PRODUCT, "PowerSwitch") != 0){ + fprintf(stderr, "Could not find USB device \"PowerSwitch\" with vid=0x%x pid=0x%x\n", USBDEV_SHARED_VENDOR, USBDEV_SHARED_PRODUCT); + exit(1); + } +/* We have searched all devices on all busses for our USB device above. Now + * try to open it and perform the vendor specific control operations for the + * function requested by the user. + */ + + char line[8]; + signed char i; + short int number; + + SCL_1; + SDA_1; + usleep(1000); + SDA_0; + usleep(10); + SCL_0; + + while (fgets(line, 8, stdin) != NULL) { + if (sscanf(line, "%hi\n", &number) == 1) { + if ((number >= 0) && (number <= 255)) { + for (i = 7; i >= 0; i--) { + usleep(3); + if (number & (1 << i)) { + SDA_1; + } else { + SDA_0; + } + usleep(3); + SCL_1; + usleep(3); + SCL_0; + } + usleep(50); + } + } + if (strcmp(line, "push\n") == 0) { + SCL_1; + usleep(3); + SDA_1; + usleep(10); + SDA_0; + usleep(10); + SCL_0; + } + } + + SCL_1; + usleep(3); + SDA_1; + usleep(10); + + usb_close(handle); + return 0; +} diff --git a/commandline/powerSwitch.c b/commandline/powerSwitch.c deleted file mode 100644 index ce29dde..0000000 --- a/commandline/powerSwitch.c +++ /dev/null @@ -1,217 +0,0 @@ -/* Name: powerSwitch.c - * Project: PowerSwitch based on AVR USB driver - * Author: Christian Starkjohann - * Creation Date: 2005-01-16 - * Tabsize: 4 - * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH - * License: GNU GPL v2 (see License.txt) or proprietary (CommercialLicense.txt) - * This Revision: $Id$ - */ - -/* -General Description: -This program controls the PowerSwitch USB device from the command line. -It must be linked with libusb, a library for accessing the USB bus from -Linux, FreeBSD, Mac OS X and other Unix operating systems. Libusb can be -obtained from http://libusb.sourceforge.net/. -*/ - -#include -#include -#include -#include /* this is libusb, see http://libusb.sourceforge.net/ */ - -#define USBDEV_SHARED_VENDOR 0x16C0 /* VOTI */ -#define USBDEV_SHARED_PRODUCT 0x05DC /* Obdev's free shared PID */ -/* Use obdev's generic shared VID/PID pair and follow the rules outlined - * in firmware/usbdrv/USBID-License.txt. - */ - -#define PSCMD_ECHO 0 -#define PSCMD_GET 1 -#define PSCMD_ON 2 -#define PSCMD_OFF 3 -/* These are the vendor specific SETUP commands implemented by our USB device */ - -static int usbGetStringAscii(usb_dev_handle *dev, int index, int langid, char *buf, int buflen) -{ -char buffer[256]; -int rval, i; - - if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, langid, buffer, sizeof(buffer), 1000)) < 0) - return rval; - if(buffer[1] != USB_DT_STRING) - return 0; - if((unsigned char)buffer[0] < rval) - rval = (unsigned char)buffer[0]; - rval /= 2; - /* lossy conversion to ISO Latin1 */ - for(i=1;i buflen) /* destination buffer overflow */ - break; - buf[i-1] = buffer[2 * i]; - if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ - buf[i-1] = '?'; - } - buf[i-1] = 0; - return i-1; -} - - -/* PowerSwitch uses the free shared default VID/PID. If you want to see an - * example device lookup where an individually reserved PID is used, see our - * RemoteSensor reference implementation. - */ - -#define USB_ERROR_NOTFOUND 1 -#define USB_ERROR_ACCESS 2 -#define USB_ERROR_IO 3 - -static int usbOpenDevice(usb_dev_handle **device, int vendor, char *vendorName, int product, char *productName) -{ -struct usb_bus *bus; -struct usb_device *dev; -usb_dev_handle *handle = NULL; -int errorCode = USB_ERROR_NOTFOUND; -static int didUsbInit = 0; - - if(!didUsbInit){ - didUsbInit = 1; - usb_init(); - } - usb_find_busses(); - usb_find_devices(); - for(bus=usb_get_busses(); bus; bus=bus->next){ - for(dev=bus->devices; dev; dev=dev->next){ - if(dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product){ - char string[256]; - int len; - handle = usb_open(dev); /* we need to open the device in order to query strings */ - if(!handle){ - errorCode = USB_ERROR_ACCESS; - fprintf(stderr, "Warning: cannot open USB device: %s\n", usb_strerror()); - continue; - } - if(vendorName == NULL && productName == NULL){ /* name does not matter */ - break; - } - /* now check whether the names match: */ - len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, 0x0409, string, sizeof(string)); - if(len < 0){ - errorCode = USB_ERROR_IO; - fprintf(stderr, "Warning: cannot query manufacturer for device: %s\n", usb_strerror()); - }else{ - errorCode = USB_ERROR_NOTFOUND; - /* fprintf(stderr, "seen device from vendor ->%s<-\n", string); */ - if(strcmp(string, vendorName) == 0){ - len = usbGetStringAscii(handle, dev->descriptor.iProduct, 0x0409, string, sizeof(string)); - if(len < 0){ - errorCode = USB_ERROR_IO; - fprintf(stderr, "Warning: cannot query product for device: %s\n", usb_strerror()); - }else{ - errorCode = USB_ERROR_NOTFOUND; - /* fprintf(stderr, "seen product ->%s<-\n", string); */ - if(strcmp(string, productName) == 0) - break; - } - } - } - usb_close(handle); - handle = NULL; - } - } - if(handle) - break; - } - if(handle != NULL){ - errorCode = 0; - *device = handle; - } - return errorCode; -} - - - -#define SDA_1 usb_control_msg(handle, USB_TYPE_VENDOR \ - | USB_RECIP_DEVICE | USB_ENDPOINT_IN, \ - PSCMD_ON, 0, 6, (char *)buffer, sizeof(buffer), \ - 5000); - -#define SDA_0 usb_control_msg(handle, USB_TYPE_VENDOR \ - | USB_RECIP_DEVICE | USB_ENDPOINT_IN, \ - PSCMD_OFF, 0, 6, (char *)buffer, sizeof(buffer), \ - 5000); - -#define SCL_1 usb_control_msg(handle, USB_TYPE_VENDOR \ - | USB_RECIP_DEVICE | USB_ENDPOINT_IN, \ - PSCMD_ON, 0, 7, (char *)buffer, sizeof(buffer), \ - 5000); - -#define SCL_0 usb_control_msg(handle, USB_TYPE_VENDOR \ - | USB_RECIP_DEVICE | USB_ENDPOINT_IN, \ - PSCMD_OFF, 0, 7, (char *)buffer, sizeof(buffer), \ - 5000); - -int main(int argc, char **argv) -{ -usb_dev_handle *handle = NULL; -unsigned char buffer[8]; - - usb_init(); - if(usbOpenDevice(&handle, USBDEV_SHARED_VENDOR, "www.obdev.at", USBDEV_SHARED_PRODUCT, "PowerSwitch") != 0){ - fprintf(stderr, "Could not find USB device \"PowerSwitch\" with vid=0x%x pid=0x%x\n", USBDEV_SHARED_VENDOR, USBDEV_SHARED_PRODUCT); - exit(1); - } -/* We have searched all devices on all busses for our USB device above. Now - * try to open it and perform the vendor specific control operations for the - * function requested by the user. - */ - - char line[8]; - signed char i; - short int number; - - SCL_1; - SDA_1; - usleep(1000); - SDA_0; - usleep(10); - SCL_0; - - while (fgets(line, 8, stdin) != NULL) { - if (sscanf(line, "%hi\n", &number) == 1) { - if ((number >= 0) && (number <= 255)) { - for (i = 7; i >= 0; i--) { - usleep(3); - if (number & (1 << i)) { - SDA_1; - } else { - SDA_0; - } - usleep(3); - SCL_1; - usleep(3); - SCL_0; - } - usleep(50); - } - } - if (strcmp(line, "push\n") == 0) { - SCL_1; - usleep(3); - SDA_1; - usleep(10); - SDA_0; - usleep(10); - SCL_0; - } - } - - SCL_1; - usleep(3); - SDA_1; - usleep(10); - - usb_close(handle); - return 0; -} -- cgit v1.2.3