QUOTE (_galb_ @ Oct 24 2012, 09:07)

gosha, ещё вопрос... в своём драйвере Вы использовали потоки (thread), или можно без них обойтись?
При написании драйверов не используются thread.
При написании драйверов USB используются только call-back ф-ии, которые вызывает usb-core, когда устройство прислало ответ на команду.
я использовал ф-ии usb_submit_urb(urb) для обмена данными с устройством.
Например:
CODE
/*============================================================================*/
static void uvc_video_complete(struct urb *urb)
{struct uvc_video_device *video = urb->context;
struct uvc_video_queue *queue = &video->queue;
int ret;
if (video->removed)
return;
switch (urb->status)
{case 0:
break;
default:
uvc_printk(KERN_WARNING, "Non-zero status (%d) in video completion handler.\n", urb->status);
case -ENOENT: /* usb_unlink_urb() called. */
if (video->frozen)
return;
case -ECONNRESET: /* usb_unlink_urb() called. */
case -ESHUTDOWN: /* The endpoint is being disabled. */
uvc_queue_enable(queue, 0);
return;
}
if(queue->flags & UVC_QUEUE_STREAMING)
{struct uvc_buffer *buf = NULL;
unsigned long flags;
spin_lock_irqsave(&queue->irqlock, flags);
buf= &queue->buffer[queue->buf_tail];
spin_unlock_irqrestore(&queue->irqlock, flags);
video->decode(urb, video, buf);
urb->dev = video->uvc_dev->udev;
urb->status = 0;
if ((ret = usb_submit_urb(urb)) < 0)
{uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n", ret);}
}
return;
}
/*=================================================*/
urb = usb_alloc_urb(npackets<<4);
urb->dev = video->uvc_dev->udev;
urb->context = video;
urb->pipe = usb_rcvisocpipe(video->uvc_dev->udev, ep->bEndpointAddress);
urb->transfer_flags = USB_ISO_ASAP;
urb->interval = 1;//ep->bInterval;
urb->transfer_buffer = video->urb_buffer[i];
urb->complete = uvc_video_complete; /* эта функция будет вызвана, когда вернется ответ (данные от устройства) */
urb->number_of_packets = npackets;
urb->transfer_buffer_length = size;
if ((ret = usb_submit_urb(urb)) < 0)
{uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n", ret);}
Прикладная программа обращается к драйверу через системные вызовы
open()
close()
read()
write()
ioctl()
poll()
Соответственно, необходимо в драйвере написать эти ф-ии, которые будут вызываться ядром ОС Linux при обращении к устройству прикладной программы. И зарегистрировать их в системе.
Для драйвера usb видеокамеры у меня:
CODE
struct file_operations uvc_fops = {
.owner = THIS_MODULE,
.open = uvc_v4l2_open,
.release = uvc_v4l2_release,
.ioctl = uvc_v4l2_ioctl,
.llseek = no_llseek,
.read = uvc_v4l2_read,
.mmap = uvc_v4l2_mmap,
.poll = uvc_v4l2_poll,
}
video_register_device (uvc_fops)