2017-08-23 16 views
0

Je travaille sur le téléchargement à Digispark board. Il utilise micronucleus bootloader et je peux voir uploader code. Je l'ai modifié un peu pour voir les interfaces et les points d'extrémité comptent:Comment fonctionne l'interaction avec un périphérique CDC sans point de terminaison d'interface?

nucleus->device = usb_open(dev); 

    // added by me - start 
    int interfaces, endpoints, j; 
    struct usb_interface_descriptor *interface = NULL; 

    interfaces = dev->config->bNumInterfaces; 
    fprintf(stderr, "Found interfaces: %i\n", interfaces); 

    interface = &(dev->config->interface[0].altsetting[0]); 
    fprintf(stderr, "Endpoints: %i\n", interface->bNumEndpoints); 
    // added by me - end 

    // get nucleus info 
    unsigned char buffer[4]; 
    int res = usb_control_msg(nucleus->device, USB_ENDPOINT_IN| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, 0, (char *)buffer, 4, MICRONUCLEUS_USB_TIMEOUT); 

Je me demande comment il fonctionne parce que l'interface # 0 n'a aucun point de terminaison:

$./micronucleus --type intel-hex /tmp/Start.ino.hex 
> Please plug in the device ... 
> Press CTRL+C to terminate the program. 
Found interfaces: 1 
Endpoints: 0 
> Device is found! 
connecting: 40% complete 
> Device has firmware version 1.6 
> Available space for user applications: 6012 bytes 
> Suggested sleep time between sending pages: 8ms 
> Whole page count: 94 page size: 64 
> Erase function sleep duration: 752ms 
parsing: 60% complete 
> Erasing the memory ... 
erasing: 80% complete 
> Starting to upload ... 
writing: 100% complete 
>> Micronucleus done. Thank you! 

En général, je pense interfacer avoir 2 points d'extrémité (en & à partir usb.h):

#define USB_ENDPOINT_IN   0x80 
#define USB_ENDPOINT_OUT  0x00 

quelqu'un peut-il me expliquer comment usb_control_msg(nucleus->device, USB_ENDPOINT_IN| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, 0, (char *)buffer, 4, MICRONUCLEUS_USB_TIMEOUT); travaille sans point final?

Répondre