2013-03-14 16:12:24 +00:00
/* 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
# include "USBHostConf.h"
# if USBHOST_MSD
# include "USBHost.h"
# include "FATFileSystem.h"
2017-04-26 12:38:14 +00:00
# include "BlockDevice.h"
2013-03-14 16:12:24 +00:00
2014-05-29 13:16:53 +00:00
/**
2013-03-14 16:12:24 +00:00
* A class to communicate a USB flash disk
*/
2017-04-26 12:38:14 +00:00
class USBHostMSD : public IUSBEnumerator , public BlockDevice
{
2013-03-14 16:12:24 +00:00
public :
/**
2017-04-26 12:38:14 +00:00
* Constructor
*
* @ param rootdir mount name
*/
USBHostMSD ( ) ;
2013-03-14 16:12:24 +00:00
/**
2017-04-26 12:38:14 +00:00
* Check if a MSD device is connected
*
* @ return true if a MSD device is connected
*/
2013-03-14 16:12:24 +00:00
bool connected ( ) ;
/**
* Try to connect to a MSD device
*
* @ return true if connection was successful
*/
bool connect ( ) ;
2017-04-26 12:38:14 +00:00
virtual int init ( ) ;
virtual int deinit ( )
{
return BD_ERROR_OK ;
} ;
virtual int read ( void * buffer , bd_addr_t addr , bd_size_t size ) ;
virtual int program ( const void * buffer , bd_addr_t addr , bd_size_t size ) ;
virtual int erase ( bd_addr_t addr , bd_size_t size ) ;
virtual bd_size_t get_read_size ( ) const ;
virtual bd_size_t get_program_size ( ) const ;
virtual bd_size_t get_erase_size ( ) const ;
virtual bd_size_t size ( ) const ;
2013-03-14 16:12:24 +00:00
protected :
//From IUSBEnumerator
virtual void setVidPid ( uint16_t vid , uint16_t pid ) ;
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
virtual bool useEndpoint ( uint8_t intf_nb , ENDPOINT_TYPE type , ENDPOINT_DIRECTION dir ) ; //Must return true if the endpoint will be used
private :
USBHost * host ;
USBDeviceConnected * dev ;
bool dev_connected ;
USBEndpoint * bulk_in ;
USBEndpoint * bulk_out ;
uint8_t nb_ep ;
// Bulk-only CBW
2013-08-29 19:48:20 +00:00
typedef struct {
2013-03-14 16:12:24 +00:00
uint32_t Signature ;
uint32_t Tag ;
uint32_t DataLength ;
uint8_t Flags ;
uint8_t LUN ;
uint8_t CBLength ;
uint8_t CB [ 16 ] ;
2013-08-29 19:48:20 +00:00
} PACKED CBW ;
2013-03-14 16:12:24 +00:00
// Bulk-only CSW
2013-08-29 19:48:20 +00:00
typedef struct {
2013-03-14 16:12:24 +00:00
uint32_t Signature ;
uint32_t Tag ;
uint32_t DataResidue ;
uint8_t Status ;
2013-08-29 19:48:20 +00:00
} PACKED CSW ;
2013-03-14 16:12:24 +00:00
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 ;
2015-11-26 16:59:52 +00:00
uint32_t blockCount ;
2013-03-14 16:12:24 +00:00
int msd_intf ;
bool msd_device_found ;
bool disk_init ;
2014-05-29 13:16:53 +00:00
2017-04-26 12:38:14 +00:00
void init_usb ( ) ;
2013-03-14 16:12:24 +00:00
} ;
# endif
# endif