abanum abanum / Mbed 2 deprecated nekosensya

Dependencies:   mbed Motorfader Servo WT2003M03

Committer:
abanum
Date:
Mon Jul 29 05:42:12 2019 +0000
Revision:
0:a30ec7d94c3a
first release.; It is in the process of creation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
abanum 0:a30ec7d94c3a 1 #include "USBHost.h"
abanum 0:a30ec7d94c3a 2
abanum 0:a30ec7d94c3a 3 #define PORT_CONNECTION 0
abanum 0:a30ec7d94c3a 4 #define PORT_ENABLE 1
abanum 0:a30ec7d94c3a 5 #define PORT_SUSPEND 2
abanum 0:a30ec7d94c3a 6 #define PORT_OVER_CURRENT 3
abanum 0:a30ec7d94c3a 7 #define PORT_RESET 4
abanum 0:a30ec7d94c3a 8 #define PORT_POWER 8
abanum 0:a30ec7d94c3a 9 #define PORT_LOW_SPEED 9
abanum 0:a30ec7d94c3a 10
abanum 0:a30ec7d94c3a 11 #define C_PORT_CONNECTION 16
abanum 0:a30ec7d94c3a 12 #define C_PORT_ENABLE 17
abanum 0:a30ec7d94c3a 13 #define C_PORT_SUSPEND 18
abanum 0:a30ec7d94c3a 14 #define C_PORT_OVER_CURRENT 19
abanum 0:a30ec7d94c3a 15 #define C_PORT_RESET 20
abanum 0:a30ec7d94c3a 16
abanum 0:a30ec7d94c3a 17 bool USBHost::Hub(USBDeviceConnected* dev) {
abanum 0:a30ec7d94c3a 18 USB_INFO("New HUB: VID:%04x PID:%04x [dev: %p]", dev->getVid(), dev->getPid(), dev);
abanum 0:a30ec7d94c3a 19 HubDescriptor hubdesc;
abanum 0:a30ec7d94c3a 20 // get HUB descriptor
abanum 0:a30ec7d94c3a 21 int rc = controlRead(dev,
abanum 0:a30ec7d94c3a 22 USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS,
abanum 0:a30ec7d94c3a 23 GET_DESCRIPTOR,
abanum 0:a30ec7d94c3a 24 0x29 << 8, 0, reinterpret_cast<uint8_t*>(&hubdesc),
abanum 0:a30ec7d94c3a 25 sizeof(HubDescriptor));
abanum 0:a30ec7d94c3a 26 USB_TEST_ASSERT(rc == USB_TYPE_OK);
abanum 0:a30ec7d94c3a 27 if (rc != USB_TYPE_OK) {
abanum 0:a30ec7d94c3a 28 return false;
abanum 0:a30ec7d94c3a 29 }
abanum 0:a30ec7d94c3a 30 USB_DBG_HEX((uint8_t*)&hubdesc, sizeof(hubdesc));
abanum 0:a30ec7d94c3a 31
abanum 0:a30ec7d94c3a 32 uint32_t status;
abanum 0:a30ec7d94c3a 33 rc = controlRead( dev,
abanum 0:a30ec7d94c3a 34 0xa0, 0, 0, 0, reinterpret_cast<uint8_t*>(&status), 4);
abanum 0:a30ec7d94c3a 35 USB_TEST_ASSERT(rc == USB_TYPE_OK);
abanum 0:a30ec7d94c3a 36 if (rc != USB_TYPE_OK) {
abanum 0:a30ec7d94c3a 37 return false;
abanum 0:a30ec7d94c3a 38 }
abanum 0:a30ec7d94c3a 39 USB_DBG("HUB STATUS: %08X\n", status);
abanum 0:a30ec7d94c3a 40
abanum 0:a30ec7d94c3a 41 for(int i = 1; i <= hubdesc.bNbrPorts; i++) {
abanum 0:a30ec7d94c3a 42 SetPortPower(dev, i); // power on
abanum 0:a30ec7d94c3a 43 wait_ms(hubdesc.bPwrOn2PwrGood*2);
abanum 0:a30ec7d94c3a 44 uint32_t status;
abanum 0:a30ec7d94c3a 45 GetPortStatus(dev, i, &status);
abanum 0:a30ec7d94c3a 46 USB_DBG("port: %d status: %08X\n", i, status);
abanum 0:a30ec7d94c3a 47 if (status & 0x010000) { // Connect Status Change, has changed
abanum 0:a30ec7d94c3a 48 USB_TEST_ASSERT(status & 0x000001);
abanum 0:a30ec7d94c3a 49 ClearPortFeature(dev, C_PORT_CONNECTION, i);
abanum 0:a30ec7d94c3a 50 int lowSpeed = 0;
abanum 0:a30ec7d94c3a 51 if (status & 0x0200) {
abanum 0:a30ec7d94c3a 52 lowSpeed = 1;
abanum 0:a30ec7d94c3a 53 }
abanum 0:a30ec7d94c3a 54 PortReset(dev, i);
abanum 0:a30ec7d94c3a 55 if (!addDevice(dev, i, lowSpeed)) {
abanum 0:a30ec7d94c3a 56 ClearPortPower(dev, i); // power off
abanum 0:a30ec7d94c3a 57 }
abanum 0:a30ec7d94c3a 58 } else {
abanum 0:a30ec7d94c3a 59 ClearPortPower(dev, i); // power off
abanum 0:a30ec7d94c3a 60 }
abanum 0:a30ec7d94c3a 61 }
abanum 0:a30ec7d94c3a 62 return false;
abanum 0:a30ec7d94c3a 63 }
abanum 0:a30ec7d94c3a 64
abanum 0:a30ec7d94c3a 65
abanum 0:a30ec7d94c3a 66 int USBHost::SetPortPower(USBDeviceConnected* dev, int port)
abanum 0:a30ec7d94c3a 67 {
abanum 0:a30ec7d94c3a 68 return SetPortFeature(dev, PORT_POWER, port);
abanum 0:a30ec7d94c3a 69 }
abanum 0:a30ec7d94c3a 70
abanum 0:a30ec7d94c3a 71 int USBHost::ClearPortPower(USBDeviceConnected* dev, int port)
abanum 0:a30ec7d94c3a 72 {
abanum 0:a30ec7d94c3a 73 return ClearPortFeature(dev, PORT_POWER, port);
abanum 0:a30ec7d94c3a 74 }
abanum 0:a30ec7d94c3a 75
abanum 0:a30ec7d94c3a 76 int USBHost::SetPortFeature(USBDeviceConnected* dev, int feature, int index)
abanum 0:a30ec7d94c3a 77 {
abanum 0:a30ec7d94c3a 78 return controlWrite(dev, 0x23, SET_FEATURE,feature,index,0,0);
abanum 0:a30ec7d94c3a 79 }
abanum 0:a30ec7d94c3a 80
abanum 0:a30ec7d94c3a 81 int USBHost::ClearPortFeature(USBDeviceConnected* dev, int feature, int index)
abanum 0:a30ec7d94c3a 82 {
abanum 0:a30ec7d94c3a 83 return controlWrite(dev, 0x23, CLEAR_FEATURE,feature,index,0,0);
abanum 0:a30ec7d94c3a 84 }
abanum 0:a30ec7d94c3a 85
abanum 0:a30ec7d94c3a 86 int USBHost::SetPortReset(USBDeviceConnected* dev, int port)
abanum 0:a30ec7d94c3a 87 {
abanum 0:a30ec7d94c3a 88 return SetPortFeature(dev, PORT_RESET, port);
abanum 0:a30ec7d94c3a 89 }
abanum 0:a30ec7d94c3a 90
abanum 0:a30ec7d94c3a 91 int USBHost::GetPortStatus(USBDeviceConnected* dev, int port, uint32_t* status)
abanum 0:a30ec7d94c3a 92 {
abanum 0:a30ec7d94c3a 93 return controlRead(dev, 0xa3, GET_STATUS, 0, port, (uint8_t*)status, 4);
abanum 0:a30ec7d94c3a 94 }
abanum 0:a30ec7d94c3a 95
abanum 0:a30ec7d94c3a 96 int USBHost::PortReset(USBDeviceConnected* dev, int port)
abanum 0:a30ec7d94c3a 97 {
abanum 0:a30ec7d94c3a 98 USB_DBG("%p port=%d\n", this, port);
abanum 0:a30ec7d94c3a 99 USB_TEST_ASSERT(port >= 1);
abanum 0:a30ec7d94c3a 100 SetPortReset(dev, port);
abanum 0:a30ec7d94c3a 101 // wait reset
abanum 0:a30ec7d94c3a 102 for(int i = 0; i < 100; i++) {
abanum 0:a30ec7d94c3a 103 uint32_t status;
abanum 0:a30ec7d94c3a 104 GetPortStatus(dev, port, &status);
abanum 0:a30ec7d94c3a 105 USB_DBG("RESET port: %d status: %08X\n", port, status);
abanum 0:a30ec7d94c3a 106 if (status & 0x100000) { // Reset change , Reset complete
abanum 0:a30ec7d94c3a 107 return USB_TYPE_OK;
abanum 0:a30ec7d94c3a 108 }
abanum 0:a30ec7d94c3a 109 wait_ms(5);
abanum 0:a30ec7d94c3a 110 }
abanum 0:a30ec7d94c3a 111 return USB_TYPE_ERROR;
abanum 0:a30ec7d94c3a 112 }
abanum 0:a30ec7d94c3a 113