Simple USBHost library for Nucleo F446RE/F411RE/F401RE FRDM-KL46Z/KL25Z/F64F LPC4088/LPC1768

Dependencies:   FATFileSystem

Dependents:   F401RE-BTstack_example F401RE-USBHostMSD_HelloWorld

Fork of KL46Z-USBHost by Norimasa Okamoto

簡易USBホストライブラリです。
official-USBHostの下位互換で対応プログラムを僅かな修正で動かすことが出来ます。

Platforms

  • Nucleo F446RE
  • Nucleo F411RE
  • Nucleo F401RE
  • FRDM-K64F
  • FRDM-KL46Z
  • FRDM-KL25Z
  • LPC4088
  • LPC1768

Nucleo F446RE/F411RE/F401REのUSB接続方法

ST morphoUSB
U5V (CN10-8)VBUS (1 RED)
PA11 (CN10-14)DM  (2 WHITE)
PA12 (CN10-12)DP  (3 GREEN)
GND (CN10-20)GND (4 BLACK)

Examples

Import programF446RE-USBHostMouse_HelloWorld

USBHostMouse Hello World for ST-Nucleo-F446RE

Import programF401RE-USBHostMSD_HelloWorld

Simple USBHost MSD(USB flash drive) for Nucleo F401RE/FRDM-KL46Z test program

Import programF401RE-USBHostC270_example

Simple USBHost WebCam test program

Import programK64F_USBHostC270_example

Simple USBHost C270 example

Import programF401RE-BTstack_example

BTstack for Nucleo F401RE/FRDM-KL46Z example program

Import programUSBHostRSSI_example

Bluetooth device discovery example program.

Import programKL46Z-USBHostGPS_HelloWorld

Simple USBHost GPS Dongle Receiver for FRDM-KL46Z test program

Committer:
va009039
Date:
Sun May 01 03:18:11 2016 +0000
Revision:
23:4ab8bc835303
Parent:
16:981c3104f6c0
add ST-Nucleo-F446RE

Who changed what in which revision?

