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
USBHost-STM32F4/USBHostRSSI/USBHostRSSI.h@0:458bf947f46f, 2019-02-19 (annotated)
- 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?
User | Revision | Line number | New 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 |