Webcam Server.

Dependencies:   uvchost FatFileSystem mbed HTTPServer NetServicesMin

Committer:
va009039
Date:
Wed Jun 06 11:47:06 2012 +0000
Revision:
0:2b4ea8a138e5

        

Who changed what in which revision?

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