/*** Callbacks ***/
+static byte usb_rx_buf[64];
+static byte usb_tx_buf[64];
+
void usb_dev_reset(struct usb *usb)
{
usb->desc_device = desc_device;
void usb_dev_configure(struct usb *usb)
{
+ usb_ep_open(usb, 0x01, USB_EP_TYPE_BULK, 64);
+ usb_ep_open(usb, 0x81, USB_EP_TYPE_BULK, 64);
+ usb_ep_receive(usb, 0x01, usb_rx_buf, 64);
}
void usb_dev_unconfigure(struct usb *usb)
{
+ usb_ep_close(usb, 0x01);
+ usb_ep_close(usb, 0x81);
}
bool usb_dev_setup_hook(struct usb *usb, struct setup_request *setup)
void usb_dev_recv_done(struct usb *usb, byte epnum)
{
+ if (epnum == 0x01)
+ {
+ usb_tx_buf[0]++;
+ usb_ep_send(usb, 0x81, usb_tx_buf, 33);
+ }
}
void usb_dev_send_done(struct usb *usb, byte epnum)
{
+ usb_ep_receive(usb, 0x01, usb_rx_buf, 64);
}
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <libusb-1.0/libusb.h>
+
+struct libusb_context *usb_ctxt;
+struct libusb_device_handle *devh;
+
+static libusb_device *find_device(void)
+{
+ libusb_device **devlist;
+ ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
+ if (devn < 0)
+ {
+ fprintf(stderr, "Cannot enumerate USB devices: error %d\n", (int) devn);
+ exit(1);
+ }
+
+ for (ssize_t i=0; i<devn; i++)
+ {
+ struct libusb_device_descriptor desc;
+ libusb_device *dev = devlist[i];
+ if (!libusb_get_device_descriptor(dev, &desc))
+ {
+ if (desc.idVendor == 0x4242 && desc.idProduct == 0x0001)
+ {
+ printf("Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
+ // FIXME: Free device list
+ return dev;
+ }
+ }
+ }
+
+ libusb_free_device_list(devlist, 1);
+ fprintf(stderr, "Device not found\n");
+ exit(1);
+}
+
+int main(void)
+{
+ int err;
+ if (err = libusb_init(&usb_ctxt))
+ {
+ fprintf(stderr, "Cannot initialize libusb: error %d\n", err);
+ exit(1);
+ }
+ libusb_set_debug(usb_ctxt, 3);
+
+ libusb_device *dev = find_device();
+
+ if (err = libusb_open(dev, &devh))
+ {
+ fprintf(stderr, "Cannot open device: error %d\n", err);
+ exit(1);
+ }
+ libusb_reset_device(devh);
+ if (err = libusb_claim_interface(devh, 0))
+ {
+ fprintf(stderr, "Cannot claim interface: error %d\n", err);
+ exit(1);
+ }
+
+ for (;;)
+ {
+ unsigned char req[64] = { 1, 2, 3, 4 };
+ int transferred;
+ if (err = libusb_bulk_transfer(devh, 0x01, req, 32, &transferred, 2000))
+ {
+ fprintf(stderr, "Transfer failed: error %d\n", err);
+ exit(1);
+ }
+ printf("Transferred %d bytes\n", transferred);
+
+#if 1
+ unsigned char resp[1000];
+ int received;
+ if (err = libusb_bulk_transfer(devh, 0x81, resp, 1000, &received, 2000))
+ {
+ fprintf(stderr, "Receive failed: error %d\n", err);
+ exit(1);
+ }
+ printf("Received %d bytes [%02x]\n", received, resp[0]);
+#endif
+ }
+
+ return 0;
+}