USB device stack - modified

Dependents:   shaun_larada

Fork of USBDevice by mbed official

Committer:
setcom_001
Date:
Mon Jul 22 21:16:27 2013 +0000
Revision:
12:a9671b78d24e
docs update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
setcom_001 12:a9671b78d24e 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
setcom_001 12:a9671b78d24e 2 *
setcom_001 12:a9671b78d24e 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
setcom_001 12:a9671b78d24e 4 * and associated documentation files (the "Software"), to deal in the Software without
setcom_001 12:a9671b78d24e 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
setcom_001 12:a9671b78d24e 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
setcom_001 12:a9671b78d24e 7 * Software is furnished to do so, subject to the following conditions:
setcom_001 12:a9671b78d24e 8 *
setcom_001 12:a9671b78d24e 9 * The above copyright notice and this permission notice shall be included in all copies or
setcom_001 12:a9671b78d24e 10 * substantial portions of the Software.
setcom_001 12:a9671b78d24e 11 *
setcom_001 12:a9671b78d24e 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
setcom_001 12:a9671b78d24e 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
setcom_001 12:a9671b78d24e 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
setcom_001 12:a9671b78d24e 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
setcom_001 12:a9671b78d24e 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
setcom_001 12:a9671b78d24e 17 */
setcom_001 12:a9671b78d24e 18
setcom_001 12:a9671b78d24e 19 #include "stdint.h"
setcom_001 12:a9671b78d24e 20 #include "USBSerial.h"
setcom_001 12:a9671b78d24e 21 #include <stdarg.h>
setcom_001 12:a9671b78d24e 22
setcom_001 12:a9671b78d24e 23 USBSerial::USBSerial( uint16_t vendor_id, uint16_t product_id, uint16_t product_release )
setcom_001 12:a9671b78d24e 24 : USBCDC( vendor_id, product_id, product_release )
setcom_001 12:a9671b78d24e 25 , buf( 128 )
setcom_001 12:a9671b78d24e 26 #ifdef USB_ERRATA_WORKAROUND
setcom_001 12:a9671b78d24e 27 , _connect( P0_6 )
setcom_001 12:a9671b78d24e 28 , _vbus( P0_3 )
setcom_001 12:a9671b78d24e 29 #endif
setcom_001 12:a9671b78d24e 30 {
setcom_001 12:a9671b78d24e 31 #ifdef USB_ERRATA_WORKAROUND
setcom_001 12:a9671b78d24e 32 _connect = 1;
setcom_001 12:a9671b78d24e 33 #endif
setcom_001 12:a9671b78d24e 34 return;
setcom_001 12:a9671b78d24e 35 }
setcom_001 12:a9671b78d24e 36
setcom_001 12:a9671b78d24e 37 int USBSerial::_putc( int c )
setcom_001 12:a9671b78d24e 38 {
setcom_001 12:a9671b78d24e 39 send( ( uint8_t * )&c, 1 );
setcom_001 12:a9671b78d24e 40 return 1;
setcom_001 12:a9671b78d24e 41 }
setcom_001 12:a9671b78d24e 42
setcom_001 12:a9671b78d24e 43 int USBSerial::_getc()
setcom_001 12:a9671b78d24e 44 {
setcom_001 12:a9671b78d24e 45 uint8_t c;
setcom_001 12:a9671b78d24e 46
setcom_001 12:a9671b78d24e 47 while ( buf.isEmpty() );
setcom_001 12:a9671b78d24e 48
setcom_001 12:a9671b78d24e 49 buf.dequeue( &c );
setcom_001 12:a9671b78d24e 50 return c;
setcom_001 12:a9671b78d24e 51 }
setcom_001 12:a9671b78d24e 52
setcom_001 12:a9671b78d24e 53 void USBSerial::flush( void )
setcom_001 12:a9671b78d24e 54 {
setcom_001 12:a9671b78d24e 55 while( available() )
setcom_001 12:a9671b78d24e 56 {
setcom_001 12:a9671b78d24e 57 _getc();
setcom_001 12:a9671b78d24e 58 }
setcom_001 12:a9671b78d24e 59
setcom_001 12:a9671b78d24e 60 return;
setcom_001 12:a9671b78d24e 61 }
setcom_001 12:a9671b78d24e 62
setcom_001 12:a9671b78d24e 63 void USBSerial::printf( const char *format, ... )
setcom_001 12:a9671b78d24e 64 {
setcom_001 12:a9671b78d24e 65 static char buf[128];
setcom_001 12:a9671b78d24e 66 uint32_t len = 0;
setcom_001 12:a9671b78d24e 67 va_list arg;
setcom_001 12:a9671b78d24e 68
setcom_001 12:a9671b78d24e 69 if ( strlen( format ) < 64 )
setcom_001 12:a9671b78d24e 70 {
setcom_001 12:a9671b78d24e 71 va_start( arg, format );
setcom_001 12:a9671b78d24e 72 vsprintf( buf, format, arg );
setcom_001 12:a9671b78d24e 73 va_end( arg );
setcom_001 12:a9671b78d24e 74 // write to the peripheral
setcom_001 12:a9671b78d24e 75 len = strlen( buf );
setcom_001 12:a9671b78d24e 76 send( ( uint8_t * )buf, len );
setcom_001 12:a9671b78d24e 77 // and erase the buffer conents
setcom_001 12:a9671b78d24e 78 memset( buf, 0, len );
setcom_001 12:a9671b78d24e 79 }
setcom_001 12:a9671b78d24e 80
setcom_001 12:a9671b78d24e 81 return;
setcom_001 12:a9671b78d24e 82 }
setcom_001 12:a9671b78d24e 83
setcom_001 12:a9671b78d24e 84 bool USBSerial::writeBlock( uint8_t *buf, uint16_t size )
setcom_001 12:a9671b78d24e 85 {
setcom_001 12:a9671b78d24e 86 if( size > MAX_PACKET_SIZE_EPBULK )
setcom_001 12:a9671b78d24e 87 {
setcom_001 12:a9671b78d24e 88 return false;
setcom_001 12:a9671b78d24e 89 }
setcom_001 12:a9671b78d24e 90
setcom_001 12:a9671b78d24e 91 if( !send( buf, size ) )
setcom_001 12:a9671b78d24e 92 {
setcom_001 12:a9671b78d24e 93 return false;
setcom_001 12:a9671b78d24e 94 }
setcom_001 12:a9671b78d24e 95
setcom_001 12:a9671b78d24e 96 return true;
setcom_001 12:a9671b78d24e 97 }
setcom_001 12:a9671b78d24e 98
setcom_001 12:a9671b78d24e 99 bool USBSerial::writeBlock( const char *buf )
setcom_001 12:a9671b78d24e 100 {
setcom_001 12:a9671b78d24e 101 uint16_t cnt = 0;
setcom_001 12:a9671b78d24e 102
setcom_001 12:a9671b78d24e 103 while( buf[cnt++] != 0 );
setcom_001 12:a9671b78d24e 104
setcom_001 12:a9671b78d24e 105 return writeBlock( ( uint8_t * )buf, cnt );
setcom_001 12:a9671b78d24e 106 }
setcom_001 12:a9671b78d24e 107
setcom_001 12:a9671b78d24e 108 bool USBSerial::EP2_OUT_callback()
setcom_001 12:a9671b78d24e 109 {
setcom_001 12:a9671b78d24e 110 uint8_t c[65];
setcom_001 12:a9671b78d24e 111 uint32_t size = 0;
setcom_001 12:a9671b78d24e 112 //we read the packet received and put it on the circular buffer
setcom_001 12:a9671b78d24e 113 readEP( c, &size );
setcom_001 12:a9671b78d24e 114
setcom_001 12:a9671b78d24e 115 for ( int i = 0; i < size; i++ )
setcom_001 12:a9671b78d24e 116 {
setcom_001 12:a9671b78d24e 117 buf.queue( c[i] );
setcom_001 12:a9671b78d24e 118 }
setcom_001 12:a9671b78d24e 119
setcom_001 12:a9671b78d24e 120 //call a potential handler
setcom_001 12:a9671b78d24e 121 rx.call();
setcom_001 12:a9671b78d24e 122 // We reactivate the endpoint to receive next characters
setcom_001 12:a9671b78d24e 123 readStart( EPBULK_OUT, MAX_PACKET_SIZE_EPBULK );
setcom_001 12:a9671b78d24e 124 return true;
setcom_001 12:a9671b78d24e 125 }
setcom_001 12:a9671b78d24e 126
setcom_001 12:a9671b78d24e 127 uint8_t USBSerial::available()
setcom_001 12:a9671b78d24e 128 {
setcom_001 12:a9671b78d24e 129 return buf.available();
setcom_001 12:a9671b78d24e 130 }
setcom_001 12:a9671b78d24e 131
setcom_001 12:a9671b78d24e 132 #ifdef USB_ERRATA_WORKAROUND
setcom_001 12:a9671b78d24e 133 void USBSerial::connect( void )
setcom_001 12:a9671b78d24e 134 {
setcom_001 12:a9671b78d24e 135 _connect = 0;
setcom_001 12:a9671b78d24e 136 USBHAL::connect();
setcom_001 12:a9671b78d24e 137 return;
setcom_001 12:a9671b78d24e 138 }
setcom_001 12:a9671b78d24e 139 void USBSerial::disconnect( void )
setcom_001 12:a9671b78d24e 140 {
setcom_001 12:a9671b78d24e 141 _connect = 1;
setcom_001 12:a9671b78d24e 142 USBHAL::disconnect();
setcom_001 12:a9671b78d24e 143 return;
setcom_001 12:a9671b78d24e 144 }
setcom_001 12:a9671b78d24e 145 bool USBSerial::vbusDetected( void )
setcom_001 12:a9671b78d24e 146 {
setcom_001 12:a9671b78d24e 147 return _vbus;
setcom_001 12:a9671b78d24e 148 }
setcom_001 12:a9671b78d24e 149 #endif
setcom_001 12:a9671b78d24e 150
setcom_001 12:a9671b78d24e 151