USB device stack - modified
Fork of USBDevice by
Diff: USBSerial/USBSerial.cpp
- Revision:
- 12:a9671b78d24e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBSerial/USBSerial.cpp Mon Jul 22 21:16:27 2013 +0000 @@ -0,0 +1,151 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include "stdint.h" +#include "USBSerial.h" +#include <stdarg.h> + +USBSerial::USBSerial( uint16_t vendor_id, uint16_t product_id, uint16_t product_release ) + : USBCDC( vendor_id, product_id, product_release ) + , buf( 128 ) +#ifdef USB_ERRATA_WORKAROUND + , _connect( P0_6 ) + , _vbus( P0_3 ) +#endif +{ +#ifdef USB_ERRATA_WORKAROUND + _connect = 1; +#endif + return; +} + +int USBSerial::_putc( int c ) +{ + send( ( uint8_t * )&c, 1 ); + return 1; +} + +int USBSerial::_getc() +{ + uint8_t c; + + while ( buf.isEmpty() ); + + buf.dequeue( &c ); + return c; +} + +void USBSerial::flush( void ) +{ + while( available() ) + { + _getc(); + } + + return; +} + +void USBSerial::printf( const char *format, ... ) +{ + static char buf[128]; + uint32_t len = 0; + va_list arg; + + if ( strlen( format ) < 64 ) + { + va_start( arg, format ); + vsprintf( buf, format, arg ); + va_end( arg ); + // write to the peripheral + len = strlen( buf ); + send( ( uint8_t * )buf, len ); + // and erase the buffer conents + memset( buf, 0, len ); + } + + return; +} + +bool USBSerial::writeBlock( uint8_t *buf, uint16_t size ) +{ + if( size > MAX_PACKET_SIZE_EPBULK ) + { + return false; + } + + if( !send( buf, size ) ) + { + return false; + } + + return true; +} + +bool USBSerial::writeBlock( const char *buf ) +{ + uint16_t cnt = 0; + + while( buf[cnt++] != 0 ); + + return writeBlock( ( uint8_t * )buf, cnt ); +} + +bool USBSerial::EP2_OUT_callback() +{ + uint8_t c[65]; + uint32_t size = 0; + //we read the packet received and put it on the circular buffer + readEP( c, &size ); + + for ( int i = 0; i < size; i++ ) + { + buf.queue( c[i] ); + } + + //call a potential handler + rx.call(); + // We reactivate the endpoint to receive next characters + readStart( EPBULK_OUT, MAX_PACKET_SIZE_EPBULK ); + return true; +} + +uint8_t USBSerial::available() +{ + return buf.available(); +} + +#ifdef USB_ERRATA_WORKAROUND +void USBSerial::connect( void ) +{ + _connect = 0; + USBHAL::connect(); + return; +} +void USBSerial::disconnect( void ) +{ + _connect = 1; + USBHAL::disconnect(); + return; +} +bool USBSerial::vbusDetected( void ) +{ + return _vbus; +} +#endif + +