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 "usbbt.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 2 //#define __DEBUG
mbed_Cookbook_SE 0:de03cbbcd0ff 3 #include "mydbg.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 4 #include "Utils.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 5
mbed_Cookbook_SE 0:de03cbbcd0ff 6 usbbt::usbbt(int dongle)
mbed_Cookbook_SE 0:de03cbbcd0ff 7 : m_dongle(dongle),m_pEpIntIn(NULL),m_pEpBulkIn(NULL),m_pEpBulkOut(NULL),
mbed_Cookbook_SE 0:de03cbbcd0ff 8 m_int_seq(0),m_bulk_seq(0)
mbed_Cookbook_SE 0:de03cbbcd0ff 9 {
mbed_Cookbook_SE 0:de03cbbcd0ff 10
mbed_Cookbook_SE 0:de03cbbcd0ff 11 }
mbed_Cookbook_SE 0:de03cbbcd0ff 12
mbed_Cookbook_SE 0:de03cbbcd0ff 13 int usbbt::setup(int timeout)
mbed_Cookbook_SE 0:de03cbbcd0ff 14 {
mbed_Cookbook_SE 0:de03cbbcd0ff 15 for(int i = 0; i < 2; i++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 16 m_pDev = m_pHost->getDeviceByClass(0xe0, m_dongle);
mbed_Cookbook_SE 0:de03cbbcd0ff 17 if (m_pDev || i > 0) {
mbed_Cookbook_SE 0:de03cbbcd0ff 18 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 19 }
mbed_Cookbook_SE 0:de03cbbcd0ff 20 UsbErr rc = Usb_poll();
mbed_Cookbook_SE 0:de03cbbcd0ff 21 if (rc == USBERR_PROCESSING) {
mbed_Cookbook_SE 0:de03cbbcd0ff 22 VERBOSE("%p USBERR_PROCESSING\n", this);
mbed_Cookbook_SE 0:de03cbbcd0ff 23 return -1;
mbed_Cookbook_SE 0:de03cbbcd0ff 24 }
mbed_Cookbook_SE 0:de03cbbcd0ff 25 }
mbed_Cookbook_SE 0:de03cbbcd0ff 26 DBG("m_pDev=%p\n", m_pDev);
mbed_Cookbook_SE 0:de03cbbcd0ff 27 if (m_pDev == NULL) {
mbed_Cookbook_SE 0:de03cbbcd0ff 28 VERBOSE("%p Bluetooth dongle(%d) NOT FOUND\n", this, m_dongle);
mbed_Cookbook_SE 0:de03cbbcd0ff 29 return -1;
mbed_Cookbook_SE 0:de03cbbcd0ff 30 }
mbed_Cookbook_SE 0:de03cbbcd0ff 31 DBG_ASSERT(m_pDev);
mbed_Cookbook_SE 0:de03cbbcd0ff 32
mbed_Cookbook_SE 0:de03cbbcd0ff 33 ParseConfiguration();
mbed_Cookbook_SE 0:de03cbbcd0ff 34 return 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 35 }
mbed_Cookbook_SE 0:de03cbbcd0ff 36
mbed_Cookbook_SE 0:de03cbbcd0ff 37 int usbbt::ParseConfiguration()
mbed_Cookbook_SE 0:de03cbbcd0ff 38 {
mbed_Cookbook_SE 0:de03cbbcd0ff 39 UsbErr rc;
mbed_Cookbook_SE 0:de03cbbcd0ff 40 uint8_t ConfigDesc[9];
mbed_Cookbook_SE 0:de03cbbcd0ff 41 int index = 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 42 DBG_ASSERT(m_pDev);
mbed_Cookbook_SE 0:de03cbbcd0ff 43 rc = m_pDev->GetDescriptor(USB_DESCRIPTOR_TYPE_CONFIGURATION, index, ConfigDesc, sizeof(ConfigDesc));
mbed_Cookbook_SE 0:de03cbbcd0ff 44 DBG_ASSERT(rc == USBERR_OK);
mbed_Cookbook_SE 0:de03cbbcd0ff 45 DBG_BYTES("ConfigDescriptor 9bytes", ConfigDesc, sizeof(ConfigDesc));
mbed_Cookbook_SE 0:de03cbbcd0ff 46 DBG_ASSERT(ConfigDesc[0] == 9);
mbed_Cookbook_SE 0:de03cbbcd0ff 47 DBG_ASSERT(ConfigDesc[1] == 0x02);
mbed_Cookbook_SE 0:de03cbbcd0ff 48 int wTotalLength = *((uint16_t*)&ConfigDesc[2]);
mbed_Cookbook_SE 0:de03cbbcd0ff 49 DBG("TotalLength: %d\n", wTotalLength);
mbed_Cookbook_SE 0:de03cbbcd0ff 50 int bConfigValue = ConfigDesc[5];
mbed_Cookbook_SE 0:de03cbbcd0ff 51 DBG_ASSERT(bConfigValue == 1);
mbed_Cookbook_SE 0:de03cbbcd0ff 52 DBG("ConfigValue: %d\n", bConfigValue);
mbed_Cookbook_SE 0:de03cbbcd0ff 53 VERBOSE("MaxPower: %d mA\n", ConfigDesc[8]*2);
mbed_Cookbook_SE 0:de03cbbcd0ff 54
mbed_Cookbook_SE 0:de03cbbcd0ff 55 uint8_t* buf = new uint8_t[wTotalLength];
mbed_Cookbook_SE 0:de03cbbcd0ff 56 DBG_ASSERT(buf);
mbed_Cookbook_SE 0:de03cbbcd0ff 57 rc = m_pDev->GetDescriptor(USB_DESCRIPTOR_TYPE_CONFIGURATION, index, buf, wTotalLength);
mbed_Cookbook_SE 0:de03cbbcd0ff 58 DBG_ASSERT(rc == USBERR_OK);
mbed_Cookbook_SE 0:de03cbbcd0ff 59 DBG_ASSERT(ConfigDesc[1] == 0x02);
mbed_Cookbook_SE 0:de03cbbcd0ff 60 for (int pos = 0; pos < wTotalLength; pos += buf[pos]) {
mbed_Cookbook_SE 0:de03cbbcd0ff 61 DBG_BYTES("CFG", buf+pos, buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 62 int type = buf[pos+1];
mbed_Cookbook_SE 0:de03cbbcd0ff 63 if (USB_DESCRIPTOR_TYPE_INTERFACE == type) { // 0x04
mbed_Cookbook_SE 0:de03cbbcd0ff 64 DBG("InterfaceNumber: %d\n", buf[pos+2]);
mbed_Cookbook_SE 0:de03cbbcd0ff 65 DBG("AlternateSetting: %d\n", buf[pos+3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 66 DBG("NumEndpoint: %d\n", buf[pos+4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 67 VERBOSE("InterfaceClass: %02X\n", buf[pos+5]);
mbed_Cookbook_SE 0:de03cbbcd0ff 68 VERBOSE("InterfaceSubClass: %02X\n", buf[pos+6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 69 VERBOSE("InterfaceProtocol: %02X\n", buf[pos+7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 70 DBG_ASSERT(buf[pos+6] == 0x01);
mbed_Cookbook_SE 0:de03cbbcd0ff 71 DBG_ASSERT(buf[pos+7] == 0x01);
mbed_Cookbook_SE 0:de03cbbcd0ff 72 }
mbed_Cookbook_SE 0:de03cbbcd0ff 73 if (USB_DESCRIPTOR_TYPE_ENDPOINT == type) {
mbed_Cookbook_SE 0:de03cbbcd0ff 74 DBG_ASSERT(buf[pos] == 7);
mbed_Cookbook_SE 0:de03cbbcd0ff 75 uint8_t att = buf[pos+3];
mbed_Cookbook_SE 0:de03cbbcd0ff 76 uint8_t ep = buf[pos+2];
mbed_Cookbook_SE 0:de03cbbcd0ff 77 bool dir = ep & 0x80; // true=IN
mbed_Cookbook_SE 0:de03cbbcd0ff 78 uint16_t size = LE16(buf+pos+4);
mbed_Cookbook_SE 0:de03cbbcd0ff 79 DBG("EndpointAddress: %02X\n", ep);
mbed_Cookbook_SE 0:de03cbbcd0ff 80 DBG("Attribute: %02X\n", att);
mbed_Cookbook_SE 0:de03cbbcd0ff 81 DBG("MaxPacketSize: %d\n", size);
mbed_Cookbook_SE 0:de03cbbcd0ff 82 UsbEndpoint* pEp = new UsbEndpoint(m_pDev, ep, dir, att == 3 ? USB_INT : USB_BULK, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 83 DBG_ASSERT(pEp);
mbed_Cookbook_SE 0:de03cbbcd0ff 84 if (att == 3) { // interrupt
mbed_Cookbook_SE 0:de03cbbcd0ff 85 if (m_pEpIntIn == NULL) {
mbed_Cookbook_SE 0:de03cbbcd0ff 86 m_pEpIntIn = pEp;
mbed_Cookbook_SE 0:de03cbbcd0ff 87 }
mbed_Cookbook_SE 0:de03cbbcd0ff 88 } else if (att == 2) { // bulk
mbed_Cookbook_SE 0:de03cbbcd0ff 89 if (dir) {
mbed_Cookbook_SE 0:de03cbbcd0ff 90 if (m_pEpBulkIn == NULL) {
mbed_Cookbook_SE 0:de03cbbcd0ff 91 m_pEpBulkIn = pEp;
mbed_Cookbook_SE 0:de03cbbcd0ff 92 }
mbed_Cookbook_SE 0:de03cbbcd0ff 93 } else {
mbed_Cookbook_SE 0:de03cbbcd0ff 94 if (m_pEpBulkOut == NULL) {
mbed_Cookbook_SE 0:de03cbbcd0ff 95 m_pEpBulkOut = pEp;
mbed_Cookbook_SE 0:de03cbbcd0ff 96 }
mbed_Cookbook_SE 0:de03cbbcd0ff 97 }
mbed_Cookbook_SE 0:de03cbbcd0ff 98 }
mbed_Cookbook_SE 0:de03cbbcd0ff 99 }
mbed_Cookbook_SE 0:de03cbbcd0ff 100 if (m_pEpIntIn && m_pEpBulkIn && m_pEpBulkOut) { // cut off
mbed_Cookbook_SE 0:de03cbbcd0ff 101 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 102 }
mbed_Cookbook_SE 0:de03cbbcd0ff 103 }
mbed_Cookbook_SE 0:de03cbbcd0ff 104 delete[] buf;
mbed_Cookbook_SE 0:de03cbbcd0ff 105 DBG_ASSERT(m_pEpIntIn);
mbed_Cookbook_SE 0:de03cbbcd0ff 106 DBG_ASSERT(m_pEpBulkIn);
mbed_Cookbook_SE 0:de03cbbcd0ff 107 DBG_ASSERT(m_pEpBulkOut);
mbed_Cookbook_SE 0:de03cbbcd0ff 108 return 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 109 }
mbed_Cookbook_SE 0:de03cbbcd0ff 110
mbed_Cookbook_SE 0:de03cbbcd0ff 111 int usbbt::send_packet(uint8_t packet_type, uint8_t* packet, int size)
mbed_Cookbook_SE 0:de03cbbcd0ff 112 {
mbed_Cookbook_SE 0:de03cbbcd0ff 113 //DBG("\npacket_type=%d\n", packet_type);
mbed_Cookbook_SE 0:de03cbbcd0ff 114 //DBG_HEX(packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 115
mbed_Cookbook_SE 0:de03cbbcd0ff 116 int rc;
mbed_Cookbook_SE 0:de03cbbcd0ff 117 switch(packet_type){
mbed_Cookbook_SE 0:de03cbbcd0ff 118 case HCI_COMMAND_DATA_PACKET:
mbed_Cookbook_SE 0:de03cbbcd0ff 119 DBG_ASSERT(m_pDev);
mbed_Cookbook_SE 0:de03cbbcd0ff 120 DBG_BYTES("\nCMD", packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 121 rc = m_pDev->controlSend(
mbed_Cookbook_SE 0:de03cbbcd0ff 122 USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE,
mbed_Cookbook_SE 0:de03cbbcd0ff 123 0, 0, 0, packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 124 DBG_ASSERT(rc == USBERR_OK);
mbed_Cookbook_SE 0:de03cbbcd0ff 125 return 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 126 case HCI_ACL_DATA_PACKET:
mbed_Cookbook_SE 0:de03cbbcd0ff 127 DBG_ASSERT(m_pEpBulkOut);
mbed_Cookbook_SE 0:de03cbbcd0ff 128 DBG_BYTES("\nACL", packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 129 rc = m_pEpBulkOut->transfer(packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 130 DBG_ASSERT(rc == USBERR_PROCESSING);
mbed_Cookbook_SE 0:de03cbbcd0ff 131 while(m_pEpBulkOut->status() == USBERR_PROCESSING){
mbed_Cookbook_SE 0:de03cbbcd0ff 132 wait_us(1);
mbed_Cookbook_SE 0:de03cbbcd0ff 133 }
mbed_Cookbook_SE 0:de03cbbcd0ff 134 return 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 135 default:
mbed_Cookbook_SE 0:de03cbbcd0ff 136 DBG_ASSERT(0);
mbed_Cookbook_SE 0:de03cbbcd0ff 137 return -1;
mbed_Cookbook_SE 0:de03cbbcd0ff 138 }
mbed_Cookbook_SE 0:de03cbbcd0ff 139 }
mbed_Cookbook_SE 0:de03cbbcd0ff 140
mbed_Cookbook_SE 0:de03cbbcd0ff 141
mbed_Cookbook_SE 0:de03cbbcd0ff 142 void usbbt::poll()
mbed_Cookbook_SE 0:de03cbbcd0ff 143 {
mbed_Cookbook_SE 0:de03cbbcd0ff 144 //DBG("m_int_seq=%d\n", m_int_seq);
mbed_Cookbook_SE 0:de03cbbcd0ff 145 int rc, len;
mbed_Cookbook_SE 0:de03cbbcd0ff 146 switch(m_int_seq) {
mbed_Cookbook_SE 0:de03cbbcd0ff 147 case 0:
mbed_Cookbook_SE 0:de03cbbcd0ff 148 m_int_seq++;
mbed_Cookbook_SE 0:de03cbbcd0ff 149 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 150 case 1:
mbed_Cookbook_SE 0:de03cbbcd0ff 151 rc = m_pEpIntIn->transfer(m_int_buf, sizeof(m_int_buf));
mbed_Cookbook_SE 0:de03cbbcd0ff 152 DBG_ASSERT(rc == USBERR_PROCESSING);
mbed_Cookbook_SE 0:de03cbbcd0ff 153 m_int_seq++;
mbed_Cookbook_SE 0:de03cbbcd0ff 154 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 155 case 2:
mbed_Cookbook_SE 0:de03cbbcd0ff 156 len = m_pEpIntIn->status();
mbed_Cookbook_SE 0:de03cbbcd0ff 157 if (len == USBERR_PROCESSING) {
mbed_Cookbook_SE 0:de03cbbcd0ff 158 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 159 }
mbed_Cookbook_SE 0:de03cbbcd0ff 160 if (len >= 0) {
mbed_Cookbook_SE 0:de03cbbcd0ff 161 //DBG("len=%d\n", len);
mbed_Cookbook_SE 0:de03cbbcd0ff 162 //DBG_HEX(m_int_buf, len);
mbed_Cookbook_SE 0:de03cbbcd0ff 163 onPacket(HCI_EVENT_PACKET, m_int_buf, len);
mbed_Cookbook_SE 0:de03cbbcd0ff 164 m_int_seq = 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 165 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 166 }
mbed_Cookbook_SE 0:de03cbbcd0ff 167 DBG_ASSERT(0);
mbed_Cookbook_SE 0:de03cbbcd0ff 168 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 169 }
mbed_Cookbook_SE 0:de03cbbcd0ff 170
mbed_Cookbook_SE 0:de03cbbcd0ff 171 switch(m_bulk_seq) {
mbed_Cookbook_SE 0:de03cbbcd0ff 172 case 0:
mbed_Cookbook_SE 0:de03cbbcd0ff 173 m_bulk_seq++;
mbed_Cookbook_SE 0:de03cbbcd0ff 174 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 175 case 1:
mbed_Cookbook_SE 0:de03cbbcd0ff 176 rc = m_pEpBulkIn->transfer(m_bulk_buf, sizeof(m_bulk_buf));
mbed_Cookbook_SE 0:de03cbbcd0ff 177 DBG_ASSERT(rc == USBERR_PROCESSING);
mbed_Cookbook_SE 0:de03cbbcd0ff 178 m_bulk_seq++;
mbed_Cookbook_SE 0:de03cbbcd0ff 179 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 180 case 2:
mbed_Cookbook_SE 0:de03cbbcd0ff 181 len = m_pEpBulkIn->status();
mbed_Cookbook_SE 0:de03cbbcd0ff 182 if (len == USBERR_PROCESSING) {
mbed_Cookbook_SE 0:de03cbbcd0ff 183 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 184 }
mbed_Cookbook_SE 0:de03cbbcd0ff 185 if (len >= 0) {
mbed_Cookbook_SE 0:de03cbbcd0ff 186 //DBG("len=%d\n", len);
mbed_Cookbook_SE 0:de03cbbcd0ff 187 //DBG_HEX(m_bulk_buf, len);
mbed_Cookbook_SE 0:de03cbbcd0ff 188 onPacket(HCI_ACL_DATA_PACKET, m_bulk_buf, len);
mbed_Cookbook_SE 0:de03cbbcd0ff 189 m_bulk_seq = 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 190 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 191 }
mbed_Cookbook_SE 0:de03cbbcd0ff 192 DBG_ASSERT(0);
mbed_Cookbook_SE 0:de03cbbcd0ff 193 break;
mbed_Cookbook_SE 0:de03cbbcd0ff 194 }
mbed_Cookbook_SE 0:de03cbbcd0ff 195 }
mbed_Cookbook_SE 0:de03cbbcd0ff 196
mbed_Cookbook_SE 0:de03cbbcd0ff 197 void usbbt::onPacket(uint8_t packet_type, uint8_t* packet, uint16_t size)
mbed_Cookbook_SE 0:de03cbbcd0ff 198 {
mbed_Cookbook_SE 0:de03cbbcd0ff 199 DBG("\npacket_type=%d packet=%p size=%d\n", packet_type, packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 200 DBG_HEX(packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 201
mbed_Cookbook_SE 0:de03cbbcd0ff 202 if(m_pCbItem && m_pCbMeth)
mbed_Cookbook_SE 0:de03cbbcd0ff 203 (m_pCbItem->*m_pCbMeth)(packet_type, packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 204 else if(m_pCb)
mbed_Cookbook_SE 0:de03cbbcd0ff 205 m_pCb(packet_type, packet, size);
mbed_Cookbook_SE 0:de03cbbcd0ff 206 }
mbed_Cookbook_SE 0:de03cbbcd0ff 207
mbed_Cookbook_SE 0:de03cbbcd0ff 208 void usbbt::setOnPacket( void (*pMethod)(uint8_t, uint8_t*, uint16_t) )
mbed_Cookbook_SE 0:de03cbbcd0ff 209 {
mbed_Cookbook_SE 0:de03cbbcd0ff 210 m_pCb = pMethod;
mbed_Cookbook_SE 0:de03cbbcd0ff 211 m_pCbItem = NULL;
mbed_Cookbook_SE 0:de03cbbcd0ff 212 m_pCbMeth = NULL;
mbed_Cookbook_SE 0:de03cbbcd0ff 213 }
mbed_Cookbook_SE 0:de03cbbcd0ff 214
mbed_Cookbook_SE 0:de03cbbcd0ff 215 void usbbt::clearOnPacket()
mbed_Cookbook_SE 0:de03cbbcd0ff 216 {
mbed_Cookbook_SE 0:de03cbbcd0ff 217 m_pCb = NULL;
mbed_Cookbook_SE 0:de03cbbcd0ff 218 m_pCbItem = NULL;
mbed_Cookbook_SE 0:de03cbbcd0ff 219 m_pCbMeth = NULL;
mbed_Cookbook_SE 0:de03cbbcd0ff 220 }