summaryrefslogtreecommitdiff
path: root/commandline
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2013-05-14 09:17:59 +0200
committerDaniel Friesel <derf@finalrewind.org>2013-05-14 09:17:59 +0200
commitbead72f65b5f0fcdb5839fd6bfe24c60adb0f480 (patch)
tree991f31be81e4ca8082091cfff8ee58a8b5ade193 /commandline
initial commit
Diffstat (limited to 'commandline')
-rw-r--r--commandline/Makefile45
-rw-r--r--commandline/powerSwitch.c217
2 files changed, 262 insertions, 0 deletions
diff --git a/commandline/Makefile b/commandline/Makefile
new file mode 100644
index 0000000..4587b5e
--- /dev/null
+++ b/commandline/Makefile
@@ -0,0 +1,45 @@
+# Name: Makefile
+# Project: PowerSwitch
+# 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$
+
+
+# Concigure the following definitions according to your system. The powerSwitch
+# tool has been successfully compiled on Mac OS X, Linux and Windows.
+
+# Use the following 3 lines on Unix (uncomment the framework on Mac OS X):
+USBFLAGS = `libusb-config --cflags`
+USBLIBS = `libusb-config --libs` #-framework CoreFoundation
+EXE_SUFFIX =
+
+# Use the following 3 lines on Windows and comment out the 3 above. You may
+# have to change the include paths to where you installed libusb-win32
+#USBFLAGS = -I/usr/local/include
+#USBLIBS = -L/usr/local/lib -lusb
+#EXE_SUFFIX = .exe
+
+
+CC = gcc
+CFLAGS = $(USBFLAGS) -O -Wall
+LIBS = $(USBLIBS)
+
+PROGRAM = powerSwitch$(EXE_SUFFIX)
+
+
+all: $(PROGRAM)
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
+
+$(PROGRAM): powerSwitch.o
+ $(CC) -o $(PROGRAM) powerSwitch.o $(LIBS)
+
+strip: $(PROGRAM)
+ strip $(PROGRAM)
+
+clean:
+ rm -f *.o $(PROGRAM)
diff --git a/commandline/powerSwitch.c b/commandline/powerSwitch.c
new file mode 100644
index 0000000..ce29dde
--- /dev/null
+++ b/commandline/powerSwitch.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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <usb.h> /* 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<rval;i++){
+ if(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;
+}