mbed base bard check program for BlueTooth USB dongle module (3 switches, 6 leds, I2C LCD, A/D)
Fork of BTstack by
USBHostBTstack/USBHostBTstack.cpp@1:b657594559be, 2013-03-21 (annotated)
- Committer:
- va009039
- Date:
- Thu Mar 21 13:53:05 2013 +0000
- Revision:
- 1:b657594559be
- Child:
- 2:871b41f4789e
replaced USBHost
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 1:b657594559be | 1 | #include "USBHostBTstack.h" |
va009039 | 1:b657594559be | 2 | #include "dbg.h" |
va009039 | 1:b657594559be | 3 | |
va009039 | 1:b657594559be | 4 | #define BTSTACK_DEBUG 1 |
va009039 | 1:b657594559be | 5 | |
va009039 | 1:b657594559be | 6 | #ifdef BTSTACK_DEBUG |
va009039 | 1:b657594559be | 7 | #define BT_DBG(x, ...) std::printf("[%s:%d]"x"\r\n", __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); |
va009039 | 1:b657594559be | 8 | #else |
va009039 | 1:b657594559be | 9 | #define BT_DBG(...) while(0); |
va009039 | 1:b657594559be | 10 | #endif |
va009039 | 1:b657594559be | 11 | |
va009039 | 1:b657594559be | 12 | #define HCI_COMMAND_DATA_PACKET 0x01 |
va009039 | 1:b657594559be | 13 | #define HCI_ACL_DATA_PACKET 0x02 |
va009039 | 1:b657594559be | 14 | #define HCI_SCO_DATA_PACKET 0x03 |
va009039 | 1:b657594559be | 15 | #define HCI_EVENT_PACKET 0x04 |
va009039 | 1:b657594559be | 16 | |
va009039 | 1:b657594559be | 17 | USBHostBTstack::USBHostBTstack() |
va009039 | 1:b657594559be | 18 | { |
va009039 | 1:b657594559be | 19 | host = USBHost::getHostInst(); |
va009039 | 1:b657594559be | 20 | init(); |
va009039 | 1:b657594559be | 21 | m_pCb = NULL; |
va009039 | 1:b657594559be | 22 | } |
va009039 | 1:b657594559be | 23 | |
va009039 | 1:b657594559be | 24 | void USBHostBTstack::init() |
va009039 | 1:b657594559be | 25 | { |
va009039 | 1:b657594559be | 26 | BT_DBG(""); |
va009039 | 1:b657594559be | 27 | dev = NULL; |
va009039 | 1:b657594559be | 28 | int_in = NULL; |
va009039 | 1:b657594559be | 29 | bulk_in = NULL; |
va009039 | 1:b657594559be | 30 | bulk_out = NULL; |
va009039 | 1:b657594559be | 31 | btstack_intf = -1; |
va009039 | 1:b657594559be | 32 | btstack_device_found = false; |
va009039 | 1:b657594559be | 33 | dev_connected = false; |
va009039 | 1:b657594559be | 34 | ep_int_in = false; |
va009039 | 1:b657594559be | 35 | ep_bulk_in = false; |
va009039 | 1:b657594559be | 36 | ep_bulk_out = false; |
va009039 | 1:b657594559be | 37 | } |
va009039 | 1:b657594559be | 38 | |
va009039 | 1:b657594559be | 39 | bool USBHostBTstack::connected() |
va009039 | 1:b657594559be | 40 | { |
va009039 | 1:b657594559be | 41 | return dev_connected; |
va009039 | 1:b657594559be | 42 | } |
va009039 | 1:b657594559be | 43 | |
va009039 | 1:b657594559be | 44 | bool USBHostBTstack::connect() |
va009039 | 1:b657594559be | 45 | { |
va009039 | 1:b657594559be | 46 | if (dev_connected) { |
va009039 | 1:b657594559be | 47 | return true; |
va009039 | 1:b657594559be | 48 | } |
va009039 | 1:b657594559be | 49 | |
va009039 | 1:b657594559be | 50 | for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) { |
va009039 | 1:b657594559be | 51 | if ((dev = host->getDevice(i)) != NULL) { |
va009039 | 1:b657594559be | 52 | |
va009039 | 1:b657594559be | 53 | BT_DBG("Trying to connect BTstack device\r\n"); |
va009039 | 1:b657594559be | 54 | |
va009039 | 1:b657594559be | 55 | if(host->enumerate(dev, this)) { |
va009039 | 1:b657594559be | 56 | break; |
va009039 | 1:b657594559be | 57 | } |
va009039 | 1:b657594559be | 58 | if (btstack_device_found) { |
va009039 | 1:b657594559be | 59 | int_in = dev->getEndpoint(btstack_intf, INTERRUPT_ENDPOINT, IN); |
va009039 | 1:b657594559be | 60 | bulk_in = dev->getEndpoint(btstack_intf, BULK_ENDPOINT, IN); |
va009039 | 1:b657594559be | 61 | bulk_out = dev->getEndpoint(btstack_intf, BULK_ENDPOINT, OUT); |
va009039 | 1:b657594559be | 62 | if (!int_in || !bulk_in || !bulk_out) { |
va009039 | 1:b657594559be | 63 | continue; |
va009039 | 1:b657594559be | 64 | } |
va009039 | 1:b657594559be | 65 | USB_INFO("New BTstack device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, btstack_intf); |
va009039 | 1:b657594559be | 66 | dev->setName("BTstack", btstack_intf); |
va009039 | 1:b657594559be | 67 | host->registerDriver(dev, btstack_intf, this, &USBHostBTstack::init); |
va009039 | 1:b657594559be | 68 | |
va009039 | 1:b657594559be | 69 | int_in->attach(this, &USBHostBTstack::int_rxHandler); |
va009039 | 1:b657594559be | 70 | host->interruptRead(dev, int_in, int_report, int_in->getSize(), false); |
va009039 | 1:b657594559be | 71 | |
va009039 | 1:b657594559be | 72 | bulk_in->attach(this, &USBHostBTstack::bulk_rxHandler); |
va009039 | 1:b657594559be | 73 | host->bulkRead(dev, bulk_in, bulk_report, bulk_in->getSize(), false); |
va009039 | 1:b657594559be | 74 | |
va009039 | 1:b657594559be | 75 | dev_connected = true; |
va009039 | 1:b657594559be | 76 | return true; |
va009039 | 1:b657594559be | 77 | } |
va009039 | 1:b657594559be | 78 | } |
va009039 | 1:b657594559be | 79 | } |
va009039 | 1:b657594559be | 80 | init(); |
va009039 | 1:b657594559be | 81 | return false; |
va009039 | 1:b657594559be | 82 | } |
va009039 | 1:b657594559be | 83 | |
va009039 | 1:b657594559be | 84 | void USBHostBTstack::int_rxHandler() { |
va009039 | 1:b657594559be | 85 | int len_listen = int_in->getSize(); |
va009039 | 1:b657594559be | 86 | int len = int_in->getLengthTransferred(); |
va009039 | 1:b657594559be | 87 | |
va009039 | 1:b657594559be | 88 | BT_DBG("len_listen: %d, len: %d", len_listen, len); |
va009039 | 1:b657594559be | 89 | if (m_pCb) { |
va009039 | 1:b657594559be | 90 | m_pCb(HCI_EVENT_PACKET, int_report, len); |
va009039 | 1:b657594559be | 91 | } |
va009039 | 1:b657594559be | 92 | if (dev) { |
va009039 | 1:b657594559be | 93 | host->interruptRead(dev, int_in, int_report, len_listen, false); |
va009039 | 1:b657594559be | 94 | } |
va009039 | 1:b657594559be | 95 | } |
va009039 | 1:b657594559be | 96 | |
va009039 | 1:b657594559be | 97 | void USBHostBTstack::bulk_rxHandler() { |
va009039 | 1:b657594559be | 98 | int len_listen = bulk_in->getSize(); |
va009039 | 1:b657594559be | 99 | int len = bulk_in->getLengthTransferred(); |
va009039 | 1:b657594559be | 100 | |
va009039 | 1:b657594559be | 101 | BT_DBG("len_listen: %d, len: %d", len_listen, len); |
va009039 | 1:b657594559be | 102 | if (m_pCb) { |
va009039 | 1:b657594559be | 103 | m_pCb(HCI_ACL_DATA_PACKET, bulk_report, len); |
va009039 | 1:b657594559be | 104 | } |
va009039 | 1:b657594559be | 105 | if (dev) { |
va009039 | 1:b657594559be | 106 | host->bulkRead(dev, bulk_in, bulk_report, len_listen, false); |
va009039 | 1:b657594559be | 107 | } |
va009039 | 1:b657594559be | 108 | } |
va009039 | 1:b657594559be | 109 | |
va009039 | 1:b657594559be | 110 | /*virtual*/ void USBHostBTstack::setVidPid(uint16_t vid, uint16_t pid) |
va009039 | 1:b657594559be | 111 | { |
va009039 | 1:b657594559be | 112 | BT_DBG("vid:%04x,pid:%04x", vid, pid); |
va009039 | 1:b657594559be | 113 | } |
va009039 | 1:b657594559be | 114 | |
va009039 | 1:b657594559be | 115 | /*virtual*/ bool USBHostBTstack::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed |
va009039 | 1:b657594559be | 116 | { |
va009039 | 1:b657594559be | 117 | BT_DBG("intf_nb=%d,intf_class=%02X,intf_subclass=%d,intf_protocol=%d", intf_nb, intf_class, intf_subclass, intf_protocol); |
va009039 | 1:b657594559be | 118 | if ((btstack_intf == -1) && intf_class == 0xe0) { |
va009039 | 1:b657594559be | 119 | btstack_intf = intf_nb; |
va009039 | 1:b657594559be | 120 | btstack_device_found = true; |
va009039 | 1:b657594559be | 121 | return true; |
va009039 | 1:b657594559be | 122 | } |
va009039 | 1:b657594559be | 123 | return false; |
va009039 | 1:b657594559be | 124 | } |
va009039 | 1:b657594559be | 125 | |
va009039 | 1:b657594559be | 126 | /*virtual*/ bool USBHostBTstack::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used |
va009039 | 1:b657594559be | 127 | { |
va009039 | 1:b657594559be | 128 | BT_DBG("intf_nb:%d,type:%d,dir:%d",intf_nb, type, dir); |
va009039 | 1:b657594559be | 129 | if (intf_nb == btstack_intf) { |
va009039 | 1:b657594559be | 130 | if (ep_int_in == false && type == INTERRUPT_ENDPOINT && dir == IN) { |
va009039 | 1:b657594559be | 131 | ep_int_in = true; |
va009039 | 1:b657594559be | 132 | } else if (ep_bulk_in == false && type == BULK_ENDPOINT && dir == IN) { |
va009039 | 1:b657594559be | 133 | ep_bulk_in = true; |
va009039 | 1:b657594559be | 134 | } else if (ep_bulk_out == false && type == BULK_ENDPOINT && dir == OUT) { |
va009039 | 1:b657594559be | 135 | ep_bulk_out = true; |
va009039 | 1:b657594559be | 136 | } else { |
va009039 | 1:b657594559be | 137 | return false; |
va009039 | 1:b657594559be | 138 | } |
va009039 | 1:b657594559be | 139 | if (ep_int_in && ep_bulk_in && ep_bulk_out) { |
va009039 | 1:b657594559be | 140 | btstack_device_found = true; |
va009039 | 1:b657594559be | 141 | } |
va009039 | 1:b657594559be | 142 | return true; |
va009039 | 1:b657594559be | 143 | } |
va009039 | 1:b657594559be | 144 | return false; |
va009039 | 1:b657594559be | 145 | } |
va009039 | 1:b657594559be | 146 | |
va009039 | 1:b657594559be | 147 | int USBHostBTstack::open() |
va009039 | 1:b657594559be | 148 | { |
va009039 | 1:b657594559be | 149 | BT_DBG("%p", this); |
va009039 | 1:b657594559be | 150 | while(!connected()) { |
va009039 | 1:b657594559be | 151 | if (connect()) { |
va009039 | 1:b657594559be | 152 | break; |
va009039 | 1:b657594559be | 153 | } |
va009039 | 1:b657594559be | 154 | Thread::wait(500); |
va009039 | 1:b657594559be | 155 | } |
va009039 | 1:b657594559be | 156 | return 0; |
va009039 | 1:b657594559be | 157 | } |
va009039 | 1:b657594559be | 158 | |
va009039 | 1:b657594559be | 159 | int USBHostBTstack::send_packet(uint8_t packet_type, uint8_t* packet, int size) |
va009039 | 1:b657594559be | 160 | { |
va009039 | 1:b657594559be | 161 | BT_DBG("packet_type: %d, packet: %p, size: %d", packet_type, packet, size); |
va009039 | 1:b657594559be | 162 | USB_TYPE res; |
va009039 | 1:b657594559be | 163 | switch(packet_type){ |
va009039 | 1:b657594559be | 164 | case HCI_COMMAND_DATA_PACKET: |
va009039 | 1:b657594559be | 165 | res = host->controlWrite(dev, |
va009039 | 1:b657594559be | 166 | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE, |
va009039 | 1:b657594559be | 167 | 0, 0, 0, packet, size); |
va009039 | 1:b657594559be | 168 | TEST_ASSERT(res == USB_TYPE_OK); |
va009039 | 1:b657594559be | 169 | break; |
va009039 | 1:b657594559be | 170 | case HCI_ACL_DATA_PACKET: |
va009039 | 1:b657594559be | 171 | res = host->bulkWrite(dev, bulk_out, packet, size); |
va009039 | 1:b657594559be | 172 | TEST_ASSERT(res == USB_TYPE_OK); |
va009039 | 1:b657594559be | 173 | break; |
va009039 | 1:b657594559be | 174 | default: |
va009039 | 1:b657594559be | 175 | TEST_ASSERT(0); |
va009039 | 1:b657594559be | 176 | return -1; |
va009039 | 1:b657594559be | 177 | } |
va009039 | 1:b657594559be | 178 | return 0; |
va009039 | 1:b657594559be | 179 | } |
va009039 | 1:b657594559be | 180 | |
va009039 | 1:b657594559be | 181 | void USBHostBTstack::register_packet_handler(void (*pMethod)(uint8_t, uint8_t*, uint16_t) ) |
va009039 | 1:b657594559be | 182 | { |
va009039 | 1:b657594559be | 183 | BT_DBG("pMethod: %p", pMethod); |
va009039 | 1:b657594559be | 184 | m_pCb = pMethod; |
va009039 | 1:b657594559be | 185 | } |
va009039 | 1:b657594559be | 186 |