Usb read
Dependencies: FATFileSystem
Fork of F401RE-USBHost by
USBHostRSSI/USBHostRSSI.cpp@13:8774c07f12a5, 2014-06-10 (annotated)
- Committer:
- va009039
- Date:
- Tue Jun 10 13:38:41 2014 +0900
- Revision:
- 13:8774c07f12a5
- Child:
- 16:981c3104f6c0
add USBHostC270
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 |
13:8774c07f12a5 | 1 | #include "USBHostRSSI.h" |
va009039 |
13:8774c07f12a5 | 2 | |
va009039 |
13:8774c07f12a5 | 3 | USBHostRSSI::USBHostRSSI() |
va009039 |
13:8774c07f12a5 | 4 | { |
va009039 |
13:8774c07f12a5 | 5 | host = USBHost::getHostInst(); |
va009039 |
13:8774c07f12a5 | 6 | init(); |
va009039 |
13:8774c07f12a5 | 7 | } |
va009039 |
13:8774c07f12a5 | 8 | |
va009039 |
13:8774c07f12a5 | 9 | void USBHostRSSI::init() |
va009039 |
13:8774c07f12a5 | 10 | { |
va009039 |
13:8774c07f12a5 | 11 | dev = NULL; |
va009039 |
13:8774c07f12a5 | 12 | int_in = NULL; |
va009039 |
13:8774c07f12a5 | 13 | onUpdate = NULL; |
va009039 |
13:8774c07f12a5 | 14 | dev_connected = false; |
va009039 |
13:8774c07f12a5 | 15 | bluetooth_device_found = false; |
va009039 |
13:8774c07f12a5 | 16 | bluetooth_intf = -1; |
va009039 |
13:8774c07f12a5 | 17 | seq = 0; |
va009039 |
13:8774c07f12a5 | 18 | |
va009039 |
13:8774c07f12a5 | 19 | } |
va009039 |
13:8774c07f12a5 | 20 | |
va009039 |
13:8774c07f12a5 | 21 | bool USBHostRSSI::connected() { |
va009039 |
13:8774c07f12a5 | 22 | return dev_connected; |
va009039 |
13:8774c07f12a5 | 23 | } |
va009039 |
13:8774c07f12a5 | 24 | |
va009039 |
13:8774c07f12a5 | 25 | bool USBHostRSSI::connect() { |
va009039 |
13:8774c07f12a5 | 26 | |
va009039 |
13:8774c07f12a5 | 27 | if (dev_connected) { |
va009039 |
13:8774c07f12a5 | 28 | return true; |
va009039 |
13:8774c07f12a5 | 29 | } |
va009039 |
13:8774c07f12a5 | 30 | |
va009039 |
13:8774c07f12a5 | 31 | for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) { |
va009039 |
13:8774c07f12a5 | 32 | if ((dev = host->getDevice(i)) != NULL) { |
va009039 |
13:8774c07f12a5 | 33 | if(host->enumerate(dev, this)) { |
va009039 |
13:8774c07f12a5 | 34 | break; |
va009039 |
13:8774c07f12a5 | 35 | } |
va009039 |
13:8774c07f12a5 | 36 | if (bluetooth_device_found) { |
va009039 |
13:8774c07f12a5 | 37 | int_in = dev->getEndpoint(bluetooth_intf, INTERRUPT_ENDPOINT, IN); |
va009039 |
13:8774c07f12a5 | 38 | USB_DBG("int_in=%p", int_in); |
va009039 |
13:8774c07f12a5 | 39 | if (!int_in) { |
va009039 |
13:8774c07f12a5 | 40 | break; |
va009039 |
13:8774c07f12a5 | 41 | } |
va009039 |
13:8774c07f12a5 | 42 | USB_INFO("New Bluetooth device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, bluetooth_intf); |
va009039 |
13:8774c07f12a5 | 43 | int_in->attach(this, &USBHostRSSI::rxHandler); |
va009039 |
13:8774c07f12a5 | 44 | int rc = host->interruptRead(dev, int_in, int_buf, sizeof(int_buf), false); |
va009039 |
13:8774c07f12a5 | 45 | USB_TEST_ASSERT(rc != USB_TYPE_ERROR); |
va009039 |
13:8774c07f12a5 | 46 | rc = cmdSend(HCI_OP_RESET); |
va009039 |
13:8774c07f12a5 | 47 | USB_TEST_ASSERT(rc == USB_TYPE_OK); |
va009039 |
13:8774c07f12a5 | 48 | dev_connected = true; |
va009039 |
13:8774c07f12a5 | 49 | return true; |
va009039 |
13:8774c07f12a5 | 50 | } |
va009039 |
13:8774c07f12a5 | 51 | } |
va009039 |
13:8774c07f12a5 | 52 | } |
va009039 |
13:8774c07f12a5 | 53 | init(); |
va009039 |
13:8774c07f12a5 | 54 | return false; |
va009039 |
13:8774c07f12a5 | 55 | } |
va009039 |
13:8774c07f12a5 | 56 | |
va009039 |
13:8774c07f12a5 | 57 | void USBHostRSSI::rxHandler() { |
va009039 |
13:8774c07f12a5 | 58 | event(int_buf, int_in->getLengthTransferred()); |
va009039 |
13:8774c07f12a5 | 59 | if (dev) { |
va009039 |
13:8774c07f12a5 | 60 | host->interruptRead(dev, int_in, int_buf, sizeof(int_buf), false); |
va009039 |
13:8774c07f12a5 | 61 | } |
va009039 |
13:8774c07f12a5 | 62 | } |
va009039 |
13:8774c07f12a5 | 63 | |
va009039 |
13:8774c07f12a5 | 64 | /*virtual*/ void USBHostRSSI::setVidPid(uint16_t vid, uint16_t pid) |
va009039 |
13:8774c07f12a5 | 65 | { |
va009039 |
13:8774c07f12a5 | 66 | USB_DBG("vid:%04x pid:%04x", vid, pid); |
va009039 |
13:8774c07f12a5 | 67 | // we don't check VID/PID for mouse driver |
va009039 |
13:8774c07f12a5 | 68 | } |
va009039 |
13:8774c07f12a5 | 69 | |
va009039 |
13:8774c07f12a5 | 70 | /*virtual*/ bool USBHostRSSI::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 |
13:8774c07f12a5 | 71 | { |
va009039 |
13:8774c07f12a5 | 72 | USB_DBG("intf: %d class: %02x %02x %02x", intf_nb, intf_class, intf_subclass, intf_protocol); |
va009039 |
13:8774c07f12a5 | 73 | if (bluetooth_intf == -1 && intf_class == 0xe0) { |
va009039 |
13:8774c07f12a5 | 74 | bluetooth_intf = intf_nb; |
va009039 |
13:8774c07f12a5 | 75 | return true; |
va009039 |
13:8774c07f12a5 | 76 | } |
va009039 |
13:8774c07f12a5 | 77 | return false; |
va009039 |
13:8774c07f12a5 | 78 | } |
va009039 |
13:8774c07f12a5 | 79 | |
va009039 |
13:8774c07f12a5 | 80 | /*virtual*/ bool USBHostRSSI::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used |
va009039 |
13:8774c07f12a5 | 81 | { |
va009039 |
13:8774c07f12a5 | 82 | USB_DBG("intf_nb=%d type=%d dir=%d", intf_nb, type, dir); |
va009039 |
13:8774c07f12a5 | 83 | |
va009039 |
13:8774c07f12a5 | 84 | if (intf_nb == bluetooth_intf) { |
va009039 |
13:8774c07f12a5 | 85 | if (type == INTERRUPT_ENDPOINT && dir == IN) { |
va009039 |
13:8774c07f12a5 | 86 | bluetooth_device_found = true; |
va009039 |
13:8774c07f12a5 | 87 | return true; |
va009039 |
13:8774c07f12a5 | 88 | } |
va009039 |
13:8774c07f12a5 | 89 | } |
va009039 |
13:8774c07f12a5 | 90 | return false; |
va009039 |
13:8774c07f12a5 | 91 | } |
va009039 |
13:8774c07f12a5 | 92 | |
va009039 |
13:8774c07f12a5 | 93 | void USBHostRSSI::event(uint8_t* data, int len) { |
va009039 |
13:8774c07f12a5 | 94 | CTASSERT(sizeof(BD_ADDR) == 6); |
va009039 |
13:8774c07f12a5 | 95 | CTASSERT(sizeof(inquiry_with_rssi_info) == 14); |
va009039 |
13:8774c07f12a5 | 96 | inquiry_with_rssi_info* info; |
va009039 |
13:8774c07f12a5 | 97 | int max_period_length = 25; |
va009039 |
13:8774c07f12a5 | 98 | int min_period_length = 20; |
va009039 |
13:8774c07f12a5 | 99 | int inquiry_length = 15; |
va009039 |
13:8774c07f12a5 | 100 | USB_TYPE rc; |
va009039 |
13:8774c07f12a5 | 101 | if (len > 0) { |
va009039 |
13:8774c07f12a5 | 102 | USB_DBG_HEX(data, len); |
va009039 |
13:8774c07f12a5 | 103 | hci_event* event = reinterpret_cast<hci_event*>(data); |
va009039 |
13:8774c07f12a5 | 104 | switch(event->evt) { |
va009039 |
13:8774c07f12a5 | 105 | case HCI_EV_CMD_COMPLETE: |
va009039 |
13:8774c07f12a5 | 106 | switch(event->c.op) { |
va009039 |
13:8774c07f12a5 | 107 | case HCI_OP_RESET: |
va009039 |
13:8774c07f12a5 | 108 | wait_ms(500); |
va009039 |
13:8774c07f12a5 | 109 | rc = cmdSend(HCI_OP_WRITE_INQUIRY_MODE, "B", 0x01); // with RSSI |
va009039 |
13:8774c07f12a5 | 110 | USB_TEST_ASSERT(rc == USB_TYPE_OK); |
va009039 |
13:8774c07f12a5 | 111 | break; |
va009039 |
13:8774c07f12a5 | 112 | case HCI_OP_WRITE_INQUIRY_MODE: |
va009039 |
13:8774c07f12a5 | 113 | rc = cmdSend(HCI_OP_PERIODIC_INQUIRY, "HHBBBBB", |
va009039 |
13:8774c07f12a5 | 114 | max_period_length, min_period_length, 0x33, 0x8B, 0x9E, inquiry_length, 0); |
va009039 |
13:8774c07f12a5 | 115 | USB_TEST_ASSERT(rc == USB_TYPE_OK); |
va009039 |
13:8774c07f12a5 | 116 | break; |
va009039 |
13:8774c07f12a5 | 117 | default: |
va009039 |
13:8774c07f12a5 | 118 | break; |
va009039 |
13:8774c07f12a5 | 119 | } |
va009039 |
13:8774c07f12a5 | 120 | break; |
va009039 |
13:8774c07f12a5 | 121 | case HCI_EV_INQUIRY_RESULT_WITH_RSSI: |
va009039 |
13:8774c07f12a5 | 122 | //USB_DBG_HEX(buf, r); |
va009039 |
13:8774c07f12a5 | 123 | info = reinterpret_cast<inquiry_with_rssi_info*>(event->c.data); |
va009039 |
13:8774c07f12a5 | 124 | if (onUpdate) { |
va009039 |
13:8774c07f12a5 | 125 | (*onUpdate)(info); |
va009039 |
13:8774c07f12a5 | 126 | } |
va009039 |
13:8774c07f12a5 | 127 | break; |
va009039 |
13:8774c07f12a5 | 128 | default: |
va009039 |
13:8774c07f12a5 | 129 | break; |
va009039 |
13:8774c07f12a5 | 130 | } |
va009039 |
13:8774c07f12a5 | 131 | } |
va009039 |
13:8774c07f12a5 | 132 | } |
va009039 |
13:8774c07f12a5 | 133 | |
va009039 |
13:8774c07f12a5 | 134 | USB_TYPE USBHostRSSI::cmdSend(uint16_t op) |
va009039 |
13:8774c07f12a5 | 135 | { |
va009039 |
13:8774c07f12a5 | 136 | return cmdSendSub(op, NULL, 0); |
va009039 |
13:8774c07f12a5 | 137 | } |
va009039 |
13:8774c07f12a5 | 138 | |
va009039 |
13:8774c07f12a5 | 139 | USB_TYPE USBHostRSSI::cmdSend(uint16_t op, const char* fmt, ...) |
va009039 |
13:8774c07f12a5 | 140 | { |
va009039 |
13:8774c07f12a5 | 141 | va_list vl; |
va009039 |
13:8774c07f12a5 | 142 | va_start(vl, fmt); |
va009039 |
13:8774c07f12a5 | 143 | uint8_t buf[255]; |
va009039 |
13:8774c07f12a5 | 144 | int pos = 0; |
va009039 |
13:8774c07f12a5 | 145 | char* name; |
va009039 |
13:8774c07f12a5 | 146 | int name_len; |
va009039 |
13:8774c07f12a5 | 147 | uint16_t h; |
va009039 |
13:8774c07f12a5 | 148 | BD_ADDR* bdaddr; |
va009039 |
13:8774c07f12a5 | 149 | for(int i = 0; fmt[i]; i++) { |
va009039 |
13:8774c07f12a5 | 150 | switch(fmt[i]) { |
va009039 |
13:8774c07f12a5 | 151 | case 's': |
va009039 |
13:8774c07f12a5 | 152 | name = va_arg(vl, char*); |
va009039 |
13:8774c07f12a5 | 153 | name_len = strlen(name)+1; |
va009039 |
13:8774c07f12a5 | 154 | memcpy(buf+pos, name, name_len); |
va009039 |
13:8774c07f12a5 | 155 | pos += name_len; |
va009039 |
13:8774c07f12a5 | 156 | break; |
va009039 |
13:8774c07f12a5 | 157 | case 'B': |
va009039 |
13:8774c07f12a5 | 158 | buf[pos++] = va_arg(vl, int); |
va009039 |
13:8774c07f12a5 | 159 | break; |
va009039 |
13:8774c07f12a5 | 160 | case 'H': |
va009039 |
13:8774c07f12a5 | 161 | h = va_arg(vl, int); |
va009039 |
13:8774c07f12a5 | 162 | buf[pos++] = h; |
va009039 |
13:8774c07f12a5 | 163 | buf[pos++] = h>>8; |
va009039 |
13:8774c07f12a5 | 164 | break; |
va009039 |
13:8774c07f12a5 | 165 | case 'A': |
va009039 |
13:8774c07f12a5 | 166 | bdaddr = va_arg(vl, BD_ADDR*); |
va009039 |
13:8774c07f12a5 | 167 | memcpy(buf+pos, bdaddr, 6); |
va009039 |
13:8774c07f12a5 | 168 | pos += 6; |
va009039 |
13:8774c07f12a5 | 169 | break; |
va009039 |
13:8774c07f12a5 | 170 | default: |
va009039 |
13:8774c07f12a5 | 171 | USB_DBG("op=%04X fmt=%s i=%d", op, fmt, i); |
va009039 |
13:8774c07f12a5 | 172 | break; |
va009039 |
13:8774c07f12a5 | 173 | } |
va009039 |
13:8774c07f12a5 | 174 | } |
va009039 |
13:8774c07f12a5 | 175 | return cmdSendSub(op, buf, pos); |
va009039 |
13:8774c07f12a5 | 176 | } |
va009039 |
13:8774c07f12a5 | 177 | |
va009039 |
13:8774c07f12a5 | 178 | USB_TYPE USBHostRSSI::cmdSendSub(uint16_t op, const uint8_t* data, int size) |
va009039 |
13:8774c07f12a5 | 179 | { |
va009039 |
13:8774c07f12a5 | 180 | uint8_t* buf = new uint8_t[size+3]; |
va009039 |
13:8774c07f12a5 | 181 | buf[0] = op; |
va009039 |
13:8774c07f12a5 | 182 | buf[1] = op>>8; |
va009039 |
13:8774c07f12a5 | 183 | buf[2] = size; |
va009039 |
13:8774c07f12a5 | 184 | if (data) { |
va009039 |
13:8774c07f12a5 | 185 | memcpy(buf+3, data, size); |
va009039 |
13:8774c07f12a5 | 186 | } |
va009039 |
13:8774c07f12a5 | 187 | USB_TYPE rc = host->controlWrite(dev, USB_REQUEST_TYPE_CLASS, 0, 0, 0, buf, size+3); |
va009039 |
13:8774c07f12a5 | 188 | USB_TEST_ASSERT(rc == USB_TYPE_OK); |
va009039 |
13:8774c07f12a5 | 189 | delete[] buf; |
va009039 |
13:8774c07f12a5 | 190 | return rc; |
va009039 |
13:8774c07f12a5 | 191 | } |