Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » USB enumeration для любого мк


USB enumeration для любого мк

Сообщений 1 страница 3 из 3

1

Код:
const char usb_device_descriptor[] = { ... };
const char usb_configuration_descriptor[] = { ... };
const char usb_language_string[] = { ... };
const char usb_product_string[] = { ... };
const char usb_serial_string[] = { ... };
const char usb_status[] = { ... };

struct {
    int address;
    int data_length;
    const char *data_pointer;
} usb_context;
Код:
int usb_request ( char *buf ) {
    const char *ptr = 0;
    int req = buf[0] | buf[1] << 8;
    if( req == 0x680 /* get descriptor */ ) {
        switch( buf[2] | buf[3] << 8 ) {
            case 0x100 : { ptr = usb_device_descriptor;        break; }
            case 0x200 : { ptr = usb_configuration_descriptor; break; }
            case 0x300 : { ptr = usb_language_string;          break; }
            case 0x302 : { ptr = usb_product_string;           break; }
            case 0x303 : { ptr = usb_serial_string;            break; }
            default : return 0;
        }
    } else if( req == 0x80 || req == 0x81 || req == 0x82 /* get status */ ) {
        ptr = usb_status;
    } else if( req == 0x500 /* set address */ ) {
        usb_context.address = buf[2];
    } else if( req == 0x100 || req == 0x101 || req == 0x102 /* clear future */
            || req == 0x300 || req == 0x301 || req == 0x302 /* set future */
            || req == 0x900 /* set configuration */
            || req == 0xB01 /* set interface */ ) {
    } else {
        return 0;
    }
    if( ptr ) {
        int len = buf[6] | buf[7] << 8;
        usb_context.data_length = len < *ptr ? len : *ptr;
        usb_context.data_pointer = ptr + 1;
    } else {
        usb_context.data_length = 0;
    }
    return req;
}
Код:
int usb_reply ( char *buf, int max ) {
    int len = usb_context.data_length;
    if( len > 0 ) {
        int n = len < max ? len : max;
        for( int i = 0; i < n; i++ ) buf[i] = *usb_context.data_pointer++;
        usb_context.data_length -= max;
        return n;
    } else if( len == 0 ) {
        usb_context.data_length = -1;
        return 0;
    } else {
        return -1;
    }
}

2

Пример для stm32 usb fs device

Код:
#define USB_EP_NAK 0xA0A0
#define USB_EP_STALL 0x9090
#define USB_EP0_SIZE 8
char usb_buf[USB_EP0_SIZE];
Код:
int n;
if( USB->ISTR_b.RESET ) {
    ...
} else if( USB->EP0R_b.CTR_RX ) {
    if( USB->EP0R_b.SETUP ) {
        usb_get( 0, usb_buf, 8 );
        if( usb_request( usb_buf )) {
            n = usb_reply( usb_buf, USB_EP0_SIZE );
            usb_put( 0, usb_buf, n );
        } else {
            USB->EP0R ^= USB_EP_STALL;
        }
    } else {
        USB->EP0R ^= USB_EP_NAK;
    }
} else if( USB->EP0R_b.CTR_TX ) {
    if( usb_context.address ) {
        USB->DADDR = usb_context.address | 0x80;
        usb_context.address = 0;
    }
    n = usb_reply( usb_buf, USB_EP0_SIZE );
    if( n < 0) {
        USB->EP0R ^= USB_EP_NAK;
    } else {
        usb_put( 0, usb_buf, n );
    }
}

3

Пример для ch55

Код:
#define USB_EP0_SIZE 8
__xdata uint8_t usb_buf0[USB_EP0_SIZE];
Код:
void usb_trans ( void ) {
    uint8_t s = USB_INT_ST & 0x3F;
    if( s == 0x30 ) {                   /* r setup */
        if( usb_request( usb_buf0 ) ) {
            UEP0_T_LEN = usb_reply( usb_buf0, USB_EP0_SIZE );
            UEP0_CTRL  = 0xC0;          /* r-data1 t-data1 r-ack t-ack */
        } else {
            UEP0_CTRL = 0xF;            /* r-stall t-stall */
        }
    } else if( s == 0 ) {               /* r out0 */
        UEP0_CTRL = 0xA;                /* r-nak t-nak */
    } else if( s == 0x20 ) {            /* t in0 */
        if( usb_context.address ) {
            USB_DEV_AD = usb_context.address;
            usb_context.address = 0;
        }
        int n = usb_reply( usb_buf0, USB_EP0_SIZE );
        if( n < 0 ) {
            UEP0_CTRL = 2;              /* r-ack t-nak */
        } else {
            UEP0_T_LEN = n;
            UEP0_CTRL ^= 0x40;          /* t-data */
        }
    }
    ...
    UIF_TRANS = 0;
}
Код:
void usb_interrupt ( void ) __interrupt ( 8 ) {
    if( UIF_RESET ) usb_reset();
    if( UIF_TRANS ) usb_trans();
}

Вы здесь » Микроконтроллеры » Архив » USB enumeration для любого мк