по ждущим блокировкам - не знаю как в linux, в qnx было например так:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено xc164 07 февраля 2004 г. 19:53
В ответ на: на всякий случай... отправлено xc164 07 февраля 2004 г. 19:46


void prn_bulk_cbf( struct usbd_urb *urb, struct usbd_pipe *pipe, void *hdl )
{
pipe = pipe, hdl = hdl;

pthread_sleepon_lock( );
pthread_sleepon_signal( urb );
pthread_sleepon_unlock( );

return;
}

int prn_bulk_wait( prn_t *prn, struct usbd_urb *urb, struct usbd_pipe *pipe )
{
_uint32 ustatus;
_uint32 alen;

pthread_sleepon_lock( );
while( usbd_urb_status( urb, &ustatus, &alen ) == EBUSY &&
!( prn->status & PRN_UNBLOCK ) ) {
pthread_sleepon_wait( urb );
}
pthread_sleepon_unlock( );

// check for a stall condition and clear it
if( ( ustatus & USBD_USB_STATUS_MASK ) == USBD_STATUS_STALL ) {
usbd_reset_pipe( pipe );
}

if( prn->status & PRN_UNBLOCK ) {
return( EINTR );
}

return( ( ustatus & USBD_URB_STATUS_MASK ) == USBD_STATUS_CMP ? EOK : EIO );
}
int prn_io( prn_t *prn, struct usbd_pipe *pipe, _uint32 flags, _uint8 *buffer, _uint32 length )
{
_uint32 status;

usbd_setup_bulk( prn->urb, flags, buffer, length );
usbd_setup_control(prn->urb, flags, 0, 0, 0, 0, buffer, length );
if( ( status = usbd_io( prn->urb, pipe, prn_bulk_cbf, prn, USBD_TIME_INFINITY ) ) == EOK ) {
return( prn_bulk_wait( prn, prn->urb, pipe ) );
}
return( status );
}


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

Ответы



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

E-mail: info@telesys.ru