Simple USBHost library for Nucleo F446RE/F411RE/F401RE FRDM-KL46Z/KL25Z/F64F LPC4088/LPC1768

Dependencies:   FATFileSystem

Dependents:   F401RE-BTstack_example F401RE-USBHostMSD_HelloWorld

Fork of KL46Z-USBHost by Norimasa Okamoto

簡易USBホストライブラリです。
official-USBHostの下位互換で対応プログラムを僅かな修正で動かすことが出来ます。

Platforms

  • Nucleo F446RE
  • Nucleo F411RE
  • Nucleo F401RE
  • FRDM-K64F
  • FRDM-KL46Z
  • FRDM-KL25Z
  • LPC4088
  • LPC1768

Nucleo F446RE/F411RE/F401REのUSB接続方法

ST morphoUSB
U5V (CN10-8)VBUS (1 RED)
PA11 (CN10-14)DM  (2 WHITE)
PA12 (CN10-12)DP  (3 GREEN)
GND (CN10-20)GND (4 BLACK)

Examples

Import programF446RE-USBHostMouse_HelloWorld

USBHostMouse Hello World for ST-Nucleo-F446RE

Import programF401RE-USBHostMSD_HelloWorld

Simple USBHost MSD(USB flash drive) for Nucleo F401RE/FRDM-KL46Z test program

Import programF401RE-USBHostC270_example

Simple USBHost WebCam test program

Import programK64F_USBHostC270_example

Simple USBHost C270 example

Import programF401RE-BTstack_example

BTstack for Nucleo F401RE/FRDM-KL46Z example program

Import programUSBHostRSSI_example

Bluetooth device discovery example program.

Import programKL46Z-USBHostGPS_HelloWorld

Simple USBHost GPS Dongle Receiver for FRDM-KL46Z test program

