BLE demo for mbed Ported RunningElectronics's SBDBT firmware for BLE. It can communicate with iOS
Dependencies: FatFileSystem mbed
Fork of BTstack by
Diff: usb/UsbDevice2.cpp
- Revision:
- 0:1ed23ab1345f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usb/UsbDevice2.cpp Tue Jun 26 14:27:45 2012 +0000 @@ -0,0 +1,133 @@ +#include "UsbDevice.h" +//#define __DEBUG +#include "mydbg.h" + +#define PORT_RESET 4 +#define PORT_POWER 8 +#define C_PORT_CONNECTION 16 +#define C_PORT_RESET 20 + +UsbErr UsbDevice::hub_init() +{ + UsbErr rc; + uint8_t buf[9]; + rc = controlReceive( + USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE, // 0xa0 + GET_DESCRIPTOR, + (USB_DESCRIPTOR_TYPE_HUB << 8), 0, buf, sizeof(buf)); + DBG_ASSERT(rc == USBERR_OK); + DBG_ASSERT(buf[0] == 9); + DBG_ASSERT(buf[1] == 0x29); + DBG_BYTES("HUB DESCRIPTOR", buf, sizeof(buf)); + + m_hub_ports = buf[2]; + VERBOSE("NbrPorts: %d\n", m_hub_ports); + int PwrOn2PwrGood = buf[5]; + VERBOSE("PwrOn2PwrGood: %d %d ms\n", PwrOn2PwrGood, PwrOn2PwrGood*2); + VERBOSE("HubContrCurrent: %d\n", buf[6]); + + rc = setConfiguration(1); + DBG_ASSERT(rc == USBERR_OK); + + uint8_t status[4]; + rc = controlReceive( + USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE, // 0xa0 + GET_STATUS, + 0, 0, status, sizeof(status)); + DBG_ASSERT(rc == USBERR_OK); + DBG_BYTES("HUB STATUS", status, sizeof(status)); + + for(int i = 1; i <= m_hub_ports; i++) { + rc = SetPortFeature(PORT_POWER, i); + DBG("PORT_POWER port=%d rc=%d\n", i, rc); + DBG_ASSERT(rc == USBERR_OK); + if (rc != USBERR_OK) { + return rc; + } + } + wait_ms(PwrOn2PwrGood*2); + + m_enumerated = true; + return USBERR_OK; +} + +UsbErr UsbDevice::hub_poll() +{ + DBG("%p m_hub=%d m_port=%d m_addr=%d\n", this, m_hub, m_port, m_addr); + // check status + for(int port = 1; port <= m_hub_ports; port++) { + uint8_t status[4]; + UsbErr rc = GetPortStatus(port, status, sizeof(status)); + DBG_ASSERT(rc == USBERR_OK); + DBG("port=%d\n", port); + DBG_BYTES("STATUS", status, sizeof(status)); + if (status[2] & 0x01) { // Connect Status Change, has changed + DBG_ASSERT(status[0] & 0x01); + ClearPortFeature(C_PORT_CONNECTION, port); + DBG_ASSERT(m_pMgr); + m_pMgr->onUsbDeviceConnected(m_addr, port); + return USBERR_PROCESSING; + } + } + return USBERR_OK; +} + +UsbErr UsbDevice::hub_PortReset(int port) +{ + DBG("%p port=%d\n", this, port); + DBG_ASSERT(port >= 1); + SetPortReset(port); + // wait reset + for(int i = 0; i < 100; i++) { + uint8_t status[4]; + UsbErr rc = GetPortStatus(port, status, sizeof(status)); + DBG_ASSERT(rc == USBERR_OK); + DBG_BYTES("RESET", status, sizeof(status)); + if (status[2] & 0x10) { // Reset change , Reset complete + return USBERR_OK; + } + wait_ms(5); + } + return USBERR_ERROR; +} + +UsbErr UsbDevice::SetPortFeature(int feature, int index) +{ + //DBG("feature=%d index=%d\n", feature, index); + UsbErr rc; + rc = controlSend( + USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER, + SET_FEATURE, feature, index, 0, 0); + return rc; +} + +UsbErr UsbDevice::ClearPortFeature(int feature, int index) +{ + UsbErr rc; + rc = controlSend( + USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER, + CLEAR_FEATURE, feature, index, 0, 0); + return rc; +} + +UsbErr UsbDevice::SetPortReset(int port) +{ + //DBG("port=%d\n", port); + UsbErr rc = SetPortFeature(PORT_RESET, port); + DBG_ASSERT(rc == USBERR_OK); + return rc; +} + +UsbErr UsbDevice::GetPortStatus(int port, uint8_t* buf, int size) +{ + DBG_ASSERT(size == 4); + UsbErr rc; + //return USBControlTransfer(device, + //DEVICE_TO_HOST | REQUEST_TYPE_CLASS | RECIPIENT_OTHER, + //GET_STATUS,0,port,(u8*)status,4); + + rc = controlReceive( + USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER, + GET_STATUS, 0, port, buf, sizeof(buf)); + return rc; +} \ No newline at end of file