Junichi Katsu / Mbed 2 deprecated BLEControl

Dependencies:   FatFileSystem TB6612FNG2 mbed

Committer:
mbed_Cookbook_SE
Date:
Mon Nov 30 09:32:15 2015 +0000
Revision:
0:de03cbbcd0ff
??

Who changed what in which revision?

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