Committer:
va009039
Date:
Mon Jan 27 11:00:28 2014 +0000
Revision:
5:10bfc10afcc8
add isochronous transfer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 5:10bfc10afcc8 1 // Simple USBHost for FRDM-KL46Z
va009039 5:10bfc10afcc8 2 #include "USBHost.h"
va009039 5:10bfc10afcc8 3 #include <algorithm>
va009039 5:10bfc10afcc8 4
va009039 5:10bfc10afcc8 5 template <bool>struct CtAssert;
va009039 5:10bfc10afcc8 6 template <>struct CtAssert<true> {};
va009039 5:10bfc10afcc8 7 #define CTASSERT(A) CtAssert<A>();
va009039 5:10bfc10afcc8 8
va009039 5:10bfc10afcc8 9
va009039 5:10bfc10afcc8 10 #ifdef _USB_DBG
va009039 5:10bfc10afcc8 11 #define USB_DBG(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\n");} while(0);
va009039 5:10bfc10afcc8 12 #define USB_DBG2(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\n");} while(0);
va009039 5:10bfc10afcc8 13 #define USB_DBG_HEX(A,B) debug_hex(A,B)
va009039 5:10bfc10afcc8 14 #define USB_DBG_ERRSTAT() report.print_errstat();
va009039 5:10bfc10afcc8 15 void debug_hex(uint8_t* buf, int size);
va009039 5:10bfc10afcc8 16 #else
va009039 5:10bfc10afcc8 17 #define USB_DBG(...) while(0)
va009039 5:10bfc10afcc8 18 #define USB_DBG2(...) while(0)
va009039 5:10bfc10afcc8 19 #define USB_DBG_HEX(A,B) while(0)
va009039 5:10bfc10afcc8 20 #define USB_DBG_ERRSTAT() while(0)
va009039 5:10bfc10afcc8 21 #endif
va009039 5:10bfc10afcc8 22
va009039 5:10bfc10afcc8 23 #define USB_TEST_ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
va009039 5:10bfc10afcc8 24 #define USB_TEST_ASSERT_FALSE(A) USB_TEST_ASSERT(!(A))
va009039 5:10bfc10afcc8 25
va009039 5:10bfc10afcc8 26 #define USB_INFO(...) do{fprintf(stderr,__VA_ARGS__);}while(0);
va009039 5:10bfc10afcc8 27
va009039 5:10bfc10afcc8 28 USBHost* USBHost::inst = NULL;
va009039 5:10bfc10afcc8 29
va009039 5:10bfc10afcc8 30 USBHost* USBHost::getHostInst()
va009039 5:10bfc10afcc8 31 {
va009039 5:10bfc10afcc8 32 if (inst == NULL) {
va009039 5:10bfc10afcc8 33 inst = new USBHost();
va009039 5:10bfc10afcc8 34 inst->init();
va009039 5:10bfc10afcc8 35 }
va009039 5:10bfc10afcc8 36 return inst;
va009039 5:10bfc10afcc8 37 }
va009039 5:10bfc10afcc8 38
va009039 5:10bfc10afcc8 39 USBHost::USBHost() {
va009039 5:10bfc10afcc8 40 }
va009039 5:10bfc10afcc8 41
va009039 5:10bfc10afcc8 42 /* virtual */ bool USBHost::enumeration() {
va009039 5:10bfc10afcc8 43 USBEndpoint* ep = &ep_ctl_in_out;
va009039 5:10bfc10afcc8 44 uint8_t desc[64];
va009039 5:10bfc10afcc8 45 ep->setAddress(0);
va009039 5:10bfc10afcc8 46 ep->setSize(8); // max packet size
va009039 5:10bfc10afcc8 47 dev_addr = 0;
va009039 5:10bfc10afcc8 48 wait_ms(100);
va009039 5:10bfc10afcc8 49 SETUP_PACKET setup_get_descriptor = {0x80, GET_DESCRIPTOR, 1<<8, 0, 0};
va009039 5:10bfc10afcc8 50 int result = ControlRead(&setup_get_descriptor, desc, ep->getSize());
va009039 5:10bfc10afcc8 51 if (result < ep->getSize()) {
va009039 5:10bfc10afcc8 52 USB_DBG("result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 53 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 54 return false;
va009039 5:10bfc10afcc8 55 }
va009039 5:10bfc10afcc8 56 USB_DBG_HEX(desc, result);
va009039 5:10bfc10afcc8 57 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 58 DeviceDescriptor* dev_desc = reinterpret_cast<DeviceDescriptor*>(desc);
va009039 5:10bfc10afcc8 59 ep->setSize(dev_desc->bMaxPacketSize);
va009039 5:10bfc10afcc8 60
va009039 5:10bfc10afcc8 61 SETUP_PACKET setup_set_address = {0x00, SET_ADDRESS, 1, 0, 0};
va009039 5:10bfc10afcc8 62 result = ControlWrite(&setup_set_address);
va009039 5:10bfc10afcc8 63 if (result < 0) {
va009039 5:10bfc10afcc8 64 USB_DBG("result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 65 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 66 return false;
va009039 5:10bfc10afcc8 67 }
va009039 5:10bfc10afcc8 68 wait_ms(100);
va009039 5:10bfc10afcc8 69 dev_addr = 1;
va009039 5:10bfc10afcc8 70
va009039 5:10bfc10afcc8 71 result = ControlRead(&setup_get_descriptor, desc, sizeof(desc));
va009039 5:10bfc10afcc8 72 if (result < 8) {
va009039 5:10bfc10afcc8 73 USB_DBG("result=%d", result);
va009039 5:10bfc10afcc8 74 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 75 return false;
va009039 5:10bfc10afcc8 76 }
va009039 5:10bfc10afcc8 77 USB_DBG_HEX(desc, result);
va009039 5:10bfc10afcc8 78 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 79
va009039 5:10bfc10afcc8 80 USB_INFO("USB VID: %04x, PID: %04x\n", dev_desc->idVendor, dev_desc->idProduct);
va009039 5:10bfc10afcc8 81 if (dev_desc->bDeviceClass == HUB_CLASS) {
va009039 5:10bfc10afcc8 82 USB_INFO("USB hub not supported.\n\n");
va009039 5:10bfc10afcc8 83 exit(1);
va009039 5:10bfc10afcc8 84 }
va009039 5:10bfc10afcc8 85
va009039 5:10bfc10afcc8 86 setup_get_descriptor.wValue = 2<<8; // config descriptor
va009039 5:10bfc10afcc8 87 result = ControlRead(&setup_get_descriptor, desc, 4);
va009039 5:10bfc10afcc8 88 if (result != 4) {
va009039 5:10bfc10afcc8 89 USB_DBG("result=%d", result);
va009039 5:10bfc10afcc8 90 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 91 return false;
va009039 5:10bfc10afcc8 92 }
va009039 5:10bfc10afcc8 93 USB_DBG_HEX(desc, 4);
va009039 5:10bfc10afcc8 94 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 95
va009039 5:10bfc10afcc8 96 int TotalLength = desc[2]|desc[3]<<8;
va009039 5:10bfc10afcc8 97 uint8_t* buf = new uint8_t[TotalLength];
va009039 5:10bfc10afcc8 98 result = ControlRead(&setup_get_descriptor, buf, TotalLength);
va009039 5:10bfc10afcc8 99 if (result != TotalLength) {
va009039 5:10bfc10afcc8 100 USB_DBG("result=%d TotalLength=%d %02x", result, TotalLength, LastStatus);
va009039 5:10bfc10afcc8 101 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 102 return false;
va009039 5:10bfc10afcc8 103 }
va009039 5:10bfc10afcc8 104 USB_DBG_HEX(buf, TotalLength);
va009039 5:10bfc10afcc8 105 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 106
va009039 5:10bfc10afcc8 107 for(int i = 0; i < TotalLength; ) {
va009039 5:10bfc10afcc8 108 int Length = buf[i];
va009039 5:10bfc10afcc8 109 uint8_t DescriptorType = buf[i+1];
va009039 5:10bfc10afcc8 110 if (DescriptorType == 0x05) { // endpoint
va009039 5:10bfc10afcc8 111 EndpointDescriptor* desc = reinterpret_cast<EndpointDescriptor*>(buf+i);
va009039 5:10bfc10afcc8 112 USBEndpoint* ep = NULL;
va009039 5:10bfc10afcc8 113 if (desc->bmAttributes == 0x03) { // interrupt
va009039 5:10bfc10afcc8 114 if (desc->bEndpointAddress & 0x80) {
va009039 5:10bfc10afcc8 115 ep = &ep_int_in;
va009039 5:10bfc10afcc8 116 }
va009039 5:10bfc10afcc8 117 } else if (desc->bmAttributes == 0x02) { // bulk
va009039 5:10bfc10afcc8 118 ep = (desc->bEndpointAddress & 0x80) ? &ep_bulk_in : &ep_bulk_out;
va009039 5:10bfc10afcc8 119 }
va009039 5:10bfc10afcc8 120 if (ep) {
va009039 5:10bfc10afcc8 121 ep->setAddress(desc->bEndpointAddress);
va009039 5:10bfc10afcc8 122 ep->setSize(desc->wMaxPacketSize);
va009039 5:10bfc10afcc8 123 }
va009039 5:10bfc10afcc8 124 }
va009039 5:10bfc10afcc8 125 USB_DBG_HEX(buf+i, Length);
va009039 5:10bfc10afcc8 126 i += Length;
va009039 5:10bfc10afcc8 127 }
va009039 5:10bfc10afcc8 128 delete[] buf;
va009039 5:10bfc10afcc8 129
va009039 5:10bfc10afcc8 130 // config = 1
va009039 5:10bfc10afcc8 131 SETUP_PACKET setup_set_config = {0x00, SET_CONFIGURATION, 1, 0, 0};
va009039 5:10bfc10afcc8 132 result = ControlWrite(&setup_set_config);
va009039 5:10bfc10afcc8 133 if (result < 0) {
va009039 5:10bfc10afcc8 134 USB_DBG("set config: %02x", LastStatus);
va009039 5:10bfc10afcc8 135 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 136 if (lowSpeed && LastStatus == STALL) { // TODO:
va009039 5:10bfc10afcc8 137 wait_ms(100);
va009039 5:10bfc10afcc8 138 return true;
va009039 5:10bfc10afcc8 139 }
va009039 5:10bfc10afcc8 140 return false;
va009039 5:10bfc10afcc8 141 }
va009039 5:10bfc10afcc8 142 wait_ms(100);
va009039 5:10bfc10afcc8 143 return true;
va009039 5:10bfc10afcc8 144 }
va009039 5:10bfc10afcc8 145
va009039 5:10bfc10afcc8 146 USB_TYPE USBHost::controlRead(USBDeviceConnected* dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len) {
va009039 5:10bfc10afcc8 147 SETUP_PACKET setup = {requestType, request, value, index};
va009039 5:10bfc10afcc8 148 int result = ControlRead(&setup, buf, len);
va009039 5:10bfc10afcc8 149 USB_DBG2("result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 150 return (result >= 0) ? USB_TYPE_OK : USB_TYPE_ERROR;
va009039 5:10bfc10afcc8 151 }
va009039 5:10bfc10afcc8 152
va009039 5:10bfc10afcc8 153 USB_TYPE USBHost::controlWrite(USBDeviceConnected* dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len) {
va009039 5:10bfc10afcc8 154 SETUP_PACKET setup = {requestType, request, value, index};
va009039 5:10bfc10afcc8 155 int result = ControlWrite(&setup, buf, len);
va009039 5:10bfc10afcc8 156 if (result >= 0) {
va009039 5:10bfc10afcc8 157 return USB_TYPE_OK;
va009039 5:10bfc10afcc8 158 }
va009039 5:10bfc10afcc8 159 USB_DBG("result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 160 USB_DBG_ERRSTAT();
va009039 5:10bfc10afcc8 161 USB_DBG_HEX(buf, len);
va009039 5:10bfc10afcc8 162 return USB_TYPE_ERROR;
va009039 5:10bfc10afcc8 163 }
va009039 5:10bfc10afcc8 164
va009039 5:10bfc10afcc8 165 USB_TYPE USBHost::bulkRead(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking) {
va009039 5:10bfc10afcc8 166 USB_TEST_ASSERT(blocking);
va009039 5:10bfc10afcc8 167 int result = BulkRead(buf, len);
va009039 5:10bfc10afcc8 168 if (result >= 0) {
va009039 5:10bfc10afcc8 169 return USB_TYPE_OK;
va009039 5:10bfc10afcc8 170 }
va009039 5:10bfc10afcc8 171 //USB_DBG2("result=%d %02x", result, host->LastStatus);
va009039 5:10bfc10afcc8 172 return USB_TYPE_ERROR;
va009039 5:10bfc10afcc8 173 }
va009039 5:10bfc10afcc8 174
va009039 5:10bfc10afcc8 175 USB_TYPE USBHost::bulkWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking) {
va009039 5:10bfc10afcc8 176 USB_TEST_ASSERT(blocking);
va009039 5:10bfc10afcc8 177 int result = BulkWrite(buf, len);
va009039 5:10bfc10afcc8 178 if (result >= 0) {
va009039 5:10bfc10afcc8 179 return USB_TYPE_OK;
va009039 5:10bfc10afcc8 180 }
va009039 5:10bfc10afcc8 181 USB_DBG2("result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 182 return USB_TYPE_ERROR;
va009039 5:10bfc10afcc8 183 }
va009039 5:10bfc10afcc8 184
va009039 5:10bfc10afcc8 185 USB_TYPE USBHost::interruptWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking) {
va009039 5:10bfc10afcc8 186 USB_TEST_ASSERT(blocking);
va009039 5:10bfc10afcc8 187 int result = InterruptRead(buf, len);
va009039 5:10bfc10afcc8 188 if (result >= 0) {
va009039 5:10bfc10afcc8 189 return USB_TYPE_OK;
va009039 5:10bfc10afcc8 190 }
va009039 5:10bfc10afcc8 191 return USB_TYPE_ERROR;
va009039 5:10bfc10afcc8 192 }
va009039 5:10bfc10afcc8 193
va009039 5:10bfc10afcc8 194 int USBHost::ControlRead(SETUP_PACKET* setup, uint8_t* data, int size) {
va009039 5:10bfc10afcc8 195 USBEndpoint* ep = &ep_ctl_in_out;
va009039 5:10bfc10afcc8 196 setAddr(dev_addr);
va009039 5:10bfc10afcc8 197 token_setup(ep, setup, size); // setup stage
va009039 5:10bfc10afcc8 198 if (LastStatus != ACK) {
va009039 5:10bfc10afcc8 199 USB_DBG("setup %02x", LastStatus);
va009039 5:10bfc10afcc8 200 return -1;
va009039 5:10bfc10afcc8 201 }
va009039 5:10bfc10afcc8 202 int read_len = 0;
va009039 5:10bfc10afcc8 203 while(read_len < size) {
va009039 5:10bfc10afcc8 204 int size2 = std::min(size-read_len, ep->getSize());
va009039 5:10bfc10afcc8 205 int result = token_in(ep, data+read_len, size2);
va009039 5:10bfc10afcc8 206 //USB_DBG("token_in result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 207 if (result < 0) {
va009039 5:10bfc10afcc8 208 USB_DBG("token_in %d/%d %02x", read_len, size, LastStatus);
va009039 5:10bfc10afcc8 209 return result;
va009039 5:10bfc10afcc8 210 }
va009039 5:10bfc10afcc8 211 read_len += result;
va009039 5:10bfc10afcc8 212 if (result < ep->getSize()) {
va009039 5:10bfc10afcc8 213 break;
va009039 5:10bfc10afcc8 214 }
va009039 5:10bfc10afcc8 215 }
va009039 5:10bfc10afcc8 216 int result = token_out(ep); // status stage
va009039 5:10bfc10afcc8 217 if (result < 0) {
va009039 5:10bfc10afcc8 218 USB_DBG("status token_out %02x", LastStatus);
va009039 5:10bfc10afcc8 219 if (LastStatus == STALL) {
va009039 5:10bfc10afcc8 220 return read_len;
va009039 5:10bfc10afcc8 221 }
va009039 5:10bfc10afcc8 222 return result;
va009039 5:10bfc10afcc8 223 }
va009039 5:10bfc10afcc8 224 return read_len;
va009039 5:10bfc10afcc8 225 }
va009039 5:10bfc10afcc8 226
va009039 5:10bfc10afcc8 227 int USBHost::ControlWrite(SETUP_PACKET* setup, uint8_t* data, int size) {
va009039 5:10bfc10afcc8 228 USBEndpoint* ep = &ep_ctl_in_out;
va009039 5:10bfc10afcc8 229 setAddr(dev_addr);
va009039 5:10bfc10afcc8 230 token_setup(ep, setup, size); // setup stage
va009039 5:10bfc10afcc8 231 if (LastStatus != ACK) {
va009039 5:10bfc10afcc8 232 USB_DBG("setup %02x", LastStatus);
va009039 5:10bfc10afcc8 233 return -1;
va009039 5:10bfc10afcc8 234 }
va009039 5:10bfc10afcc8 235 int write_len = 0;
va009039 5:10bfc10afcc8 236 if (data != NULL) {
va009039 5:10bfc10afcc8 237 write_len = token_out(ep, data, size);
va009039 5:10bfc10afcc8 238 if (write_len < 0) {
va009039 5:10bfc10afcc8 239 return -1;
va009039 5:10bfc10afcc8 240 }
va009039 5:10bfc10afcc8 241 }
va009039 5:10bfc10afcc8 242 int result = token_in(ep); // status stage
va009039 5:10bfc10afcc8 243 if (result < 0) {
va009039 5:10bfc10afcc8 244 USB_DBG("result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 245 //return result;
va009039 5:10bfc10afcc8 246 }
va009039 5:10bfc10afcc8 247 return write_len;
va009039 5:10bfc10afcc8 248 }
va009039 5:10bfc10afcc8 249
va009039 5:10bfc10afcc8 250 int USBHost::InterruptRead(uint8_t* data, int size) {
va009039 5:10bfc10afcc8 251 USBEndpoint* ep = &ep_int_in;
va009039 5:10bfc10afcc8 252 setAddr(dev_addr);
va009039 5:10bfc10afcc8 253 setEndpoint();
va009039 5:10bfc10afcc8 254 const int retryLimit = 0;
va009039 5:10bfc10afcc8 255 int read_len = 0;
va009039 5:10bfc10afcc8 256 for(int n = 0; read_len < size; n++) {
va009039 5:10bfc10afcc8 257 int size2 = std::min(size-read_len, ep->getSize());
va009039 5:10bfc10afcc8 258 int result = token_in(ep, data+read_len, size2, retryLimit);
va009039 5:10bfc10afcc8 259 if (result < 0) {
va009039 5:10bfc10afcc8 260 if (LastStatus == NAK) {
va009039 5:10bfc10afcc8 261 if (n == 0) {
va009039 5:10bfc10afcc8 262 return -1;
va009039 5:10bfc10afcc8 263 }
va009039 5:10bfc10afcc8 264 break;
va009039 5:10bfc10afcc8 265 }
va009039 5:10bfc10afcc8 266 USB_DBG("token_in result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 267 return result;
va009039 5:10bfc10afcc8 268 }
va009039 5:10bfc10afcc8 269 read_len += result;
va009039 5:10bfc10afcc8 270 if (result < ep->getSize()) {
va009039 5:10bfc10afcc8 271 break;
va009039 5:10bfc10afcc8 272 }
va009039 5:10bfc10afcc8 273 }
va009039 5:10bfc10afcc8 274 return read_len;
va009039 5:10bfc10afcc8 275 }
va009039 5:10bfc10afcc8 276
va009039 5:10bfc10afcc8 277 int USBHost::BulkRead(uint8_t* data, int size, int timeout_ms) {
va009039 5:10bfc10afcc8 278 USBEndpoint* ep = &ep_bulk_in;
va009039 5:10bfc10afcc8 279 setAddr(dev_addr);
va009039 5:10bfc10afcc8 280 setEndpoint();
va009039 5:10bfc10afcc8 281 int retryLimit = (timeout_ms == 0) ? 0 : 10;
va009039 5:10bfc10afcc8 282 int read_len = 0;
va009039 5:10bfc10afcc8 283 Timer t;
va009039 5:10bfc10afcc8 284 for(int n = 0; read_len < size; n++) {
va009039 5:10bfc10afcc8 285 int size2 = std::min(size-read_len, ep->getSize());
va009039 5:10bfc10afcc8 286 int result = token_in(ep, data+read_len, size2, retryLimit);
va009039 5:10bfc10afcc8 287 if (result < 0) {
va009039 5:10bfc10afcc8 288 if (LastStatus == NAK) {
va009039 5:10bfc10afcc8 289 if (n == 0) {
va009039 5:10bfc10afcc8 290 return -1;
va009039 5:10bfc10afcc8 291 }
va009039 5:10bfc10afcc8 292 break;
va009039 5:10bfc10afcc8 293 }
va009039 5:10bfc10afcc8 294 USB_DBG("token_in result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 295 return result;
va009039 5:10bfc10afcc8 296 }
va009039 5:10bfc10afcc8 297 read_len += result;
va009039 5:10bfc10afcc8 298 if (result < ep->getSize()) {
va009039 5:10bfc10afcc8 299 break;
va009039 5:10bfc10afcc8 300 }
va009039 5:10bfc10afcc8 301 if (timeout_ms > 0 && t.read_ms() > timeout_ms) {
va009039 5:10bfc10afcc8 302 USB_DBG("timeout_ms: %d", timeout_ms);
va009039 5:10bfc10afcc8 303 break;
va009039 5:10bfc10afcc8 304 }
va009039 5:10bfc10afcc8 305 }
va009039 5:10bfc10afcc8 306 return read_len;
va009039 5:10bfc10afcc8 307 }
va009039 5:10bfc10afcc8 308
va009039 5:10bfc10afcc8 309 int USBHost::BulkWrite(const uint8_t* data, int size) {
va009039 5:10bfc10afcc8 310 USBEndpoint* ep = &ep_bulk_out;
va009039 5:10bfc10afcc8 311 setAddr(dev_addr);
va009039 5:10bfc10afcc8 312 setEndpoint();
va009039 5:10bfc10afcc8 313 int write_len = 0;
va009039 5:10bfc10afcc8 314 for(int n = 0; write_len < size; n++) {
va009039 5:10bfc10afcc8 315 int size2 = std::min(size-write_len, ep->getSize());
va009039 5:10bfc10afcc8 316 int result = token_out(ep, data+write_len, size2);
va009039 5:10bfc10afcc8 317 if (result < 0) {
va009039 5:10bfc10afcc8 318 if (LastStatus == NAK) {
va009039 5:10bfc10afcc8 319 if (n == 0) {
va009039 5:10bfc10afcc8 320 return -1;
va009039 5:10bfc10afcc8 321 }
va009039 5:10bfc10afcc8 322 break;
va009039 5:10bfc10afcc8 323 }
va009039 5:10bfc10afcc8 324 USB_DBG("token_out result=%d %02x", result, LastStatus);
va009039 5:10bfc10afcc8 325 return result;
va009039 5:10bfc10afcc8 326 }
va009039 5:10bfc10afcc8 327 write_len += result;
va009039 5:10bfc10afcc8 328 if (result < ep->getSize()) {
va009039 5:10bfc10afcc8 329 break;
va009039 5:10bfc10afcc8 330 }
va009039 5:10bfc10afcc8 331 }
va009039 5:10bfc10afcc8 332 return write_len;
va009039 5:10bfc10afcc8 333 }
va009039 5:10bfc10afcc8 334
va009039 5:10bfc10afcc8 335 int USBHost::IsochronousRead(USBEndpoint* ep, uint8_t* data, int size) {
va009039 5:10bfc10afcc8 336 setAddr(dev_addr);
va009039 5:10bfc10afcc8 337 return token_iso_in(ep, data, size);
va009039 5:10bfc10afcc8 338 }
va009039 5:10bfc10afcc8 339