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 USBHOSTSERIAL_H
# define USBHOSTSERIAL_H
# include "USBHostConf.h"
# if USBHOST_SERIAL
# include "USBHost.h"
# include "Stream.h"
# include "MtxCircBuffer.h"
2016-09-06 17:31:20 +00:00
# include "Callback.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 virtual serial port
*/
2013-12-09 21:04:21 +00:00
class USBHostSerialPort : public Stream {
2013-03-14 16:12:24 +00:00
public :
/**
* Constructor
*/
2013-12-09 21:04:21 +00:00
USBHostSerialPort ( ) ;
2013-03-14 16:12:24 +00:00
enum IrqType {
RxIrq ,
TxIrq
} ;
2014-05-29 13:16:53 +00:00
2013-03-14 16:12:24 +00:00
enum Parity {
None = 0 ,
Odd ,
Even ,
Mark ,
Space
} ;
2014-05-29 13:16:53 +00:00
void connect ( USBHost * _host , USBDeviceConnected * _dev ,
2013-12-09 21:04:21 +00:00
uint8_t _serial_intf , USBEndpoint * _bulk_in , USBEndpoint * _bulk_out ) ;
2013-03-14 16:12:24 +00:00
/**
* Check the number of bytes available .
*
* @ returns the number of bytes available
*/
2014-05-29 13:16:53 +00:00
uint8_t available ( ) ;
2013-03-14 16:12:24 +00:00
/**
* Attach a member function to call when a packet is received .
*
* @ param tptr pointer to the object to call the member function on
* @ param mptr pointer to the member function to be called
* @ param irq irq type
*/
template < typename T >
inline void attach ( T * tptr , void ( T : : * mptr ) ( void ) , IrqType irq = RxIrq ) {
if ( ( mptr ! = NULL ) & & ( tptr ! = NULL ) ) {
if ( irq = = RxIrq ) {
rx . attach ( tptr , mptr ) ;
} else {
tx . attach ( tptr , mptr ) ;
}
}
}
/**
* Attach a callback called when a packet is received
*
* @ param ptr function pointer
*/
inline void attach ( void ( * fn ) ( void ) , IrqType irq = RxIrq ) {
if ( fn ! = NULL ) {
if ( irq = = RxIrq ) {
rx . attach ( fn ) ;
} else {
tx . attach ( fn ) ;
}
}
}
2014-05-29 13:16:53 +00:00
2013-03-14 16:12:24 +00:00
/** Set the baud rate of the serial port
*
* @ param baudrate The baudrate of the serial port ( default = 9600 ) .
*/
void baud ( int baudrate = 9600 ) ;
2014-05-29 13:16:53 +00:00
2013-03-14 16:12:24 +00:00
/** Set the transmission format used by the Serial port
*
* @ param bits The number of bits in a word ( default = 8 )
2013-12-09 21:04:21 +00:00
* @ param parity The parity used ( USBHostSerialPort : : None , USBHostSerialPort : : Odd , USBHostSerialPort : : Even , USBHostSerialPort : : Mark , USBHostSerialPort : : Space ; default = USBHostSerialPort : : None )
2013-03-14 16:12:24 +00:00
* @ param stop The number of stop bits ( 1 or 2 ; default = 1 )
*/
2013-12-09 21:04:21 +00:00
void format ( int bits = 8 , Parity parity = USBHostSerialPort : : None , int stop_bits = 1 ) ;
virtual int writeBuf ( const char * b , int s ) ;
virtual int readBuf ( char * b , int s ) ;
2013-03-14 16:12:24 +00:00
protected :
virtual int _getc ( ) ;
virtual int _putc ( int c ) ;
2014-05-29 13:16:53 +00:00
2013-03-14 16:12:24 +00:00
private :
USBHost * host ;
USBDeviceConnected * dev ;
2013-12-09 21:04:21 +00:00
2013-03-14 16:12:24 +00:00
USBEndpoint * bulk_in ;
USBEndpoint * bulk_out ;
uint32_t size_bulk_in ;
uint32_t size_bulk_out ;
void init ( ) ;
2013-12-09 21:04:21 +00:00
MtxCircBuffer < uint8_t , 128 > circ_buf ;
2013-03-14 16:12:24 +00:00
uint8_t buf [ 64 ] ;
2013-08-29 19:48:20 +00:00
typedef struct {
2013-03-14 16:12:24 +00:00
uint32_t baudrate ;
uint8_t stop_bits ;
uint8_t parity ;
uint8_t data_bits ;
2013-08-29 19:48:20 +00:00
} PACKED LINE_CODING ;
2014-05-29 13:16:53 +00:00
2013-03-14 16:12:24 +00:00
LINE_CODING line_coding ;
void rxHandler ( ) ;
void txHandler ( ) ;
2016-09-06 17:31:20 +00:00
Callback < void ( ) > rx ;
Callback < void ( ) > tx ;
2013-03-14 16:12:24 +00:00
2013-12-09 21:04:21 +00:00
uint8_t serial_intf ;
} ;
# if (USBHOST_SERIAL <= 1)
2014-05-29 13:16:53 +00:00
class USBHostSerial : public IUSBEnumerator , public USBHostSerialPort
2013-12-09 21:04:21 +00:00
{
2014-05-29 13:16:53 +00:00
public :
2013-12-09 21:04:21 +00:00
USBHostSerial ( ) ;
2014-05-29 13:16:53 +00:00
2013-12-09 21:04:21 +00:00
/**
* Try to connect a serial device
*
* @ return true if connection was successful
*/
bool connect ( ) ;
2014-05-29 13:16:53 +00:00
2013-12-09 21:04:21 +00:00
void disconnect ( ) ;
/**
* Check if a any serial port is connected
*
* @ returns true if a serial device is connected
*/
bool connected ( ) ;
2014-05-29 13:16:53 +00:00
2013-12-09 21:04:21 +00:00
protected :
USBHost * host ;
USBDeviceConnected * dev ;
uint8_t port_intf ;
int ports_found ;
//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
2014-05-29 13:16:53 +00:00
2013-12-09 21:04:21 +00:00
private :
bool dev_connected ;
} ;
# else // (USBHOST_SERIAL > 1)
class USBHostMultiSerial : public IUSBEnumerator {
2014-05-29 13:16:53 +00:00
public :
2013-12-09 21:04:21 +00:00
USBHostMultiSerial ( ) ;
virtual ~ USBHostMultiSerial ( ) ;
2014-05-29 13:16:53 +00:00
USBHostSerialPort * getPort ( int port )
{
return port < USBHOST_SERIAL ? ports [ port ] : NULL ;
2013-12-09 21:04:21 +00:00
}
2013-03-14 16:12:24 +00:00
2013-12-09 21:04:21 +00:00
/**
* Try to connect a serial device
*
* @ return true if connection was successful
*/
bool connect ( ) ;
2014-05-29 13:16:53 +00:00
2013-12-09 21:04:21 +00:00
void disconnect ( ) ;
/**
* Check if a any serial port is connected
*
* @ returns true if a serial device is connected
*/
bool connected ( ) ;
2014-05-29 13:16:53 +00:00
2013-12-09 21:04:21 +00:00
protected :
USBHost * host ;
USBDeviceConnected * dev ;
USBHostSerialPort * ports [ USBHOST_SERIAL ] ;
uint8_t port_intf [ USBHOST_SERIAL ] ;
int ports_found ;
//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
2014-05-29 13:16:53 +00:00
2013-12-09 21:04:21 +00:00
private :
bool dev_connected ;
2013-03-14 16:12:24 +00:00
} ;
2013-12-09 21:04:21 +00:00
# endif // (USBHOST_SERIAL <= 1)
2013-03-14 16:12:24 +00:00
# endif
# endif