UVC host library

Dependents:   LifeCam WebcamServer

Committer:
va009039
Date:
Wed Aug 15 13:52:53 2012 +0000
Revision:
3:3eb41d749f9a
Parent:
0:b0f04c137829
add USB_USE_MALLOC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:b0f04c137829 1 #include "UsbDevice.h"
va009039 0:b0f04c137829 2 //#define __DEBUG
va009039 0:b0f04c137829 3 #include "mydbg.h"
va009039 0:b0f04c137829 4 #include "Utils.h"
va009039 0:b0f04c137829 5
va009039 0:b0f04c137829 6 #define PORT_RESET 4
va009039 0:b0f04c137829 7 #define PORT_POWER 8
va009039 0:b0f04c137829 8 #define C_PORT_CONNECTION 16
va009039 0:b0f04c137829 9 #define C_PORT_RESET 20
va009039 0:b0f04c137829 10
va009039 0:b0f04c137829 11 UsbErr UsbDevice::hub_init()
va009039 0:b0f04c137829 12 {
va009039 0:b0f04c137829 13 UsbErr rc;
va009039 0:b0f04c137829 14 uint8_t buf[9];
va009039 0:b0f04c137829 15 rc = controlReceive(
va009039 0:b0f04c137829 16 USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE, // 0xa0
va009039 0:b0f04c137829 17 GET_DESCRIPTOR,
va009039 0:b0f04c137829 18 (USB_DESCRIPTOR_TYPE_HUB << 8), 0, buf, sizeof(buf));
va009039 0:b0f04c137829 19 DBG_ASSERT(rc == USBERR_OK);
va009039 0:b0f04c137829 20 DBG_ASSERT(buf[0] == 9);
va009039 0:b0f04c137829 21 DBG_ASSERT(buf[1] == 0x29);
va009039 0:b0f04c137829 22 DBG_BYTES("HUB DESCRIPTOR", buf, sizeof(buf));
va009039 0:b0f04c137829 23
va009039 0:b0f04c137829 24 m_hub_ports = buf[2];
va009039 0:b0f04c137829 25 VERBOSE("NbrPorts: %d\n", m_hub_ports);
va009039 0:b0f04c137829 26 int PwrOn2PwrGood = buf[5];
va009039 0:b0f04c137829 27 VERBOSE("PwrOn2PwrGood: %d %d ms\n", PwrOn2PwrGood, PwrOn2PwrGood*2);
va009039 0:b0f04c137829 28 VERBOSE("HubContrCurrent: %d\n", buf[6]);
va009039 0:b0f04c137829 29
va009039 0:b0f04c137829 30 rc = setConfiguration(1);
va009039 0:b0f04c137829 31 DBG_ASSERT(rc == USBERR_OK);
va009039 0:b0f04c137829 32
va009039 0:b0f04c137829 33 uint8_t status[4];
va009039 0:b0f04c137829 34 rc = controlReceive(
va009039 0:b0f04c137829 35 USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE, // 0xa0
va009039 0:b0f04c137829 36 GET_STATUS,
va009039 0:b0f04c137829 37 0, 0, status, sizeof(status));
va009039 0:b0f04c137829 38 DBG_ASSERT(rc == USBERR_OK);
va009039 0:b0f04c137829 39 DBG_BYTES("HUB STATUS", status, sizeof(status));
va009039 0:b0f04c137829 40
va009039 0:b0f04c137829 41 for(int i = 1; i <= m_hub_ports; i++) {
va009039 0:b0f04c137829 42 rc = SetPortFeature(PORT_POWER, i);
va009039 0:b0f04c137829 43 DBG("PORT_POWER port=%d rc=%d\n", i, rc);
va009039 0:b0f04c137829 44 DBG_ASSERT(rc == USBERR_OK);
va009039 0:b0f04c137829 45 if (rc != USBERR_OK) {
va009039 0:b0f04c137829 46 return rc;
va009039 0:b0f04c137829 47 }
va009039 0:b0f04c137829 48 }
va009039 0:b0f04c137829 49 wait_ms(PwrOn2PwrGood*2);
va009039 0:b0f04c137829 50
va009039 0:b0f04c137829 51 m_enumerated = true;
va009039 0:b0f04c137829 52 return USBERR_OK;
va009039 0:b0f04c137829 53 }
va009039 0:b0f04c137829 54
va009039 0:b0f04c137829 55 UsbErr UsbDevice::hub_poll()
va009039 0:b0f04c137829 56 {
va009039 0:b0f04c137829 57 DBG("%p m_hub=%d m_port=%d m_addr=%d\n", this, m_hub, m_port, m_addr);
va009039 0:b0f04c137829 58 // check status
va009039 0:b0f04c137829 59 for(int port = 1; port <= m_hub_ports; port++) {
va009039 0:b0f04c137829 60 uint32_t status;
va009039 0:b0f04c137829 61 UsbErr rc = GetPortStatus(port, &status);
va009039 0:b0f04c137829 62 DBG_ASSERT(rc == USBERR_OK);
va009039 0:b0f04c137829 63 DBG("port: %d status: %08X\n", port, status);
va009039 0:b0f04c137829 64 if (status & 0x010000) { // Connect Status Change, has changed
va009039 0:b0f04c137829 65 DBG_ASSERT(status & 0x000001);
va009039 0:b0f04c137829 66 ClearPortFeature(C_PORT_CONNECTION, port);
va009039 0:b0f04c137829 67 bool low_speed = false;
va009039 0:b0f04c137829 68 if (status & 0x0200) {
va009039 0:b0f04c137829 69 low_speed = true;
va009039 0:b0f04c137829 70 }
va009039 0:b0f04c137829 71 DBG_ASSERT(m_pMgr);
va009039 0:b0f04c137829 72 m_pMgr->onUsbDeviceConnected(m_addr, port, low_speed);
va009039 0:b0f04c137829 73 return USBERR_PROCESSING;
va009039 0:b0f04c137829 74 }
va009039 0:b0f04c137829 75 }
va009039 0:b0f04c137829 76 return USBERR_OK;
va009039 0:b0f04c137829 77 }
va009039 0:b0f04c137829 78
va009039 0:b0f04c137829 79 UsbErr UsbDevice::hub_PortReset(int port)
va009039 0:b0f04c137829 80 {
va009039 0:b0f04c137829 81 DBG("%p port=%d\n", this, port);
va009039 0:b0f04c137829 82 DBG_ASSERT(port >= 1);
va009039 0:b0f04c137829 83 SetPortReset(port);
va009039 0:b0f04c137829 84 // wait reset
va009039 0:b0f04c137829 85 for(int i = 0; i < 100; i++) {
va009039 0:b0f04c137829 86 uint32_t status;
va009039 0:b0f04c137829 87 UsbErr rc = GetPortStatus(port, &status);
va009039 0:b0f04c137829 88 DBG_ASSERT(rc == USBERR_OK);
va009039 0:b0f04c137829 89 DBG("RESET port: %d status: %08X\n", port, status);
va009039 0:b0f04c137829 90 if (status & 0x100000) { // Reset change , Reset complete
va009039 0:b0f04c137829 91 return USBERR_OK;
va009039 0:b0f04c137829 92 }
va009039 0:b0f04c137829 93 wait_ms(5);
va009039 0:b0f04c137829 94 }
va009039 0:b0f04c137829 95 return USBERR_ERROR;
va009039 0:b0f04c137829 96 }
va009039 0:b0f04c137829 97
va009039 0:b0f04c137829 98 UsbErr UsbDevice::SetPortFeature(int feature, int index)
va009039 0:b0f04c137829 99 {
va009039 0:b0f04c137829 100 //DBG("feature=%d index=%d\n", feature, index);
va009039 0:b0f04c137829 101 UsbErr rc;
va009039 0:b0f04c137829 102 rc = controlSend(
va009039 0:b0f04c137829 103 USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER,
va009039 0:b0f04c137829 104 SET_FEATURE, feature, index, 0, 0);
va009039 0:b0f04c137829 105 return rc;
va009039 0:b0f04c137829 106 }
va009039 0:b0f04c137829 107
va009039 0:b0f04c137829 108 UsbErr UsbDevice::ClearPortFeature(int feature, int index)
va009039 0:b0f04c137829 109 {
va009039 0:b0f04c137829 110 UsbErr rc;
va009039 0:b0f04c137829 111 rc = controlSend(
va009039 0:b0f04c137829 112 USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER,
va009039 0:b0f04c137829 113 CLEAR_FEATURE, feature, index, 0, 0);
va009039 0:b0f04c137829 114 return rc;
va009039 0:b0f04c137829 115 }
va009039 0:b0f04c137829 116
va009039 0:b0f04c137829 117 UsbErr UsbDevice::SetPortReset(int port)
va009039 0:b0f04c137829 118 {
va009039 0:b0f04c137829 119 //DBG("port=%d\n", port);
va009039 0:b0f04c137829 120 UsbErr rc = SetPortFeature(PORT_RESET, port);
va009039 0:b0f04c137829 121 DBG_ASSERT(rc == USBERR_OK);
va009039 0:b0f04c137829 122 return rc;
va009039 0:b0f04c137829 123 }
va009039 0:b0f04c137829 124
va009039 0:b0f04c137829 125 UsbErr UsbDevice::GetPortStatus(int port, uint8_t* buf, int size)
va009039 0:b0f04c137829 126 {
va009039 0:b0f04c137829 127 DBG_ASSERT(size == 4);
va009039 0:b0f04c137829 128 UsbErr rc;
va009039 0:b0f04c137829 129 rc = controlReceive(
va009039 0:b0f04c137829 130 USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER,
va009039 0:b0f04c137829 131 GET_STATUS, 0, port, buf, sizeof(buf));
va009039 0:b0f04c137829 132 return rc;
va009039 0:b0f04c137829 133 }
va009039 0:b0f04c137829 134
va009039 0:b0f04c137829 135 UsbErr UsbDevice::GetPortStatus(int port, uint32_t* status)
va009039 0:b0f04c137829 136 {
va009039 0:b0f04c137829 137 uint8_t buf[4];
va009039 0:b0f04c137829 138 UsbErr rc = GetPortStatus(port, buf, sizeof(buf));
va009039 0:b0f04c137829 139 *status = LE32(buf);
va009039 0:b0f04c137829 140 return rc;
va009039 0:b0f04c137829 141 }