Zoltan Hudak / UsbHostMAX3421E

Dependents:   UsbHostMAX3421E_Hello

Committer:
hudakz
Date:
Sun Jul 12 20:39:26 2020 +0000
Revision:
0:84353c479782
Child:
1:2263e77400e9
MAX3421E-based USB Host Shield Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:84353c479782 1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
hudakz 0:84353c479782 2
hudakz 0:84353c479782 3 This software may be distributed and modified under the terms of the GNU
hudakz 0:84353c479782 4 General Public License version 2 (GPL2) as published by the Free Software
hudakz 0:84353c479782 5 Foundation and appearing in the file GPL2.TXT included in the packaging of
hudakz 0:84353c479782 6 this file. Please note that GPL2 Section 2[b] requires that all works based
hudakz 0:84353c479782 7 on this software must also be made publicly available under the terms of
hudakz 0:84353c479782 8 the GPL2 ("Copyleft").
hudakz 0:84353c479782 9
hudakz 0:84353c479782 10 Contact information
hudakz 0:84353c479782 11 -------------------
hudakz 0:84353c479782 12
hudakz 0:84353c479782 13 Circuits At Home, LTD
hudakz 0:84353c479782 14 Web : http://www.circuitsathome.com
hudakz 0:84353c479782 15 e-mail : support@circuitsathome.com
hudakz 0:84353c479782 16 */
hudakz 0:84353c479782 17 #include "usbhub.h"
hudakz 0:84353c479782 18
hudakz 0:84353c479782 19 bool USBHub::bResetInitiated = false;
hudakz 0:84353c479782 20
hudakz 0:84353c479782 21 USBHub::USBHub(USB *p) :
hudakz 0:84353c479782 22 pUsb(p),
hudakz 0:84353c479782 23 bAddress(0),
hudakz 0:84353c479782 24 bNbrPorts(0),
hudakz 0:84353c479782 25 //bInitState(0),
hudakz 0:84353c479782 26 qNextPollTime(0),
hudakz 0:84353c479782 27 bPollEnable(false) {
hudakz 0:84353c479782 28 epInfo[0].epAddr = 0;
hudakz 0:84353c479782 29 epInfo[0].maxPktSize = 8;
hudakz 0:84353c479782 30 epInfo[0].bmSndToggle = 0;
hudakz 0:84353c479782 31 epInfo[0].bmRcvToggle = 0;
hudakz 0:84353c479782 32 epInfo[0].bmNakPower = USB_NAK_MAX_POWER;
hudakz 0:84353c479782 33
hudakz 0:84353c479782 34 epInfo[1].epAddr = 1;
hudakz 0:84353c479782 35 epInfo[1].maxPktSize = 8; //kludge
hudakz 0:84353c479782 36 epInfo[1].bmSndToggle = 0;
hudakz 0:84353c479782 37 epInfo[1].bmRcvToggle = 0;
hudakz 0:84353c479782 38 epInfo[1].bmNakPower = USB_NAK_NOWAIT;
hudakz 0:84353c479782 39
hudakz 0:84353c479782 40 if(pUsb)
hudakz 0:84353c479782 41 pUsb->RegisterDeviceClass(this);
hudakz 0:84353c479782 42 }
hudakz 0:84353c479782 43
hudakz 0:84353c479782 44 uint8_t USBHub::Init(uint8_t parent, uint8_t port, bool lowspeed) {
hudakz 0:84353c479782 45 uint8_t buf[32];
hudakz 0:84353c479782 46 USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
hudakz 0:84353c479782 47 HubDescriptor* hd = reinterpret_cast<HubDescriptor*>(buf);
hudakz 0:84353c479782 48 USB_CONFIGURATION_DESCRIPTOR * ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR*>(buf);
hudakz 0:84353c479782 49 uint8_t rcode;
hudakz 0:84353c479782 50 UsbDevice *p = NULL;
hudakz 0:84353c479782 51 EpInfo *oldep_ptr = NULL;
hudakz 0:84353c479782 52 uint8_t len = 0;
hudakz 0:84353c479782 53 uint16_t cd_len = 0;
hudakz 0:84353c479782 54
hudakz 0:84353c479782 55 //USBTRACE("\r\nHub Init Start ");
hudakz 0:84353c479782 56 //D_PrintHex<uint8_t > (bInitState, 0x80);
hudakz 0:84353c479782 57
hudakz 0:84353c479782 58 AddressPool &addrPool = pUsb->GetAddressPool();
hudakz 0:84353c479782 59
hudakz 0:84353c479782 60 //switch (bInitState) {
hudakz 0:84353c479782 61 // case 0:
hudakz 0:84353c479782 62 if(bAddress)
hudakz 0:84353c479782 63 return USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE;
hudakz 0:84353c479782 64
hudakz 0:84353c479782 65 // Get pointer to pseudo device with address 0 assigned
hudakz 0:84353c479782 66 p = addrPool.GetUsbDevicePtr(0);
hudakz 0:84353c479782 67
hudakz 0:84353c479782 68 if(!p)
hudakz 0:84353c479782 69 return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
hudakz 0:84353c479782 70
hudakz 0:84353c479782 71 if(!p->epinfo)
hudakz 0:84353c479782 72 return USB_ERROR_EPINFO_IS_NULL;
hudakz 0:84353c479782 73
hudakz 0:84353c479782 74 // Save old pointer to EP_RECORD of address 0
hudakz 0:84353c479782 75 oldep_ptr = p->epinfo;
hudakz 0:84353c479782 76
hudakz 0:84353c479782 77 // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
hudakz 0:84353c479782 78 p->epinfo = epInfo;
hudakz 0:84353c479782 79
hudakz 0:84353c479782 80 p->lowspeed = lowspeed;
hudakz 0:84353c479782 81
hudakz 0:84353c479782 82 // Get device descriptor
hudakz 0:84353c479782 83 rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
hudakz 0:84353c479782 84
hudakz 0:84353c479782 85 p->lowspeed = false;
hudakz 0:84353c479782 86
hudakz 0:84353c479782 87 if(!rcode)
hudakz 0:84353c479782 88 len = (buf[0] > 32) ? 32 : buf[0];
hudakz 0:84353c479782 89
hudakz 0:84353c479782 90 if(rcode) {
hudakz 0:84353c479782 91 // Restore p->epinfo
hudakz 0:84353c479782 92 p->epinfo = oldep_ptr;
hudakz 0:84353c479782 93 return rcode;
hudakz 0:84353c479782 94 }
hudakz 0:84353c479782 95
hudakz 0:84353c479782 96 // Extract device class from device descriptor
hudakz 0:84353c479782 97 // If device class is not a hub return
hudakz 0:84353c479782 98 if(udd->bDeviceClass != 0x09)
hudakz 0:84353c479782 99 return USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED;
hudakz 0:84353c479782 100
hudakz 0:84353c479782 101 // Allocate new address according to device class
hudakz 0:84353c479782 102 bAddress = addrPool.AllocAddress(parent, (udd->bDeviceClass == 0x09) ? true : false, port);
hudakz 0:84353c479782 103
hudakz 0:84353c479782 104 if(!bAddress)
hudakz 0:84353c479782 105 return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL;
hudakz 0:84353c479782 106
hudakz 0:84353c479782 107 // Extract Max Packet Size from the device descriptor
hudakz 0:84353c479782 108 epInfo[0].maxPktSize = udd->bMaxPacketSize0;
hudakz 0:84353c479782 109
hudakz 0:84353c479782 110 // Assign new address to the device
hudakz 0:84353c479782 111 rcode = pUsb->setAddr(0, 0, bAddress);
hudakz 0:84353c479782 112
hudakz 0:84353c479782 113 if(rcode) {
hudakz 0:84353c479782 114 // Restore p->epinfo
hudakz 0:84353c479782 115 p->epinfo = oldep_ptr;
hudakz 0:84353c479782 116 addrPool.FreeAddress(bAddress);
hudakz 0:84353c479782 117 bAddress = 0;
hudakz 0:84353c479782 118 return rcode;
hudakz 0:84353c479782 119 }
hudakz 0:84353c479782 120
hudakz 0:84353c479782 121 //USBTRACE2("\r\nHub address: ", bAddress );
hudakz 0:84353c479782 122
hudakz 0:84353c479782 123 // Restore p->epinfo
hudakz 0:84353c479782 124 p->epinfo = oldep_ptr;
hudakz 0:84353c479782 125
hudakz 0:84353c479782 126 if(len)
hudakz 0:84353c479782 127 rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
hudakz 0:84353c479782 128
hudakz 0:84353c479782 129 if(rcode)
hudakz 0:84353c479782 130 goto FailGetDevDescr;
hudakz 0:84353c479782 131
hudakz 0:84353c479782 132 // Assign epInfo to epinfo pointer
hudakz 0:84353c479782 133 rcode = pUsb->setEpInfoEntry(bAddress, 2, epInfo);
hudakz 0:84353c479782 134
hudakz 0:84353c479782 135 if(rcode)
hudakz 0:84353c479782 136 goto FailSetDevTblEntry;
hudakz 0:84353c479782 137
hudakz 0:84353c479782 138 // bInitState = 1;
hudakz 0:84353c479782 139
hudakz 0:84353c479782 140 // case 1:
hudakz 0:84353c479782 141 // Get hub descriptor
hudakz 0:84353c479782 142 rcode = GetHubDescriptor(0, 8, buf);
hudakz 0:84353c479782 143
hudakz 0:84353c479782 144 if(rcode)
hudakz 0:84353c479782 145 goto FailGetHubDescr;
hudakz 0:84353c479782 146
hudakz 0:84353c479782 147 // Save number of ports for future use
hudakz 0:84353c479782 148 bNbrPorts = hd->bNbrPorts;
hudakz 0:84353c479782 149
hudakz 0:84353c479782 150 // bInitState = 2;
hudakz 0:84353c479782 151
hudakz 0:84353c479782 152 // case 2:
hudakz 0:84353c479782 153 // Read configuration Descriptor in Order To Obtain Proper Configuration Value
hudakz 0:84353c479782 154 rcode = pUsb->getConfDescr(bAddress, 0, 8, 0, buf);
hudakz 0:84353c479782 155
hudakz 0:84353c479782 156 if(!rcode) {
hudakz 0:84353c479782 157 cd_len = ucd->wTotalLength;
hudakz 0:84353c479782 158 rcode = pUsb->getConfDescr(bAddress, 0, cd_len, 0, buf);
hudakz 0:84353c479782 159 }
hudakz 0:84353c479782 160 if(rcode)
hudakz 0:84353c479782 161 goto FailGetConfDescr;
hudakz 0:84353c479782 162
hudakz 0:84353c479782 163 // The following code is of no practical use in real life applications.
hudakz 0:84353c479782 164 // It only intended for the usb protocol sniffer to properly parse hub-class requests.
hudakz 0:84353c479782 165 {
hudakz 0:84353c479782 166 uint8_t buf2[24];
hudakz 0:84353c479782 167
hudakz 0:84353c479782 168 rcode = pUsb->getConfDescr(bAddress, 0, buf[0], 0, buf2);
hudakz 0:84353c479782 169
hudakz 0:84353c479782 170 if(rcode)
hudakz 0:84353c479782 171 goto FailGetConfDescr;
hudakz 0:84353c479782 172 }
hudakz 0:84353c479782 173
hudakz 0:84353c479782 174 // Set Configuration Value
hudakz 0:84353c479782 175 rcode = pUsb->setConf(bAddress, 0, buf[5]);
hudakz 0:84353c479782 176
hudakz 0:84353c479782 177 if(rcode)
hudakz 0:84353c479782 178 goto FailSetConfDescr;
hudakz 0:84353c479782 179
hudakz 0:84353c479782 180 // bInitState = 3;
hudakz 0:84353c479782 181
hudakz 0:84353c479782 182 // case 3:
hudakz 0:84353c479782 183 // Power on all ports
hudakz 0:84353c479782 184 for(uint8_t j = 1; j <= bNbrPorts; j++)
hudakz 0:84353c479782 185 SetPortFeature(HUB_FEATURE_PORT_POWER, j, 0); //HubPortPowerOn(j);
hudakz 0:84353c479782 186
hudakz 0:84353c479782 187 pUsb->SetHubPreMask();
hudakz 0:84353c479782 188 bPollEnable = true;
hudakz 0:84353c479782 189 // bInitState = 0;
hudakz 0:84353c479782 190 //}
hudakz 0:84353c479782 191 //bInitState = 0;
hudakz 0:84353c479782 192 //USBTRACE("...OK\r\n");
hudakz 0:84353c479782 193 return 0;
hudakz 0:84353c479782 194
hudakz 0:84353c479782 195 // Oleg, No debugging?? -- xxxajk
hudakz 0:84353c479782 196 FailGetDevDescr:
hudakz 0:84353c479782 197 goto Fail;
hudakz 0:84353c479782 198
hudakz 0:84353c479782 199 FailSetDevTblEntry:
hudakz 0:84353c479782 200 goto Fail;
hudakz 0:84353c479782 201
hudakz 0:84353c479782 202 FailGetHubDescr:
hudakz 0:84353c479782 203 goto Fail;
hudakz 0:84353c479782 204
hudakz 0:84353c479782 205 FailGetConfDescr:
hudakz 0:84353c479782 206 goto Fail;
hudakz 0:84353c479782 207
hudakz 0:84353c479782 208 FailSetConfDescr:
hudakz 0:84353c479782 209 goto Fail;
hudakz 0:84353c479782 210
hudakz 0:84353c479782 211 Fail:
hudakz 0:84353c479782 212 USBTRACE("...FAIL\r\n");
hudakz 0:84353c479782 213 return rcode;
hudakz 0:84353c479782 214 }
hudakz 0:84353c479782 215
hudakz 0:84353c479782 216 uint8_t USBHub::Release() {
hudakz 0:84353c479782 217 pUsb->GetAddressPool().FreeAddress(bAddress);
hudakz 0:84353c479782 218
hudakz 0:84353c479782 219 if(bAddress == 0x41)
hudakz 0:84353c479782 220 pUsb->SetHubPreMask();
hudakz 0:84353c479782 221
hudakz 0:84353c479782 222 bAddress = 0;
hudakz 0:84353c479782 223 bNbrPorts = 0;
hudakz 0:84353c479782 224 qNextPollTime = 0;
hudakz 0:84353c479782 225 bPollEnable = false;
hudakz 0:84353c479782 226 return 0;
hudakz 0:84353c479782 227 }
hudakz 0:84353c479782 228
hudakz 0:84353c479782 229 uint8_t USBHub::Poll() {
hudakz 0:84353c479782 230 uint8_t rcode = 0;
hudakz 0:84353c479782 231
hudakz 0:84353c479782 232 if(!bPollEnable)
hudakz 0:84353c479782 233 return 0;
hudakz 0:84353c479782 234
hudakz 0:84353c479782 235 if(((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L)) {
hudakz 0:84353c479782 236 rcode = CheckHubStatus();
hudakz 0:84353c479782 237 qNextPollTime = (uint32_t)millis() + 100;
hudakz 0:84353c479782 238 }
hudakz 0:84353c479782 239 return rcode;
hudakz 0:84353c479782 240 }
hudakz 0:84353c479782 241
hudakz 0:84353c479782 242 uint8_t USBHub::CheckHubStatus() {
hudakz 0:84353c479782 243 uint8_t rcode;
hudakz 0:84353c479782 244 uint8_t buf[8];
hudakz 0:84353c479782 245 uint16_t read = 1;
hudakz 0:84353c479782 246
hudakz 0:84353c479782 247 rcode = pUsb->inTransfer(bAddress, 1, &read, buf);
hudakz 0:84353c479782 248
hudakz 0:84353c479782 249 if(rcode)
hudakz 0:84353c479782 250 return rcode;
hudakz 0:84353c479782 251
hudakz 0:84353c479782 252 //if (buf[0] & 0x01) // Hub Status Change
hudakz 0:84353c479782 253 //{
hudakz 0:84353c479782 254 // pUsb->PrintHubStatus(addr);
hudakz 0:84353c479782 255 // rcode = GetHubStatus(1, 0, 1, 4, buf);
hudakz 0:84353c479782 256 // if (rcode)
hudakz 0:84353c479782 257 // {
hudakz 0:84353c479782 258 // printf("GetHubStatus Error");
hudakz 0:84353c479782 259 // USB_HOST_SERIAL.println(rcode, HEX);
hudakz 0:84353c479782 260 // return rcode;
hudakz 0:84353c479782 261 // }
hudakz 0:84353c479782 262 //}
hudakz 0:84353c479782 263 for(uint8_t port = 1, mask = 0x02; port < 8; mask <<= 1, port++) {
hudakz 0:84353c479782 264 if(buf[0] & mask) {
hudakz 0:84353c479782 265 HubEvent evt;
hudakz 0:84353c479782 266 evt.bmEvent = 0;
hudakz 0:84353c479782 267
hudakz 0:84353c479782 268 rcode = GetPortStatus(port, 4, evt.evtBuff);
hudakz 0:84353c479782 269
hudakz 0:84353c479782 270 if(rcode)
hudakz 0:84353c479782 271 continue;
hudakz 0:84353c479782 272
hudakz 0:84353c479782 273 rcode = PortStatusChange(port, evt);
hudakz 0:84353c479782 274
hudakz 0:84353c479782 275 if(rcode == HUB_ERROR_PORT_HAS_BEEN_RESET)
hudakz 0:84353c479782 276 return 0;
hudakz 0:84353c479782 277
hudakz 0:84353c479782 278 if(rcode)
hudakz 0:84353c479782 279 return rcode;
hudakz 0:84353c479782 280 }
hudakz 0:84353c479782 281 } // for
hudakz 0:84353c479782 282
hudakz 0:84353c479782 283 for(uint8_t port = 1; port <= bNbrPorts; port++) {
hudakz 0:84353c479782 284 HubEvent evt;
hudakz 0:84353c479782 285 evt.bmEvent = 0;
hudakz 0:84353c479782 286
hudakz 0:84353c479782 287 rcode = GetPortStatus(port, 4, evt.evtBuff);
hudakz 0:84353c479782 288
hudakz 0:84353c479782 289 if(rcode)
hudakz 0:84353c479782 290 continue;
hudakz 0:84353c479782 291
hudakz 0:84353c479782 292 if((evt.bmStatus & bmHUB_PORT_STATE_CHECK_DISABLED) != bmHUB_PORT_STATE_DISABLED)
hudakz 0:84353c479782 293 continue;
hudakz 0:84353c479782 294
hudakz 0:84353c479782 295 // Emulate connection event for the port
hudakz 0:84353c479782 296 evt.bmChange |= bmHUB_PORT_STATUS_C_PORT_CONNECTION;
hudakz 0:84353c479782 297
hudakz 0:84353c479782 298 rcode = PortStatusChange(port, evt);
hudakz 0:84353c479782 299
hudakz 0:84353c479782 300 if(rcode == HUB_ERROR_PORT_HAS_BEEN_RESET)
hudakz 0:84353c479782 301 return 0;
hudakz 0:84353c479782 302
hudakz 0:84353c479782 303 if(rcode)
hudakz 0:84353c479782 304 return rcode;
hudakz 0:84353c479782 305 } // for
hudakz 0:84353c479782 306 return 0;
hudakz 0:84353c479782 307 }
hudakz 0:84353c479782 308
hudakz 0:84353c479782 309 void USBHub::ResetHubPort(uint8_t port) {
hudakz 0:84353c479782 310 HubEvent evt;
hudakz 0:84353c479782 311 evt.bmEvent = 0;
hudakz 0:84353c479782 312 uint8_t rcode;
hudakz 0:84353c479782 313
hudakz 0:84353c479782 314 ClearPortFeature(HUB_FEATURE_C_PORT_ENABLE, port, 0);
hudakz 0:84353c479782 315 ClearPortFeature(HUB_FEATURE_C_PORT_CONNECTION, port, 0);
hudakz 0:84353c479782 316 SetPortFeature(HUB_FEATURE_PORT_RESET, port, 0);
hudakz 0:84353c479782 317
hudakz 0:84353c479782 318
hudakz 0:84353c479782 319 for(int i = 0; i < 3; i++) {
hudakz 0:84353c479782 320 rcode = GetPortStatus(port, 4, evt.evtBuff);
hudakz 0:84353c479782 321 if(rcode) break; // Some kind of error, bail.
hudakz 0:84353c479782 322 if(evt.bmEvent == bmHUB_PORT_EVENT_RESET_COMPLETE || evt.bmEvent == bmHUB_PORT_EVENT_LS_RESET_COMPLETE) {
hudakz 0:84353c479782 323 break;
hudakz 0:84353c479782 324 }
hudakz 0:84353c479782 325 wait_ms(100); // simulate polling.
hudakz 0:84353c479782 326 }
hudakz 0:84353c479782 327 ClearPortFeature(HUB_FEATURE_C_PORT_RESET, port, 0);
hudakz 0:84353c479782 328 ClearPortFeature(HUB_FEATURE_C_PORT_CONNECTION, port, 0);
hudakz 0:84353c479782 329 wait_ms(20);
hudakz 0:84353c479782 330 }
hudakz 0:84353c479782 331
hudakz 0:84353c479782 332 uint8_t USBHub::PortStatusChange(uint8_t port, HubEvent &evt) {
hudakz 0:84353c479782 333 switch(evt.bmEvent) {
hudakz 0:84353c479782 334 // Device connected event
hudakz 0:84353c479782 335 case bmHUB_PORT_EVENT_CONNECT:
hudakz 0:84353c479782 336 case bmHUB_PORT_EVENT_LS_CONNECT:
hudakz 0:84353c479782 337 if(bResetInitiated)
hudakz 0:84353c479782 338 return 0;
hudakz 0:84353c479782 339
hudakz 0:84353c479782 340 ClearPortFeature(HUB_FEATURE_C_PORT_ENABLE, port, 0);
hudakz 0:84353c479782 341 ClearPortFeature(HUB_FEATURE_C_PORT_CONNECTION, port, 0);
hudakz 0:84353c479782 342 SetPortFeature(HUB_FEATURE_PORT_RESET, port, 0);
hudakz 0:84353c479782 343 bResetInitiated = true;
hudakz 0:84353c479782 344 return HUB_ERROR_PORT_HAS_BEEN_RESET;
hudakz 0:84353c479782 345
hudakz 0:84353c479782 346 // Device disconnected event
hudakz 0:84353c479782 347 case bmHUB_PORT_EVENT_DISCONNECT:
hudakz 0:84353c479782 348 ClearPortFeature(HUB_FEATURE_C_PORT_ENABLE, port, 0);
hudakz 0:84353c479782 349 ClearPortFeature(HUB_FEATURE_C_PORT_CONNECTION, port, 0);
hudakz 0:84353c479782 350 bResetInitiated = false;
hudakz 0:84353c479782 351
hudakz 0:84353c479782 352 UsbDeviceAddress a;
hudakz 0:84353c479782 353 a.devAddress = 0;
hudakz 0:84353c479782 354 a.bmHub = 0;
hudakz 0:84353c479782 355 a.bmParent = bAddress;
hudakz 0:84353c479782 356 a.bmAddress = port;
hudakz 0:84353c479782 357 pUsb->releaseDevice(a.devAddress);
hudakz 0:84353c479782 358 return 0;
hudakz 0:84353c479782 359
hudakz 0:84353c479782 360 // Reset complete event
hudakz 0:84353c479782 361 case bmHUB_PORT_EVENT_RESET_COMPLETE:
hudakz 0:84353c479782 362 case bmHUB_PORT_EVENT_LS_RESET_COMPLETE:
hudakz 0:84353c479782 363 ClearPortFeature(HUB_FEATURE_C_PORT_RESET, port, 0);
hudakz 0:84353c479782 364 ClearPortFeature(HUB_FEATURE_C_PORT_CONNECTION, port, 0);
hudakz 0:84353c479782 365
hudakz 0:84353c479782 366 wait_ms(20);
hudakz 0:84353c479782 367
hudakz 0:84353c479782 368 a.devAddress = bAddress;
hudakz 0:84353c479782 369
hudakz 0:84353c479782 370 pUsb->configuring(a.bmAddress, port, (evt.bmStatus & bmHUB_PORT_STATUS_PORT_LOW_SPEED));
hudakz 0:84353c479782 371 bResetInitiated = false;
hudakz 0:84353c479782 372 break;
hudakz 0:84353c479782 373
hudakz 0:84353c479782 374 } // switch (evt.bmEvent)
hudakz 0:84353c479782 375 return 0;
hudakz 0:84353c479782 376 }
hudakz 0:84353c479782 377
hudakz 0:84353c479782 378 void PrintHubPortStatus(USBHub *hubptr, uint8_t addr __attribute__((unused)), uint8_t port, bool print_changes) {
hudakz 0:84353c479782 379 uint8_t rcode = 0;
hudakz 0:84353c479782 380 HubEvent evt;
hudakz 0:84353c479782 381
hudakz 0:84353c479782 382 rcode = hubptr->GetPortStatus(port, 4, evt.evtBuff);
hudakz 0:84353c479782 383
hudakz 0:84353c479782 384 if(rcode) {
hudakz 0:84353c479782 385 printf("ERROR!\r\n");
hudakz 0:84353c479782 386 return;
hudakz 0:84353c479782 387 }
hudakz 0:84353c479782 388 printf("\r\nPort %d\r\n", port);
hudakz 0:84353c479782 389
hudakz 0:84353c479782 390 printf("Status\r\n");
hudakz 0:84353c479782 391 printf("CONNECTION:\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_CONNECTION) > 0);
hudakz 0:84353c479782 392 printf("ENABLE:\t\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_ENABLE) > 0);
hudakz 0:84353c479782 393 printf("SUSPEND:\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_SUSPEND) > 0);
hudakz 0:84353c479782 394 printf("OVER_CURRENT:\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_OVER_CURRENT) > 0);
hudakz 0:84353c479782 395 printf("RESET:\t\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_RESET) > 0);
hudakz 0:84353c479782 396 printf("POWER:\t\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_POWER) > 0);
hudakz 0:84353c479782 397 printf("LOW_SPEED:\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_LOW_SPEED) > 0);
hudakz 0:84353c479782 398 printf("HIGH_SPEED:\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_HIGH_SPEED) > 0);
hudakz 0:84353c479782 399 printf("TEST:\t\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_TEST) > 0);
hudakz 0:84353c479782 400 printf("INDICATOR:\t%d\r\n", (evt.bmStatus & bmHUB_PORT_STATUS_PORT_INDICATOR) > 0);
hudakz 0:84353c479782 401
hudakz 0:84353c479782 402 if(!print_changes)
hudakz 0:84353c479782 403 return;
hudakz 0:84353c479782 404
hudakz 0:84353c479782 405 printf("\r\nChange\r\n");
hudakz 0:84353c479782 406 printf("CONNECTION:\t%d\r\n", (evt.bmChange & bmHUB_PORT_STATUS_C_PORT_CONNECTION) > 0);
hudakz 0:84353c479782 407 printf("ENABLE:\t\t%d\r\n", (evt.bmChange & bmHUB_PORT_STATUS_C_PORT_ENABLE) > 0);
hudakz 0:84353c479782 408 printf("SUSPEND:\t%d\r\n", (evt.bmChange & bmHUB_PORT_STATUS_C_PORT_SUSPEND) > 0);
hudakz 0:84353c479782 409 printf("OVER_CURRENT:\t%d\r\n", (evt.bmChange & bmHUB_PORT_STATUS_C_PORT_OVER_CURRENT) > 0);
hudakz 0:84353c479782 410 printf("RESET:\t\t%d\r\n", (evt.bmChange & bmHUB_PORT_STATUS_C_PORT_RESET) > 0);
hudakz 0:84353c479782 411 }