void usbFunctionWriteOut( uchar *data, uchar len ) { /* usb -> rs232c: transmit char */ for( ; len; len-- ) { uchar uwnxt; uwnxt = (uwptr+1) & TX_MASK; if( uwnxt!=irptr ) { tx_buf[uwptr] = *data++; uwptr = uwnxt; } } /* postpone receiving next data */ if( uartTxBytesFree()<=HW_CDC_BULK_OUT_SIZE ) usbDisableAllRequests(); }
void usbFunctionWriteOut( uchar *data, uchar len ) { /* postpone receiving next data */ usbDisableAllRequests(); /* host -> device: request */ do { char c; // delimiter? c = *data++; if( c>0x20 ) { if( 'a'<=c && c<='z' ) c -= 0x20; // to upper case rbuf[rcnt++] = c; rcnt &= 7; continue; } if( rcnt==0 ) continue; // command if( rcnt==1 ) { char *ptr; volatile uchar *addr = (uchar *)((unsigned int)tos); uchar x; switch( rbuf[0] ) { case '@': // who ptr = PSTR( CMD_WHO ); while( (c=pgm_read_byte(ptr++))!=0 ) { out_char(c); } break; case '?': // get x = *addr; out_char( u2h(x>>4) ); out_char( u2h(x&0x0f) ); break; case '=': // set cli(); *addr = val; sei(); break; case '$': // set twice cli(); *addr = val; *addr = val2; sei(); break; case '&': // and & set cli(); *addr &= val; sei(); break; case '|': // or & set cli(); *addr |= val; sei(); break; case '^': // xor & set cli(); *addr ^= val; sei(); break; default: // error out_char( '!' ); } out_char( '\r' ); out_char( '\n' ); rcnt = 0; continue; } // number if( rcnt==2 ) { val2 = val; val = tos; tos = (h2u(rbuf[0])<<4) | h2u(rbuf[1]); rcnt = 0; continue; } // sfr if( rcnt>=4 ) { val2 = val; val = tos; #if defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || !defined PORTC tos = 0x30 + ( 'D' - rbuf[--rcnt] ) * 3; #else tos = 0x20 + ( rbuf[--rcnt] - 'A' ) * 3; #endif rbuf[rcnt] = 0; if( !strcmp_P(rbuf,PSTR("PIN")) ) tos += 0; else if( !strcmp_P(rbuf,PSTR("DDR")) ) tos += 1; else if( !strcmp_P(rbuf,PSTR("PORT")) ) tos += 2; else tos = 0x20; // error rcnt = 0; } } while(--len);