Example #1
0
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();
}
Example #2
0
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);