My Fork of F401RE-USBHost. Add USBHostMIDI functions (originaled by Kaoru Shoji http://mbed.org/users/kshoji/code/USBHostMIDI/)

Dependencies:   FATFileSystem

Dependents:   F401RE-USBHostMIDI_RecieveExample

Fork of F401RE-USBHost by Norimasa Okamoto

Committer:
va009039
Date:
Fri Jan 31 13:45:07 2014 +0000
Revision:
8:6463cd1964c0
Child:
9:7f9f64cf5ded
USB hub support.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 8:6463cd1964c0 1 #include "USBHostMouse.h"
va009039 8:6463cd1964c0 2
va009039 8:6463cd1964c0 3 #ifdef _USB_DBG
va009039 8:6463cd1964c0 4 #define USB_DBG(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\n");} while(0);
va009039 8:6463cd1964c0 5 #define USB_DBG_HEX(A,B) debug_hex(A,B)
va009039 8:6463cd1964c0 6 void debug_hex(uint8_t* buf, int size);
va009039 8:6463cd1964c0 7 #else
va009039 8:6463cd1964c0 8 #define USB_DBG(...) while(0)
va009039 8:6463cd1964c0 9 #define USB_DBG_HEX(A,B) while(0)
va009039 8:6463cd1964c0 10 #endif
va009039 8:6463cd1964c0 11
va009039 8:6463cd1964c0 12 #define USB_TEST_ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
va009039 8:6463cd1964c0 13 #define USB_TEST_ASSERT_FALSE(A) USB_TEST_ASSERT(!(A))
va009039 8:6463cd1964c0 14
va009039 8:6463cd1964c0 15 #define USB_INFO(...) do{fprintf(stderr,__VA_ARGS__);}while(0);
va009039 8:6463cd1964c0 16
va009039 8:6463cd1964c0 17 USBHostMouse::USBHostMouse() {
va009039 8:6463cd1964c0 18 host = USBHost::getHostInst();
va009039 8:6463cd1964c0 19 init();
va009039 8:6463cd1964c0 20 }
va009039 8:6463cd1964c0 21
va009039 8:6463cd1964c0 22 void USBHostMouse::init() {
va009039 8:6463cd1964c0 23 dev = NULL;
va009039 8:6463cd1964c0 24 int_in = NULL;
va009039 8:6463cd1964c0 25 onUpdate = NULL;
va009039 8:6463cd1964c0 26 onButtonUpdate = NULL;
va009039 8:6463cd1964c0 27 onXUpdate = NULL;
va009039 8:6463cd1964c0 28 onYUpdate = NULL;
va009039 8:6463cd1964c0 29 onZUpdate = NULL;
va009039 8:6463cd1964c0 30 report_id = 0;
va009039 8:6463cd1964c0 31 dev_connected = false;
va009039 8:6463cd1964c0 32 mouse_device_found = false;
va009039 8:6463cd1964c0 33 mouse_intf = -1;
va009039 8:6463cd1964c0 34
va009039 8:6463cd1964c0 35 buttons = 0;
va009039 8:6463cd1964c0 36 x = 0;
va009039 8:6463cd1964c0 37 y = 0;
va009039 8:6463cd1964c0 38 z = 0;
va009039 8:6463cd1964c0 39 }
va009039 8:6463cd1964c0 40
va009039 8:6463cd1964c0 41 bool USBHostMouse::connected() {
va009039 8:6463cd1964c0 42 return dev_connected;
va009039 8:6463cd1964c0 43 }
va009039 8:6463cd1964c0 44
va009039 8:6463cd1964c0 45 bool USBHostMouse::connect() {
va009039 8:6463cd1964c0 46
va009039 8:6463cd1964c0 47 if (dev_connected) {
va009039 8:6463cd1964c0 48 return true;
va009039 8:6463cd1964c0 49 }
va009039 8:6463cd1964c0 50
va009039 8:6463cd1964c0 51 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
va009039 8:6463cd1964c0 52 if ((dev = host->getDevice(i)) != NULL) {
va009039 8:6463cd1964c0 53
va009039 8:6463cd1964c0 54 if(host->enumerate(dev, this))
va009039 8:6463cd1964c0 55 break;
va009039 8:6463cd1964c0 56
va009039 8:6463cd1964c0 57 if (mouse_device_found) {
va009039 8:6463cd1964c0 58
va009039 8:6463cd1964c0 59 int_in = dev->getEndpoint(mouse_intf, INTERRUPT_ENDPOINT, IN);
va009039 8:6463cd1964c0 60 USB_DBG("int_in=%p", int_in);
va009039 8:6463cd1964c0 61 if (!int_in)
va009039 8:6463cd1964c0 62 break;
va009039 8:6463cd1964c0 63
va009039 8:6463cd1964c0 64 USB_INFO("New Mouse device: VID:%04x PID:%04x [dev: %p - intf: %d]\n", dev->getVid(), dev->getPid(), dev, mouse_intf);
va009039 8:6463cd1964c0 65 dev->setName("Mouse", mouse_intf);
va009039 8:6463cd1964c0 66 host->registerDriver(dev, mouse_intf, this, &USBHostMouse::init);
va009039 8:6463cd1964c0 67
va009039 8:6463cd1964c0 68 //int_in->attach(this, &USBHostMouse::rxHandler);
va009039 8:6463cd1964c0 69 host->interruptRead(dev, int_in, report, int_in->getSize(), false);
va009039 8:6463cd1964c0 70
va009039 8:6463cd1964c0 71 dev_connected = true;
va009039 8:6463cd1964c0 72 return true;
va009039 8:6463cd1964c0 73 }
va009039 8:6463cd1964c0 74 }
va009039 8:6463cd1964c0 75 }
va009039 8:6463cd1964c0 76 init();
va009039 8:6463cd1964c0 77 return false;
va009039 8:6463cd1964c0 78 }
va009039 8:6463cd1964c0 79
va009039 8:6463cd1964c0 80 /*virtual*/ void USBHostMouse::setVidPid(uint16_t vid, uint16_t pid)
va009039 8:6463cd1964c0 81 {
va009039 8:6463cd1964c0 82 USB_DBG("vid:%04x pid:%04x", vid, pid);
va009039 8:6463cd1964c0 83 // we don't check VID/PID for mouse driver
va009039 8:6463cd1964c0 84 }
va009039 8:6463cd1964c0 85
va009039 8:6463cd1964c0 86 /*virtual*/ bool USBHostMouse::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
va009039 8:6463cd1964c0 87 {
va009039 8:6463cd1964c0 88 USB_DBG("intf: %d class: %02x %02x %02x", intf_nb, intf_class, intf_subclass, intf_protocol);
va009039 8:6463cd1964c0 89 if ((mouse_intf == -1) &&
va009039 8:6463cd1964c0 90 (intf_class == HID_CLASS) &&
va009039 8:6463cd1964c0 91 (intf_subclass == 0x01) &&
va009039 8:6463cd1964c0 92 (intf_protocol == 0x02)) {
va009039 8:6463cd1964c0 93 mouse_intf = intf_nb;
va009039 8:6463cd1964c0 94 return true;
va009039 8:6463cd1964c0 95 }
va009039 8:6463cd1964c0 96 return false;
va009039 8:6463cd1964c0 97 }
va009039 8:6463cd1964c0 98
va009039 8:6463cd1964c0 99 /*virtual*/ bool USBHostMouse::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
va009039 8:6463cd1964c0 100 {
va009039 8:6463cd1964c0 101 USB_DBG("intf_nb=%d type=%d dir=%d", intf_nb, type, dir);
va009039 8:6463cd1964c0 102
va009039 8:6463cd1964c0 103 if (intf_nb == mouse_intf) {
va009039 8:6463cd1964c0 104 if (type == INTERRUPT_ENDPOINT && dir == IN) {
va009039 8:6463cd1964c0 105 mouse_device_found = true;
va009039 8:6463cd1964c0 106 return true;
va009039 8:6463cd1964c0 107 }
va009039 8:6463cd1964c0 108 }
va009039 8:6463cd1964c0 109 return false;
va009039 8:6463cd1964c0 110 }
va009039 8:6463cd1964c0 111
va009039 8:6463cd1964c0 112 #if 0
va009039 8:6463cd1964c0 113 void USBHostMouse::setup() {
va009039 8:6463cd1964c0 114 dev = host->getDevice(0);
va009039 8:6463cd1964c0 115 if (dev->getClass() == HUB_CLASS) {
va009039 8:6463cd1964c0 116 for(int i = 1; ; i++) {
va009039 8:6463cd1964c0 117 dev = host->getDevice(i);
va009039 8:6463cd1964c0 118 if (dev == NULL) {
va009039 8:6463cd1964c0 119 break;
va009039 8:6463cd1964c0 120 }
va009039 8:6463cd1964c0 121 if (enumeration(dev)) {
va009039 8:6463cd1964c0 122 break;
va009039 8:6463cd1964c0 123 }
va009039 8:6463cd1964c0 124 }
va009039 8:6463cd1964c0 125 USB_TEST_ASSERT(ep_int_in);
va009039 8:6463cd1964c0 126 } else {
va009039 8:6463cd1964c0 127 ep_int_in = NULL;
va009039 8:6463cd1964c0 128 }
va009039 8:6463cd1964c0 129 }
va009039 8:6463cd1964c0 130
va009039 8:6463cd1964c0 131 bool USBHostMouse::enumeration(USBDeviceConnected* dev) {
va009039 8:6463cd1964c0 132 // config descriptor
va009039 8:6463cd1964c0 133 uint8_t desc[4];
va009039 8:6463cd1964c0 134 int rc = host->controlRead(dev, 0x80, GET_DESCRIPTOR, 2<<8, 0, desc, 4);
va009039 8:6463cd1964c0 135 USB_TEST_ASSERT(rc == USB_TYPE_OK);
va009039 8:6463cd1964c0 136 USB_DBG_HEX(desc, 4);
va009039 8:6463cd1964c0 137
va009039 8:6463cd1964c0 138 int TotalLength = desc[2]|desc[3]<<8;
va009039 8:6463cd1964c0 139 uint8_t* buf = new uint8_t[TotalLength];
va009039 8:6463cd1964c0 140 rc = host->controlRead(dev, 0x80, GET_DESCRIPTOR, 2<<8, 0, buf, TotalLength);
va009039 8:6463cd1964c0 141 USB_TEST_ASSERT(rc == USB_TYPE_OK);
va009039 8:6463cd1964c0 142 //USB_DBG_HEX(buf, TotalLength);
va009039 8:6463cd1964c0 143 bool found = false;
va009039 8:6463cd1964c0 144 for(int i = 0; i < TotalLength; ) {
va009039 8:6463cd1964c0 145 int Length = buf[i];
va009039 8:6463cd1964c0 146 uint8_t DescriptorType = buf[i+1];
va009039 8:6463cd1964c0 147 if (DescriptorType == 0x04) { // interface
va009039 8:6463cd1964c0 148 InterfaceDescriptor* desc = reinterpret_cast<InterfaceDescriptor*>(buf+i);
va009039 8:6463cd1964c0 149 if (desc->bInterfaceClass == 0x03) {
va009039 8:6463cd1964c0 150 found = true;
va009039 8:6463cd1964c0 151 }
va009039 8:6463cd1964c0 152 } else if (DescriptorType == 0x05) { // endpoint
va009039 8:6463cd1964c0 153 EndpointDescriptor* desc = reinterpret_cast<EndpointDescriptor*>(buf+i);
va009039 8:6463cd1964c0 154 if (desc->bmAttributes == 0x03 &&
va009039 8:6463cd1964c0 155 (desc->bEndpointAddress & 0x80)) { // interrupt in
va009039 8:6463cd1964c0 156 ep_int_in = new USBEndpoint;
va009039 8:6463cd1964c0 157 ep_int_in->setDevice(dev);
va009039 8:6463cd1964c0 158 ep_int_in->setAddress(desc->bEndpointAddress);
va009039 8:6463cd1964c0 159 ep_int_in->setSize(desc->wMaxPacketSize);
va009039 8:6463cd1964c0 160 }
va009039 8:6463cd1964c0 161 }
va009039 8:6463cd1964c0 162 USB_DBG_HEX(buf+i, Length);
va009039 8:6463cd1964c0 163 i += Length;
va009039 8:6463cd1964c0 164 }
va009039 8:6463cd1964c0 165 delete[] buf;
va009039 8:6463cd1964c0 166 if (!found) {
va009039 8:6463cd1964c0 167 return false;
va009039 8:6463cd1964c0 168 }
va009039 8:6463cd1964c0 169 int config = 1;
va009039 8:6463cd1964c0 170 host->controlWrite(dev, 0x00, SET_CONFIGURATION, config, 0, NULL, 0);
va009039 8:6463cd1964c0 171 wait_ms(100);
va009039 8:6463cd1964c0 172 return true;
va009039 8:6463cd1964c0 173 }
va009039 8:6463cd1964c0 174 #endif
va009039 8:6463cd1964c0 175