]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/commitdiff
A simple host application to talk to ROCON through USB
authorMartin Meloun <meloumar@cmp.felk.cvut.cz>
Fri, 9 Aug 2013 15:41:33 +0000 (17:41 +0200)
committerMartin Meloun <meloumar@cmp.felk.cvut.cz>
Fri, 9 Aug 2013 15:41:33 +0000 (17:41 +0200)
Currently not integrated with OCERA framework, link with libusb.

host/rocon-send_cmd/rocon-send_cmd.c [new file with mode: 0644]

diff --git a/host/rocon-send_cmd/rocon-send_cmd.c b/host/rocon-send_cmd/rocon-send_cmd.c
new file mode 100644 (file)
index 0000000..6504c8d
--- /dev/null
@@ -0,0 +1,99 @@
+#include <usb.h>
+#include <stdio.h>
+#include <string.h>
+
+/* ROCON setup */
+#define ROCON_VID           0x1669
+#define ROCON_PID           0x1023
+#define ROCON_CONFIGURATION 1
+#define ROCON_INTFERFACE    0
+
+/* Endpoints */
+#define EP_IN               0x81
+#define EP_OUT              0x01
+
+#define BUFFER_SIZE         1024
+
+int opening_rocon = 0;
+
+usb_dev_handle *open_dev(void)
+{
+       struct usb_bus *bus;
+       struct usb_device *dev;
+
+       for (bus = usb_get_busses(); bus; bus = bus->next)
+       {
+               for (dev = bus->devices; dev; dev = dev->next)
+               {
+                       if (dev->descriptor.idVendor == ROCON_VID && dev->descriptor.idProduct == ROCON_PID)
+                       {
+                               opening_rocon = 1;
+                               return usb_open(dev);
+                       }
+               }
+       }
+       return NULL;
+}
+
+int main(int argc, char** argv)
+{
+       usb_dev_handle *dev = NULL;
+       char buffer[BUFFER_SIZE];
+       int ret;
+
+       /* Init */
+       usb_init();
+       usb_find_busses();
+       usb_find_devices();
+
+       /* Open device */
+       if (!(dev = open_dev()))
+       {
+               if (opening_rocon)
+                       printf("Error opening ROCON:\n%s\n", usb_strerror());
+               else
+                       printf("ROCON not connected!\n");
+               
+               return 1;
+       }
+
+       /* Set configuration */
+       if (usb_set_configuration(dev, ROCON_CONFIGURATION) < 0)
+       {
+               printf("Error setting configuration #%d:\n%s\n", ROCON_CONFIGURATION, usb_strerror());
+               usb_close(dev);
+               return 1;
+       }
+
+       /* Set interface */
+       if (usb_claim_interface(dev, ROCON_INTFERFACE) < 0)
+       {
+               printf("Error claiming interface #%d:\n%s\n", ROCON_INTFERFACE, usb_strerror());
+               usb_close(dev);
+               return 1;
+       }
+
+       /* Write command */
+       snprintf(buffer, sizeof(buffer), "%s\n", argv[1]);
+       ret = usb_bulk_write(dev, EP_OUT, buffer, strlen(buffer), 5000);
+       if (ret < 0)
+       {
+               printf("Error sending command %s:\n%s\n", argv[1], usb_strerror());
+               usb_release_interface(dev, 0);
+               usb_close(dev);
+               return 1;
+       }
+
+       /* Read response */
+       ret = usb_bulk_read(dev, EP_IN, buffer, sizeof(buffer), 5000);
+       if (ret < 0)
+               printf("Error reading response:\n%s\n", usb_strerror());
+
+       buffer[ret] = '\0';
+       printf(buffer);
+
+       usb_release_interface(dev, 0);
+       usb_close(dev);
+       return 0;
+}