Fork of [[https://os.mbed.com/users/va009039/code/F401RE-USBHost/]]. Added support for Seeed Arch Max and STM32F407.

Dependents:   STM32F407VET6_USBHostMSD STM32F407VET6_USBHostMouse STM32F407VET6_USBHostKeyboard STM32F407VET6_USBHostMSD_1

Committer:
hudakz
Date:
Tue Feb 19 21:32:56 2019 +0000
Revision:
0:458bf947f46f
Fork of [[https://os.mbed.com/users/va009039/code/F401RE-USBHost/]]. Added support for Seeed Arch Max and STM32F407.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:458bf947f46f 1 // Simple USBHost Bluetooth RSSI for FRDM-KL46Z
hudakz 0:458bf947f46f 2 #pragma once
hudakz 0:458bf947f46f 3 #include "USBHost.h"
hudakz 0:458bf947f46f 4 #include <stdarg.h>
hudakz 0:458bf947f46f 5
hudakz 0:458bf947f46f 6 #define HCI_OP_INQUIRY 0x0401
hudakz 0:458bf947f46f 7 #define HCI_OP_INQUIRY_CANCEL 0x0402
hudakz 0:458bf947f46f 8 #define HCI_OP_PERIODIC_INQUIRY 0x0403
hudakz 0:458bf947f46f 9 #define HCI_OP_EXIT_PERIODIC_INQUIRY 0x0404
hudakz 0:458bf947f46f 10 #define HCI_OP_REMOTE_NAME_REQ 0x0419
hudakz 0:458bf947f46f 11 #define HCI_OP_RESET 0x0c03
hudakz 0:458bf947f46f 12 #define HCI_OP_WRITE_LOCAL_NAME 0x0c13
hudakz 0:458bf947f46f 13 #define HCI_OP_WRITE_SCAN_ENABLE 0x0c1a
hudakz 0:458bf947f46f 14 #define HCI_OP_WRITE_CLASS_OF_DEV 0x0c24
hudakz 0:458bf947f46f 15 #define HCI_OP_WRITE_INQUIRY_MODE 0x0c45
hudakz 0:458bf947f46f 16 #define HCI_OP_READ_EXTENDED_INQUIRY_RESPONSE 0x0c51
hudakz 0:458bf947f46f 17 #define HCI_OP_WRITE_EXTENDED_INQUIRY_RESPONSE 0x0c52
hudakz 0:458bf947f46f 18 #define HCI_OP_READ_BD_ADDR 0x1009
hudakz 0:458bf947f46f 19
hudakz 0:458bf947f46f 20 #define HCI_EV_INQUIRY_COMPLETE 0x01
hudakz 0:458bf947f46f 21 #define HCI_EV_INQUIRY_RESULT 0x02
hudakz 0:458bf947f46f 22 #define HCI_EV_REMOTE_NAME 0x07
hudakz 0:458bf947f46f 23 #define HCI_EV_CMD_COMPLETE 0x0e
hudakz 0:458bf947f46f 24 #define HCI_EV_CMD_STATUS 0x0f
hudakz 0:458bf947f46f 25 #define HCI_EV_INQUIRY_RESULT_WITH_RSSI 0x22
hudakz 0:458bf947f46f 26 #define HCI_EV_EXTENDED_INQUIRY_RESULT 0x2f
hudakz 0:458bf947f46f 27
hudakz 0:458bf947f46f 28 #pragma pack(push,1)
hudakz 0:458bf947f46f 29 struct BD_ADDR {
hudakz 0:458bf947f46f 30 uint8_t addr[6];
hudakz 0:458bf947f46f 31 void set(char* s) {
hudakz 0:458bf947f46f 32 char* p = s;
hudakz 0:458bf947f46f 33 for(int i = 5; i >= 0; i--) {
hudakz 0:458bf947f46f 34 addr[i] = strtol(p, &p, 16);
hudakz 0:458bf947f46f 35 if (*p == ':') {
hudakz 0:458bf947f46f 36 p++;
hudakz 0:458bf947f46f 37 }
hudakz 0:458bf947f46f 38 }
hudakz 0:458bf947f46f 39 }
hudakz 0:458bf947f46f 40 void str(char* buf, size_t size) {
hudakz 0:458bf947f46f 41 snprintf(buf, size, "%02X:%02X:%02X:%02X:%02X:%02X", addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
hudakz 0:458bf947f46f 42 }
hudakz 0:458bf947f46f 43 void str_mask(char* buf, size_t size) {
hudakz 0:458bf947f46f 44 snprintf(buf, size, "%02X:%02X:%02X:xx:xx:xx", addr[5], addr[4], addr[3]);
hudakz 0:458bf947f46f 45 }
hudakz 0:458bf947f46f 46 bool eq(BD_ADDR* a) {
hudakz 0:458bf947f46f 47 return memcmp(addr, a->addr, 6) == 0;
hudakz 0:458bf947f46f 48 }
hudakz 0:458bf947f46f 49 bool eq_vendor(BD_ADDR* a) {
hudakz 0:458bf947f46f 50 return memcmp(addr+3, a->addr+3, 3) == 0;
hudakz 0:458bf947f46f 51 }
hudakz 0:458bf947f46f 52 };
hudakz 0:458bf947f46f 53
hudakz 0:458bf947f46f 54 struct inquiry_info {
hudakz 0:458bf947f46f 55 BD_ADDR bdaddr;
hudakz 0:458bf947f46f 56 uint8_t page_scan_repetition_mode;
hudakz 0:458bf947f46f 57 uint8_t reserved[2];
hudakz 0:458bf947f46f 58 uint8_t dev_class[3];
hudakz 0:458bf947f46f 59 uint16_t clock_offset;
hudakz 0:458bf947f46f 60 };
hudakz 0:458bf947f46f 61
hudakz 0:458bf947f46f 62 struct inquiry_with_rssi_info { // offset
hudakz 0:458bf947f46f 63 BD_ADDR bdaddr; // +0
hudakz 0:458bf947f46f 64 uint8_t page_scan_repetition_mode;// +6
hudakz 0:458bf947f46f 65 uint8_t reserved[1]; // +7
hudakz 0:458bf947f46f 66 uint8_t class_of_device[3]; // +8
hudakz 0:458bf947f46f 67 uint16_t clock_offset; // +11
hudakz 0:458bf947f46f 68 int8_t rssi; // +13
hudakz 0:458bf947f46f 69 }; // +14
hudakz 0:458bf947f46f 70
hudakz 0:458bf947f46f 71 struct extended_inquiry_info {
hudakz 0:458bf947f46f 72 BD_ADDR bdaddr;
hudakz 0:458bf947f46f 73 uint8_t page_scan_repetition_mode;
hudakz 0:458bf947f46f 74 uint8_t reserved[1];
hudakz 0:458bf947f46f 75 uint8_t class_of_device[3];
hudakz 0:458bf947f46f 76 uint16_t clock_offset;
hudakz 0:458bf947f46f 77 int8_t rssi;
hudakz 0:458bf947f46f 78 uint8_t extended_inquiry_response[240];
hudakz 0:458bf947f46f 79 };
hudakz 0:458bf947f46f 80
hudakz 0:458bf947f46f 81 struct hci_event {
hudakz 0:458bf947f46f 82 uint8_t evt;
hudakz 0:458bf947f46f 83 uint8_t len;
hudakz 0:458bf947f46f 84 uint8_t status;
hudakz 0:458bf947f46f 85 union {
hudakz 0:458bf947f46f 86 uint16_t op;
hudakz 0:458bf947f46f 87 uint8_t data[2];
hudakz 0:458bf947f46f 88 } c;
hudakz 0:458bf947f46f 89 };
hudakz 0:458bf947f46f 90 #pragma pack(pop)
hudakz 0:458bf947f46f 91
hudakz 0:458bf947f46f 92 class USBHostRSSI : public IUSBEnumerator {
hudakz 0:458bf947f46f 93 public:
hudakz 0:458bf947f46f 94
hudakz 0:458bf947f46f 95 /**
hudakz 0:458bf947f46f 96 * Constructor
hudakz 0:458bf947f46f 97 */
hudakz 0:458bf947f46f 98 USBHostRSSI();
hudakz 0:458bf947f46f 99
hudakz 0:458bf947f46f 100 /**
hudakz 0:458bf947f46f 101 * Try to connect a BT device
hudakz 0:458bf947f46f 102 *
hudakz 0:458bf947f46f 103 * @return true if connection was successful
hudakz 0:458bf947f46f 104 */
hudakz 0:458bf947f46f 105 bool connect();
hudakz 0:458bf947f46f 106
hudakz 0:458bf947f46f 107 /**
hudakz 0:458bf947f46f 108 * Check if a mouse is connected
hudakz 0:458bf947f46f 109 *
hudakz 0:458bf947f46f 110 * @returns true if a BT is connected
hudakz 0:458bf947f46f 111 */
hudakz 0:458bf947f46f 112 bool connected();
hudakz 0:458bf947f46f 113
hudakz 0:458bf947f46f 114 void attachEvent(void (*ptr)(inquiry_with_rssi_info* info)) {
hudakz 0:458bf947f46f 115 if (ptr != NULL) {
hudakz 0:458bf947f46f 116 onUpdate = ptr;
hudakz 0:458bf947f46f 117 }
hudakz 0:458bf947f46f 118 }
hudakz 0:458bf947f46f 119 //Report* report;
hudakz 0:458bf947f46f 120
hudakz 0:458bf947f46f 121 protected:
hudakz 0:458bf947f46f 122 //From IUSBEnumerator
hudakz 0:458bf947f46f 123 virtual void setVidPid(uint16_t vid, uint16_t pid);
hudakz 0:458bf947f46f 124 virtual bool 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
hudakz 0:458bf947f46f 125 virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
hudakz 0:458bf947f46f 126
hudakz 0:458bf947f46f 127 private:
hudakz 0:458bf947f46f 128 USBHost * host;
hudakz 0:458bf947f46f 129 USBDeviceConnected * dev;
hudakz 0:458bf947f46f 130 USBEndpoint * int_in;
hudakz 0:458bf947f46f 131 bool dev_connected;
hudakz 0:458bf947f46f 132 bool bluetooth_device_found;
hudakz 0:458bf947f46f 133 int bluetooth_intf;
hudakz 0:458bf947f46f 134
hudakz 0:458bf947f46f 135 void rxHandler();
hudakz 0:458bf947f46f 136 void (*onUpdate)(inquiry_with_rssi_info* info);
hudakz 0:458bf947f46f 137 uint8_t int_buf[64];
hudakz 0:458bf947f46f 138 int seq;
hudakz 0:458bf947f46f 139 void event(uint8_t* data, int size);
hudakz 0:458bf947f46f 140 USB_TYPE cmdSend(uint16_t op);
hudakz 0:458bf947f46f 141 USB_TYPE cmdSend(uint16_t op, const char* fmt, ...);
hudakz 0:458bf947f46f 142 USB_TYPE cmdSendSub(uint16_t op, const uint8_t* data, int size);
hudakz 0:458bf947f46f 143 void init();
hudakz 0:458bf947f46f 144 };
hudakz 0:458bf947f46f 145