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
USBHostMSD.h
- Committer:
- va009039
- Date:
- 2014-01-23
- Revision:
- 2:0cdac6bcc534
- Parent:
- 1:c072d9e580b0
File content as of revision 2:0cdac6bcc534:
/* mbed USBHost Library * Copyright (c) 2006-2013 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef USBHOSTMSD_H #define USBHOSTMSD_H #if 0 #define USB_DBG(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\r\n");} while(0); #else #define USB_DBG(...) while(0); #endif #define USB_DBG2(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\r\n");} while(0); #if 1 #define USB_INFO(...) do{fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\r\n");}while(0); #else #define USB_INFO(...) while(0); #endif //#include "USBHostConf.h" enum USB_TYPE { USB_TYPE_OK = 0, // completion code USB_TYPE_STALL_ERROR = 4, // general usb state USB_TYPE_IDLE = 16, USB_TYPE_ERROR = 18, }; // ----------- Control RequestType Fields ----------- #define USB_DEVICE_TO_HOST 0x80 #define USB_HOST_TO_DEVICE 0x00 #define USB_REQUEST_TYPE_CLASS 0x20 #define USB_REQUEST_TYPE_STANDARD 0x00 #define USB_RECIPIENT_DEVICE 0x00 #define USB_RECIPIENT_INTERFACE 0x01 #define USB_RECIPIENT_ENDPOINT 0x02 // -------------- USB Standard Requests -------------- #define CLEAR_FEATURE 0x01 #include "USBHost.h" #include "FATFileSystem.h" class USBDeviceConnected { //dummy }; struct USBEndpoint { // dummy void setState(uint8_t st){}; uint8_t getAddress(){ return 0; }; }; /** * A class to communicate a USB flash disk */ class USBHostMSD : public FATFileSystem { public: /** * Constructor * * @param rootdir mount name */ USBHostMSD(const char * rootdir); /** * Check if a MSD device is connected * * @return true if a MSD device is connected */ bool connected(); /** * Try to connect to a MSD device * * @return true if connection was successful */ bool connect(); protected: // From FATFileSystem virtual int disk_initialize(); virtual int disk_status() {return 0;}; virtual int disk_read(uint8_t * buffer, uint64_t sector); virtual int disk_write(const uint8_t * buffer, uint64_t sector); virtual int disk_sync() {return 0;}; virtual uint64_t disk_sectors(); private: USBHost * host; USBDeviceConnected * dev; bool dev_connected; USBEndpoint * bulk_in; USBEndpoint * bulk_out; uint8_t nb_ep; // Bulk-only CBW typedef __packed struct { uint32_t Signature; uint32_t Tag; uint32_t DataLength; uint8_t Flags; uint8_t LUN; uint8_t CBLength; uint8_t CB[16]; } CBW; // Bulk-only CSW typedef __packed struct { uint32_t Signature; uint32_t Tag; uint32_t DataResidue; uint8_t Status; } CSW; CBW cbw; CSW csw; int SCSITransfer(uint8_t * cmd, uint8_t cmd_len, int flags, uint8_t * data, uint32_t transfer_len); int testUnitReady(); int readCapacity(); int inquiry(uint8_t lun, uint8_t page_code); int SCSIRequestSense(); int dataTransfer(uint8_t * buf, uint32_t block, uint8_t nbBlock, int direction); int checkResult(uint8_t res, USBEndpoint * ep); int getMaxLun(); int blockSize; uint64_t blockCount; int msd_intf; bool msd_device_found; bool disk_init; void init(); // KL46Z-USBHost interface USB_TYPE controlRead(USBDeviceConnected* dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len) { SETUP_PACKET setup = {requestType, request, value, index}; int result = host->ControlRead(&setup, buf, len); USB_DBG2("result=%d %02x", result, host->LastStatus); return (result >= 0) ? USB_TYPE_OK : USB_TYPE_ERROR; } USB_TYPE controlWrite(USBDeviceConnected* dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len) { SETUP_PACKET setup = {requestType, request, value, index}; int result = host->ControlWrite(&setup, buf, len); USB_DBG2("result=%d %02x", result, host->LastStatus); return (result >= 0) ? USB_TYPE_OK : USB_TYPE_ERROR; } USB_TYPE bulkRead(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true) { int result = host->BulkRead(buf, len); if (result >= 0) { return USB_TYPE_OK; } //USB_DBG2("result=%d %02x", result, host->LastStatus); return USB_TYPE_ERROR; } USB_TYPE bulkWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true) { int result = host->BulkWrite(buf, len); if (result >= 0) { return USB_TYPE_OK; } USB_DBG2("result=%d %02x", result, host->LastStatus); return USB_TYPE_ERROR; } }; #endif