Initial commit
[csrprogrammer:csrremote.git] / usbdriver.cpp
1 #include "usbdriver.h"
2
3 UsbDriver::UsbDriver() :
4     initialized(false),
5     ctx(NULL),
6     dev_handle(NULL)
7 {
8
9 }
10
11 bool UsbDriver::USBInit(uint16_t vendor, uint16_t device)
12 {
13     if(initialized) return true;
14
15     int r;
16     r = libusb_init(&ctx);
17
18     dev_handle = libusb_open_device_with_vid_pid(ctx, vendor, device);
19     if(dev_handle == NULL) {
20         USBRelease();
21         return false;
22     }
23
24     r = libusb_claim_interface(dev_handle, 0);
25     if(r < 0) {
26         USBRelease();
27         return false;
28     }
29
30     initialized = true;
31     return true;
32 }
33
34 void UsbDriver::USBRelease(void)
35 {
36     if(dev_handle) {
37         libusb_release_interface(dev_handle, 0);
38         libusb_close(dev_handle);
39     }
40
41     if(ctx)
42         libusb_exit(ctx);
43
44     ctx = NULL;
45     dev_handle = NULL;
46     initialized = false;
47 }
48
49 UsbDriver::~UsbDriver()
50 {
51     USBRelease();
52 }
53
54 /*bool UsbDriver::IsInitialized(void)
55 {
56     return initialized;
57 }*/
58
59 bool UsbDriver::WriteData(unsigned char data[], int size)
60 {
61     if(!initialized) return false;
62
63     int r,actual,writed = 0;
64     do {
65         r = libusb_bulk_transfer(dev_handle, (2 | LIBUSB_ENDPOINT_OUT),
66                      &data[writed], size-writed, &actual, 0);
67         writed += actual;
68         if(r) return false;
69     } while (writed < size);
70     return true;
71 }
72
73 bool UsbDriver::ReadData(unsigned char data[], int size)
74 {
75     if(!initialized) return false;
76
77     int r,actual = 0,readed = 0;
78     do {
79         r = libusb_bulk_transfer(dev_handle, (2 | LIBUSB_ENDPOINT_IN),
80                     &data[readed], size-readed, &actual, 0);
81         readed += actual;
82         if(r) return false;
83     } while(readed < size);
84     return true;
85 }