Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено xc164 16 апреля 2004 г. 13:13
В ответ на: протокол верхнего уровня USB и его реализации в ОС. отправлено alex_visualusb-- 16 апреля 2004 г. 11:57


int prn_parse_descriptors( prn_t *prn )
{
_uint32 eix;
_uint32 scan;
_uint32 found;
usbd_descriptors_t *desc;
usbd_device_descriptor_t *ddesc;
usbd_interface_descriptor_t *idesc;
struct usbd_desc_node *dev, *ifc, *ept;

scan = PRN_CONTROL_EP | PRN_BULKIN_EP | PRN_BULKOUT_EP;
found = 0;

if( ddesc = usbd_device_descriptor( prn->device, &dev ) ) {
prn->bcdUSB = ddesc->bcdUSB;
if( idesc = usbd_interface_descriptor( prn->device, prn->instance.config, prn->instance.iface, prn->instance.alternate, &ifc ) ) {
if( ( prn->protocol = idesc->bInterfaceProtocol ) == USB_PROTOCOL_PRN_BIDIR ) {
scan |= PRN_BULKIN_EP;
}
for( eix = 0; ( desc = usbd_parse_descriptors( prn->device, ifc, USB_DESC_ENDPOINT, eix, &ept ) ) != NULL; ++eix ) {
switch( desc->endpoint.bmAttributes ) {
case USB_ATTRIB_CONTROL:
if( usbd_open_pipe( prn->device, desc, &prn->ep_cntl ) == EOK ) {
found |= PRN_CONTROL_EP;
}
break;

case USB_ATTRIB_ISOCHRONOUS:
break;

case USB_ATTRIB_BULK:
switch( desc->endpoint.bEndpointAddress & USB_ENDPOINT_IN ) {
case USB_ENDPOINT_OUT:
if( usbd_open_pipe( prn->device, desc,
&prn->ep_out ) == EOK ) {
found |= PRN_BULKOUT_EP;
}
break;

case USB_ENDPOINT_IN:
if( ( scan & PRN_BULKIN_EP ) &&
usbd_open_pipe( prn->device, desc,
&prn->ep_in ) == EOK ) {
found |= PRN_BULKIN_EP;
}
break;
}
break;

case USB_ATTRIB_INTERRUPT:
break;
}
}
}
}
return( ( found == scan ) ? EOK : ENODEV );
}
void prn_insertion( struct usbd_connection *connection, usbd_device_instance_t *instance )
{
prn_t *prn;
struct usbd_device *device;
int status;

if( ( status = usbd_attach( connection, instance, sizeof( prn_t ), &device ) ) == EOK ) {
prn = usbd_device_extra( device );
prn->device = device;
prn->instance = *instance;
if( prn_parse_descriptors( prn ) == EOK ) {
if( prn->buffer = usbd_alloc( PRN_BUFFER_SIZE ) ) {
if( prn->urb = usbd_alloc_urb( NULL ) ) {
if( prn_resmgr_attach( prn ) == EOK ) {
prn->status = PRN_PRESENT;
TAILQ_INSERT_TAIL( &PrnCtrl.dlist, prn, dlink );
return;
}
usbd_free_urb( prn->urb );
}
usbd_free( prn->buffer );
}
}
usbd_detach( device );
}
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru