реклама на сайте
подробности

 
 
> Драйверы USB TMC для linux
_galb_
сообщение Oct 3 2012, 09:52
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 22-08-12
Пользователь №: 73 215



Доброго дня всем!
Нужно создать драйвер устройства USB TMC (Test and Measurement Class) Gadget, ОС linux (дистрибутив linux-davinci), процессор AM1808 от TI.
Есть ли здесь у кого опыт создания устройств usb gadget для linux? Есть вопросы...

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_galb_
сообщение Oct 24 2012, 05:07
Сообщение #2





Группа: Участник
Сообщений: 12
Регистрация: 22-08-12
Пользователь №: 73 215



gosha, ещё вопрос... в своём драйвере Вы использовали потоки (thread), или можно без них обойтись?
Go to the top of the page
 
+Quote Post
gosha
сообщение Oct 24 2012, 07:18
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30



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)

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 23:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016