UserRevisionLine numberNew 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 16:981c3104f6c0 111 if (rc != USB_TYPE_OK) {
va009039 16:981c3104f6c0 112 }
va009039 13:8774c07f12a5 113 break;
va009039 13:8774c07f12a5 114 case HCI_OP_WRITE_INQUIRY_MODE:
va009039 13:8774c07f12a5 115 rc = cmdSend(HCI_OP_PERIODIC_INQUIRY, "HHBBBBB",
va009039 13:8774c07f12a5 116 max_period_length, min_period_length, 0x33, 0x8B, 0x9E, inquiry_length, 0);
va009039 13:8774c07f12a5 117 USB_TEST_ASSERT(rc == USB_TYPE_OK);
va009039 13:8774c07f12a5 118 break;
va009039 13:8774c07f12a5 119 default:
va009039 13:8774c07f12a5 120 break;
va009039 13:8774c07f12a5 121 }
va009039 13:8774c07f12a5 122 break;
va009039 13:8774c07f12a5 123 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
va009039 13:8774c07f12a5 124 //USB_DBG_HEX(buf, r);
va009039 13:8774c07f12a5 125 info = reinterpret_cast<inquiry_with_rssi_info*>(event->c.data);
va009039 13:8774c07f12a5 126 if (onUpdate) {
va009039 13:8774c07f12a5 127 (*onUpdate)(info);
va009039 13:8774c07f12a5 128 }
va009039 13:8774c07f12a5 129 break;
va009039 13:8774c07f12a5 130 default:
va009039 13:8774c07f12a5 131 break;
va009039 13:8774c07f12a5 132 }
va009039 13:8774c07f12a5 133 }
va009039 13:8774c07f12a5 134 }
va009039 13:8774c07f12a5 135
va009039 13:8774c07f12a5 136 USB_TYPE USBHostRSSI::cmdSend(uint16_t op)
va009039 13:8774c07f12a5 137 {
va009039 13:8774c07f12a5 138 return cmdSendSub(op, NULL, 0);
va009039 13:8774c07f12a5 139 }
va009039 13:8774c07f12a5 140
va009039 13:8774c07f12a5 141 USB_TYPE USBHostRSSI::cmdSend(uint16_t op, const char* fmt, ...)
va009039 13:8774c07f12a5 142 {
va009039 13:8774c07f12a5 143 va_list vl;
va009039 13:8774c07f12a5 144 va_start(vl, fmt);
va009039 13:8774c07f12a5 145 uint8_t buf[255];
va009039 13:8774c07f12a5 146 int pos = 0;
va009039 13:8774c07f12a5 147 char* name;
va009039 13:8774c07f12a5 148 int name_len;
va009039 13:8774c07f12a5 149 uint16_t h;
va009039 13:8774c07f12a5 150 BD_ADDR* bdaddr;
va009039 13:8774c07f12a5 151 for(int i = 0; fmt[i]; i++) {
va009039 13:8774c07f12a5 152 switch(fmt[i]) {
va009039 13:8774c07f12a5 153 case 's':
va009039 13:8774c07f12a5 154 name = va_arg(vl, char*);
va009039 13:8774c07f12a5 155 name_len = strlen(name)+1;
va009039 13:8774c07f12a5 156 memcpy(buf+pos, name, name_len);
va009039 13:8774c07f12a5 157 pos += name_len;
va009039 13:8774c07f12a5 158 break;
va009039 13:8774c07f12a5 159 case 'B':
va009039 13:8774c07f12a5 160 buf[pos++] = va_arg(vl, int);
va009039 13:8774c07f12a5 161 break;
va009039 13:8774c07f12a5 162 case 'H':
va009039 13:8774c07f12a5 163 h = va_arg(vl, int);
va009039 13:8774c07f12a5 164 buf[pos++] = h;
va009039 13:8774c07f12a5 165 buf[pos++] = h>>8;
va009039 13:8774c07f12a5 166 break;
va009039 13:8774c07f12a5 167 case 'A':
va009039 13:8774c07f12a5 168 bdaddr = va_arg(vl, BD_ADDR*);
va009039 13:8774c07f12a5 169 memcpy(buf+pos, bdaddr, 6);
va009039 13:8774c07f12a5 170 pos += 6;
va009039 13:8774c07f12a5 171 break;
va009039 13:8774c07f12a5 172 default:
va009039 13:8774c07f12a5 173 USB_DBG("op=%04X fmt=%s i=%d", op, fmt, i);
va009039 13:8774c07f12a5 174 break;
va009039 13:8774c07f12a5 175 }
va009039 13:8774c07f12a5 176 }
va009039 13:8774c07f12a5 177 return cmdSendSub(op, buf, pos);
va009039 13:8774c07f12a5 178 }
va009039 13:8774c07f12a5 179
va009039 13:8774c07f12a5 180 USB_TYPE USBHostRSSI::cmdSendSub(uint16_t op, const uint8_t* data, int size)
va009039 13:8774c07f12a5 181 {
va009039 13:8774c07f12a5 182 uint8_t* buf = new uint8_t[size+3];
va009039 13:8774c07f12a5 183 buf[0] = op;
va009039 13:8774c07f12a5 184 buf[1] = op>>8;
va009039 13:8774c07f12a5 185 buf[2] = size;
va009039 13:8774c07f12a5 186 if (data) {
va009039 13:8774c07f12a5 187 memcpy(buf+3, data, size);
va009039 13:8774c07f12a5 188 }
va009039 13:8774c07f12a5 189 USB_TYPE rc = host->controlWrite(dev, USB_REQUEST_TYPE_CLASS, 0, 0, 0, buf, size+3);
va009039 13:8774c07f12a5 190 USB_TEST_ASSERT(rc == USB_TYPE_OK);
va009039 13:8774c07f12a5 191 delete[] buf;
va009039 13:8774c07f12a5 192 return rc;
va009039 13:8774c07f12a5 193 }