178 lines
5.1 KiB
C
178 lines
5.1 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
#include <libusb-1.0/libusb.h>
|
|
|
|
#define EZP2010_VID 0x10c4
|
|
#define EZP2010_PID 0xf5a0
|
|
|
|
/* $ lsusb -d 10c4:f5a0 -v
|
|
|
|
Bus 001 Device 053: ID 10c4:f5a0 Cygnal Integrated Products, Inc.
|
|
Couldn't open device, some information will be missing
|
|
Device Descriptor:
|
|
bLength 18
|
|
bDescriptorType 1
|
|
bcdUSB 2.00
|
|
bDeviceClass 0
|
|
bDeviceSubClass 0
|
|
bDeviceProtocol 0
|
|
bMaxPacketSize0 64
|
|
idVendor 0x10c4 Cygnal Integrated Products, Inc.
|
|
idProduct 0xf5a0
|
|
bcdDevice 0.00
|
|
iManufacturer 0
|
|
iProduct 0
|
|
iSerial 0
|
|
bNumConfigurations 1
|
|
Configuration Descriptor:
|
|
bLength 9
|
|
bDescriptorType 2
|
|
wTotalLength 0x0020
|
|
bNumInterfaces 1
|
|
bConfigurationValue 1
|
|
iConfiguration 0
|
|
bmAttributes 0x80
|
|
(Bus Powered)
|
|
MaxPower 480mA
|
|
Interface Descriptor:
|
|
bLength 9
|
|
bDescriptorType 4
|
|
bInterfaceNumber 0
|
|
bAlternateSetting 0
|
|
bNumEndpoints 2
|
|
bInterfaceClass 0
|
|
bInterfaceSubClass 0
|
|
bInterfaceProtocol 0
|
|
iInterface 0
|
|
Endpoint Descriptor:
|
|
bLength 7
|
|
bDescriptorType 5
|
|
bEndpointAddress 0x81 EP 1 IN
|
|
bmAttributes 2
|
|
Transfer Type Bulk
|
|
Synch Type None
|
|
Usage Type Data
|
|
wMaxPacketSize 0x0040 1x 64 bytes
|
|
bInterval 5
|
|
Endpoint Descriptor:
|
|
bLength 7
|
|
bDescriptorType 5
|
|
bEndpointAddress 0x02 EP 2 OUT
|
|
bmAttributes 2
|
|
Transfer Type Bulk
|
|
Synch Type None
|
|
Usage Type Data
|
|
wMaxPacketSize 0x0040 1x 64 bytes
|
|
bInterval 5
|
|
can't get device qualifier: Resource temporarily unavailable
|
|
can't get debug descriptor: Resource temporarily unavailable
|
|
Device Status: 0x0065
|
|
Self Powered
|
|
Test Mode
|
|
Debug Mode
|
|
*/
|
|
|
|
static libusb_device_handle *devh = NULL;
|
|
|
|
libusb_device_handle *open_ezp2010()
|
|
{
|
|
ssize_t devc;
|
|
libusb_device **dev_list;
|
|
static libusb_device *dev = NULL;
|
|
struct libusb_device_descriptor dev_desc;
|
|
struct libusb_config_descriptor *dev_cfg = NULL;
|
|
const struct libusb_interface *intf = NULL;
|
|
const struct libusb_interface_descriptor *intf_desc = NULL;
|
|
|
|
int r = 0;
|
|
|
|
devc = libusb_get_device_list(NULL, &dev_list);
|
|
if (devc < 1)
|
|
return NULL;
|
|
|
|
for (int i = 0; i < devc; i++) {
|
|
dev = dev_list[i];
|
|
if (libusb_get_device_descriptor(dev, &dev_desc))
|
|
continue;
|
|
|
|
if ((dev_desc.idVendor != EZP2010_VID || dev_desc.idProduct != EZP2010_PID))
|
|
continue;
|
|
|
|
r = libusb_open(dev, &devh);
|
|
if (r < 0) {
|
|
perror("libusb_open");
|
|
return NULL;
|
|
}
|
|
|
|
for (int j = 0; j < dev_desc.bNumConfigurations; j++) {
|
|
if (libusb_get_config_descriptor(dev, j, &dev_cfg))
|
|
continue;
|
|
|
|
for (int k = 0; k < dev_cfg->bNumInterfaces; k++) {
|
|
intf = &dev_cfg->interface[k];
|
|
for (int l = 0; l < intf->num_altsetting; l++) {
|
|
intf_desc = &intf->altsetting[l];
|
|
if (libusb_kernel_driver_active(devh, intf_desc->bInterfaceNumber))
|
|
libusb_detach_kernel_driver(devh, intf_desc->bInterfaceNumber);
|
|
|
|
libusb_set_configuration(devh, dev_cfg->bConfigurationValue);
|
|
libusb_claim_interface(devh, intf_desc->bInterfaceNumber);
|
|
|
|
int e = 0;
|
|
while (libusb_claim_interface(devh, intf_desc->bInterfaceNumber) \
|
|
&& (e < 10)) {
|
|
sleep(1);
|
|
e++;
|
|
}
|
|
}
|
|
}
|
|
|
|
libusb_free_config_descriptor(dev_cfg);
|
|
}
|
|
return devh;
|
|
}
|
|
|
|
devh = NULL;
|
|
return NULL;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int r = 0;
|
|
int transferred = 0;
|
|
unsigned char buf[256];
|
|
|
|
r = libusb_init(NULL);
|
|
if (r < 0)
|
|
return 1;
|
|
|
|
open_ezp2010();
|
|
|
|
buf[0] = '\x17';
|
|
buf[1] = '\x0';
|
|
r = libusb_bulk_transfer(devh, 0x2, buf, 2, &transferred, 500);
|
|
if (r < 0) {
|
|
perror("libusb_claim_interface");
|
|
fprintf(stderr, "Error: %s\n", libusb_strerror(r));
|
|
}
|
|
printf("Bytes sent: %d\n", transferred);
|
|
|
|
r = libusb_bulk_transfer(devh, 0x81, buf, 0x20, &transferred, 500);
|
|
if (r < 0) {
|
|
perror("libusb_claim_interface");
|
|
fprintf(stderr, "Error: %s\n", libusb_strerror(r));
|
|
}
|
|
printf("Bytes received: %d\n", transferred);
|
|
printf("Packet: %s\n", buf);
|
|
|
|
libusb_release_interface(devh, 0);
|
|
libusb_reset_device(devh);
|
|
libusb_close(devh);
|
|
|
|
libusb_exit(NULL);
|
|
|
|
return 0;
|
|
}
|