Simple USBHost library for Nucleo F446RE/F411RE/F401RE FRDM-KL46Z/KL25Z/F64F LPC4088/LPC1768
Dependents: F401RE-BTstack_example F401RE-USBHostMSD_HelloWorld
Fork of KL46Z-USBHost by
簡易USBホストライブラリです。
official-USBHostの下位互換で対応プログラムを僅かな修正で動かすことが出来ます。
Platforms
- Nucleo F446RE
- Nucleo F411RE
- Nucleo F401RE
- FRDM-K64F
- FRDM-KL46Z
- FRDM-KL25Z
- LPC4088
- LPC1768
Nucleo F446RE/F411RE/F401REのUSB接続方法
ST morpho | USB |
---|---|
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
Diff: USBHost/USBHALHost.cpp
- Revision:
- 8:6463cd1964c0
- Parent:
- 7:9a20482c9a7a
- Child:
- 9:7f9f64cf5ded
--- a/USBHost/USBHALHost.cpp Tue Jan 28 06:50:12 2014 +0000 +++ b/USBHost/USBHALHost.cpp Fri Jan 31 13:45:07 2014 +0000 @@ -1,6 +1,5 @@ // Simple USBHost for FRDM-KL46Z #include "USBHALHost.h" -#include <algorithm> template <bool>struct CtAssert; template <>struct CtAssert<true> {}; @@ -16,8 +15,13 @@ #define USB_DBG_HEX(A,B) while(0) #endif +#ifdef _USB_TEST #define USB_TEST_ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; #define USB_TEST_ASSERT_FALSE(A) USB_TEST_ASSERT(!(A)) +#else +#define USB_TEST_ASSERT(A) while(0) +#define USB_TEST_ASSERT_FALSE(A) while(0) +#endif #define BD_OWN_MASK (1<<7) #define BD_DATA01_MASK (1<<6) @@ -98,7 +102,7 @@ NVIC_SetVector(USB0_IRQn, (uint32_t)_usbisr); NVIC_EnableIRQ(USB0_IRQn); - wait_attach(); + bool lowSpeed = wait_attach(); for(int retry = 2; retry > 0; retry--) { // Enable RESET @@ -123,7 +127,7 @@ USB_ERREN_DMAERREN_MASK| USB_ERREN_BTSERREN_MASK; - if (enumeration()) { + if (addDevice(0, 0, lowSpeed)) { break; } USB_DBG("retry=%d", retry); @@ -131,27 +135,24 @@ } } -void USBHALHost::wait_attach() { +bool USBHALHost::wait_attach() { attach_done = false; USB0->INTEN = USB_INTEN_ATTACHEN_MASK; while(!attach_done); wait_ms(100); USB_TEST_ASSERT_FALSE(USB0->CTL & USB_CTL_SE0_MASK); - lowSpeed = (USB0->CTL & USB_CTL_JSTATE_MASK) ? false : true; - if (lowSpeed) { // low speed - USB0->ENDPOINT[0].ENDPT |= USB_ENDPT_HOSTWOHUB_MASK; - } - USB_DBG("lowSpeed=%d", lowSpeed); + root_lowSpeed = (USB0->CTL & USB_CTL_JSTATE_MASK) ? false : true; + return root_lowSpeed; } -void USBHALHost::setAddr(int _addr) { - USB0->ADDR = (lowSpeed ? USB_ADDR_LSEN_MASK : 0x00) | USB_ADDR_ADDR(_addr); +void USBHALHost::setAddr(int _addr, bool _lowSpeed) { + USB0->ADDR = (_lowSpeed ? USB_ADDR_LSEN_MASK : 0x00) | USB_ADDR_ADDR(_addr); } -void USBHALHost::setEndpoint(bool use_retry) { - USB0->ENDPOINT[0].ENDPT = (lowSpeed ? USB_ENDPT_HOSTWOHUB_MASK : 0x00)| +void USBHALHost::setEndpoint() { + USB0->ENDPOINT[0].ENDPT = (root_lowSpeed ? USB_ENDPT_HOSTWOHUB_MASK : 0x00)| + USB_ENDPT_RETRYDIS_MASK| USB_ENDPT_EPCTLDIS_MASK| - (use_retry ? 0x00 : USB_ENDPT_RETRYDIS_MASK)| USB_ENDPT_EPRXEN_MASK| USB_ENDPT_EPTXEN_MASK| USB_ENDPT_EPHSHK_MASK; @@ -163,9 +164,10 @@ } int USBHALHost::token_setup(USBEndpoint* ep, SETUP_PACKET* setup, uint16_t wLength) { + USBDeviceConnected* dev = ep->getDevice(); for(int retry = 0;; retry++) { token_ready(); - USB0->ENDPOINT[0].ENDPT = (lowSpeed ? USB_ENDPT_HOSTWOHUB_MASK : 0x00) | + USB0->ENDPOINT[0].ENDPT = (root_lowSpeed ? USB_ENDPT_HOSTWOHUB_MASK : 0x00) | USB_ENDPT_RETRYDIS_MASK| USB_ENDPT_EPRXEN_MASK| USB_ENDPT_EPTXEN_MASK| @@ -219,7 +221,7 @@ USB_TEST_ASSERT(ep->getData01() == LastStatus); ep->setData01(LastStatus == DATA0 ? DATA1 : DATA0); if (retry > 0) { - USB_DBG("len=%d retry=%d %02x", len, retry, prev_LastStatus); + //USB_DBG("len=%d retry=%d %02x", len, retry, prev_LastStatus); } return len; } else if (LastStatus == STALL) { @@ -395,12 +397,16 @@ } void debug_hex(uint8_t* buf, int size) { + int n = 0; for(int i = 0; i < size; i++) { fprintf(stderr, "%02x ", buf[i]); - if (i%16 == 15) { - fprintf(stderr, "\r\n"); + if (++n >= 16) { + fprintf(stderr, "\n"); + n = 0; } } - fprintf(stderr, "\r\n"); + if (n > 0) { + fprintf(stderr, "\n"); + } }