blob: 261cded1c7464c510a4dc3142a9115b397938c1f [file] [log] [blame]
Austin Schuh9b360e92013-03-27 04:47:04 +00001#ifndef LIBUSB_H_
2#define LIBUSB_H_
3
Brian Silverman798c7782013-03-28 16:48:02 -07004#include <libusb-1.0/libusb.h>
Austin Schuh9b360e92013-03-27 04:47:04 +00005
Brian Silverman4ad17832013-03-31 01:26:08 -07006#include "aos/common/macros.h"
7
Austin Schuh9b360e92013-03-27 04:47:04 +00008class LibUSBDeviceHandle;
Brian Silverman4ad17832013-03-31 01:26:08 -07009namespace libusb {
10class Transfer;
Brian Silvermanc554a8f2013-03-31 19:07:49 -070011class IsochronousTransfer;
Brian Silverman4ad17832013-03-31 01:26:08 -070012}
Austin Schuh9b360e92013-03-27 04:47:04 +000013
14class LibUSB {
15 public:
16 explicit LibUSB();
Brian Silverman4ad17832013-03-31 01:26:08 -070017 ~LibUSB();
18
Austin Schuh9b360e92013-03-27 04:47:04 +000019 // Return a device handle or NULL with the correct VID and PID.
20 LibUSBDeviceHandle *FindDeviceWithVIDPID(
21 int vid, int pid);
22
Brian Silverman4ad17832013-03-31 01:26:08 -070023 void HandleEvents();
24
Austin Schuh9b360e92013-03-27 04:47:04 +000025 private:
26 libusb_context *ctx_;
Brian Silverman4ad17832013-03-31 01:26:08 -070027
28 DISALLOW_COPY_AND_ASSIGN(LibUSB);
Austin Schuh9b360e92013-03-27 04:47:04 +000029};
30
31class LibUSBDeviceHandle {
32 public:
33 virtual ~LibUSBDeviceHandle();
34 // Transfers data using an interrupt transfer.
35 int interrupt_transfer(unsigned char endpoint, unsigned char *data,
36 int length, int *transferred, unsigned int timeout);
37
38 // Transfers data using a bulk transfer.
39 int bulk_transfer(unsigned char endpoint, unsigned char *data,
40 int length, int *transferred, unsigned int timeout);
41
42 private:
43 friend class LibUSB; // For constructor
Brian Silverman4ad17832013-03-31 01:26:08 -070044 friend class libusb::Transfer; // for access to dev_handle_
Brian Silvermanc554a8f2013-03-31 19:07:49 -070045 friend class libusb::IsochronousTransfer; // for access to dev_handle_
Austin Schuh9b360e92013-03-27 04:47:04 +000046 // Takes ownership of the device handle and frees it when destructed.
47 explicit LibUSBDeviceHandle(libusb_device_handle *dev_handle);
Brian Silverman4ad17832013-03-31 01:26:08 -070048 libusb_device_handle *dev_handle_;
49
50 DISALLOW_COPY_AND_ASSIGN(LibUSBDeviceHandle);
Austin Schuh9b360e92013-03-27 04:47:04 +000051};
52
Brian Silverman4ad17832013-03-31 01:26:08 -070053// TODO(brians): move everything in here
54namespace libusb {
55
56// Wraps a libusb_transfer*.
57// Represents an asynchronous transfer.
58// Only designed to support interrupt and bulk transfers because they are very
59// similar and simple.
60class Transfer {
61 public:
62 Transfer(size_t data_length,
63 void (*callback)(Transfer *, void *),
64 void *user_data);
65 ~Transfer();
66
67 void FillInterrupt(LibUSBDeviceHandle *device,
68 unsigned char endpoint,
69 unsigned int timeout);
70
71 void Submit();
72 void Cancel();
73
74 libusb_transfer_status status() { return transfer_->status; }
75 int read_bytes() { return transfer_->actual_length; }
76
77 const uint8_t *data() { return data_; }
78
Brian Silvermanc554a8f2013-03-31 19:07:49 -070079 protected:
Brian Silverman4ad17832013-03-31 01:26:08 -070080 static void StaticTransferCallback(libusb_transfer *self) {
81 static_cast<Transfer *>(self->user_data)->TransferCallback();
82 }
Brian Silvermanc554a8f2013-03-31 19:07:49 -070083
84 private:
Brian Silverman4ad17832013-03-31 01:26:08 -070085 void TransferCallback();
86
87 libusb_transfer *const transfer_;
88
89 uint8_t *const data_;
90 size_t data_length_;
91
92 void (*const callback_)(Transfer *, void *);
93 void *const user_data_;
94
95 DISALLOW_COPY_AND_ASSIGN(Transfer);
96};
97
Brian Silvermanc554a8f2013-03-31 19:07:49 -070098class IsochronousTransfer : public Transfer {
99 public:
100 IsochronousTransfer(size_t packet_length,
101 int num_packets,
102 void (*callback)(Transfer *, void *),
103 void *user_data);
104
105 void FillIsochronous(LibUSBDeviceHandle *device,
106 unsigned char endpoint,
107 unsigned int timeout);
108
109 private:
110 const int num_packets_;
111};
112
Brian Silverman4ad17832013-03-31 01:26:08 -0700113} // namespace libusb
114
Austin Schuh9b360e92013-03-27 04:47:04 +0000115#endif // LIBUSB_H_