linux �ں��е� USB ��������е� USB �豸ͨѶʹ�ó�Ϊ urb �Ķ���( USB request block). ���������� struct urb �ṹ�������ҿ��� include/linux/usb.h ���ҵ�.

һ�� urb �������ͻ�������ݵ����ߴ�һ���ض� USB �豸�ϵ��ض��� USB �˵�, ��һ���첽�ķ�ʽ. ���������dz���һ�� kiocb �ṹ�������ļ�ϵͳ�첽 I/O ����, ������ͬһ�� struct skbuff �������������. һ�� USB �豸�������ܷ������� urb ��һ���˵���߿������õ��� urb �������ͬ�Ķ˵�, ������������Ҫ. �豸�е�ÿ���˵㶼����һ�� urb ����, �����ڶ�� urb �ɱ����͵���ͬ�Ķ˵�, �ڶ������֮ǰ. һ�� urb �ĵ�������ѭ������:

urb Ҳ�ɱ��ύ��� urb ���������κ�ʱ��ȡ��, ���߱� USB ��������豸����ϵͳ���Ƴ�. urb ����̬�������Ұ���һ���ڲ����ü���, ʹ��������� urb �����һ���û��ͷ���ʱ���Զ��ͷ�.

�����������Ĵ��� urb �Ĺ��������õ�, ��Ϊ�����������������ӵ�, ������ͨѶ�����������������߿��ܵ����ݴ����ٶ�. �����и����鷳�Ĺ��̿���, �����ֻ���뷢�͵����Ŀ���߿�����Ϣ, ���Ҳ���������������.(��"USB ���Ͳ��� urb"һ��).

13.3.1. �ṹ struct urb

struct urb �ṹ�к� USB �豸�����йصij�Ա��:

struct usb_device *dev

ָ����� urb Ҫ���͵��� struct usb_device ��ָ��. ����������뱻 USB ������ʼ��, ����� urb �����͵� USB ����֮ǰ.

unsigned int pipe

�˵���Ϣ, ����� urb Ҫ�����͵����ض� struct usb_device. ����������뱻 USB ������ʼ��, ����� urb �����͵� USB ����֮ǰ.

Ϊ��������ṹ�ij�Ա, ����ʹ������ĺ������ʵ���, ���������ķ���. ע��ÿ���˵�ֻ����һ������.

unsigned int usb_sndctrlpipe(struct usb_device *dev, unsigned int endpoint)

ָ��һ������ OUT �˵���ض��Ĵ����ض��˵�ŵ� USB �豸.

unsigned int usb_rcvctrlpipe(struct usb_device *dev, unsigned int endpoint)

ָ��һ������ IN �˵�������ض��˵�ŵ��ض� USB �豸.

unsigned int usb_sndbulkpipe(struct usb_device *dev, unsigned int endpoint)

ָ��һ���� OUT �˵�������ض��˵�ŵ��ض� USB �豸

unsigned int usb_rcvbulkpipe(struct usb_device *dev, unsigned int endpoint)

ָ��һ���� IN �˵�������ض��˵�ŵ��ض� USB �豸

unsigned int usb_sndintpipe(struct usb_device *dev, unsigned int endpoint)

ָ��һ���ж� OUT �˵�������ض��˵�ŵ��ض� USB �豸

unsigned int usb_rcvintpipe(struct usb_device *dev, unsigned int endpoint)

ָ��һ���ж� IN �˵�������ض��˵�ŵ��ض� USB �豸

unsigned int usb_sndisocpipe(struct usb_device *dev, unsigned int endpoint)

ָ��һ��ͬ�� OUT �˵�������ض��˵�ŵ��ض� USB �豸

unsigned int usb_rcvisocpipe(struct usb_device *dev, unsigned int endpoint)

ָ��һ��ͬ�� IN �˵�������ض��˵�ŵ��ض� USB �豸

unsigned int transfer_flags

��������ɱ�����Ϊ��ͬλֵ, ������� USB ��������� urb ����ʲô. ���õ�ֵ��:

URB_SHORT_NOT_OK

����λ, ��ָ���κ���һ�� IN �˵��Ͽ��ܷ����Ķ̶�, Ӧ���� USB ���ĵ���һ������. ���ֵֻ�Դ� USB �豸���� urb ����, ����д urbs.

URB_ISO_ASAP

������ urb ��ͬ����, ���λ�ɱ���λ������������ urb ������, ֻҪ��������������, �����ڴ˵�������� urb �е� start_frame ����. �������ͬ�� urb ���λû�б���λ, ��������ָ�� start_frame ֵ���ұ����ܹ���ȷ�ָ�, ���û�����Ǹ�ʱ������. ��������½ڹ���ͬ�� urb �������Ϣ.

URB_NO_TRANSFER_DMA_MAP

Ӧ������λ, �� urb ����һ��Ҫ�����͵� DMA ����. USB ����ʹ������� transfer_dma ����ָ��Ļ���, ���DZ� transfer_buffer ����ָ��Ļ���.

URB_NO_SETUP_DMA_MAP

�� URB_NO_TRANSFER_DMA_MAP λ, ���λ����������һ�� DMA �����Ѿ������� urb. ���������λ, USB ����ʹ������� setup_dma ���������� setup_packet ����ָ��Ļ���.

URB_ASYNC_UNLINK

�����λ, ����� urb �Ķ� usb_unlink_urb �ĵ��ü������̷���, ������� urb �ں��汻�������. ����, ��������ȴ�ֱ�� urb ��ȫ��ȥ�������ڷ���ǰ����. С��ʹ�����λ, ��Ϊ�����зdz����ڵ��Ե�ͬ������.

URB_NO_FSBR

ֻ�� UHCI USB ��������������ʹ��, ���Ҹ�������Ҫ��ͼ�� Front Side Bus Reclamation �߼�. ���λͨ��Ӧ��������, ��Ϊ�� UHCI �����������Ļ������������� CPU ����, ���� PCI ���߱��ȴ����������λ�� urb ������.

URB_ZERO_PACKET

�����λ, һ���� OUT urb ͨ�����Ͳ��������ݵĶ̱��Ķ�����, �����ݶ��뵽һ���˵㱨�ı߽�. �ⱻһЩ������ USB �豸����Ҫ(����һЩ USB �� IR ���豸) Ϊ����ȷ�Ĺ���..

URB_NO_INTERRUPT

�����λ, Ӳ���� urb ����ʱ���ܲ�����һ���ж�. ���λӦ��С��ʹ�ò���ֻ���ŶӶ������ͬ�˵�� urb ʱʹ��. USB ���ĺ���ʹ�����Ϊ���� DMA ���崫��.

void *transfer_buffer

ָ�����ڷ������ݵ��豸(��һ�� OUT urb)���ߴ��豸�л�ȡ����(����һ�� IN urb)�Ļ����ָ��. ������������Ϊ����ȷ��ȡ�������, �����뱻ʹ��һ���� kmalloc ����������, �����ڶ�ջ���߾�̬��. �Կ��ƶ˵�, ��������Ǹ����͵����ݽ׶�.

dma_addr_t transfer_dma

����ʹ�� DMA �������ݵ� USB �豸�Ļ���.

int transfer_buffer_length

����ij���, �� transfer_buffer ���� transfer_dma ����ָ��(����ֻ��һ���ɱ�һ�� urb ʹ��). ������� 0, û�д��ͻ��屻 USB ������ʹ��.

����һ�� OUT �˵�, �������˵����Ĵ�С���������ָ����ֵС, ����� USB �豸�Ĵ��ͱ��ֳɸ�С�Ŀ�Ϊ����ȷ�Ĵ�������. ���ִ�Ĵ��ͷ����������� USB ֡. �ύһ�����������һ�� urb ���Ƿdz���, ����ʹ USB ����������ȥ����Ϊ��С�Ŀ�, ����������˳����С����.

unsigned char *setup_packet

ָ���һ������ urb �� setup ���ĵ�ָ��. ����λ�ڴ��ͻ����е�����֮ǰ������. �������ֻ�Կ��� urb ��Ч.

dma_addr_t setup_dma

������ urb �� setupt ���ĵ� DMA ����. ��λ���������ͻ��������֮ǰ������. �������ֻ�Կ��� urb ��Ч.

usb_complete_t complete

ָ����ɴ����ߺ�����ָ��, ���� USB ���ĵ��õ���� urb ����ȫ���ͻ��ߵ� urb ����һ������. �����������, USB �����ɼ����� urb, �ͷ���, ���������ύ������һ�δ���.(��"completingUrbs: ��ɻص�������", ������ɴ����ߵĸ���ϸ��).

usb_complete_t ���Ͷ������:

typedef void (*usb_complete_t)(struct urb *, struct pt_regs *);
void *context

ָ�����ݵ��ָ��, ���ɱ� USB ��������. ��������ɴ�������ʹ�õ� urb �����ص�����. �������������ϸ�ڼ������½�.

int actual_length

����� urb �����, �������������Ϊ���ݵ���ʵ����, ��������� urb (���� OUT urb)���ͻ�������� urb(���� IN urb)����. ���� IN urb, ������뱻������� transfer_buffer_length ����, ��Ϊ���յ����ݿ��ܱ����������СС.

int status

����� urb ������, ���߿�ʼ�� USB ���Ĵ���, �������������Ϊ urb �ĵ�ǰ״̬. һ�� USB �����ɰ�ȫ��ȡ���������Ψһʱ������ urb ��ɴ����ߺ�����(��"CompletingUrbs: ��ɻص�������"һ��������). �����������ֹ�������, ��������� urb �� USB ���Ĵ�������. ����ͬ�� urb, ����������е�һ���ɹ���ֵ(0)ָֻʾ�Ƿ���� urb �ѱ�ȥ��. Ϊ�����ͬ�� urb �ϵ���ϸ״̬, Ӧ����� iso_frame_desc ����.

�����������Чֵ����:

0

��� urb �����dzɹ���.

-ENOENT

��� urb ���� usb_kill_urb �ĵ���ֹͣ.

-ECONNRESET

urb ���� usb_unlink_urb �ĵ���ȥ��, ���� transfer_flags ����������Ϊ URB_ASYNC_UNLINK.

-EINPROGRESS

��� urb ��Ȼ�ڱ� USB ����������������. �������������������ֵ, ����һ����������е� bug.

-EPROTO

��� urb ��������һ������:

  • һ�� bitstuff �����ڴ����з���.

  • Ӳ��û�м�ʱ�յ���Ӧ֡.

-EILSEQ

����� urb ��������һ�� CRC ��ƥ��.

-EPIPE

����˵����ڱ�ֹͣ. �����������Ķ˵㲻��һ�����ƶ˵�, �������ɱ����ͨ��һ���Ժ��� usb_clear_halt �ĵ���.

-ECOMM

�ڴ��������ݽ��տ����ܱ�д��ϵͳ�ڴ�. �������ֵֻ�� IN urb.

-ENOSR

�ڴ��������ݲ��ܴ�ϵͳ�ڴ��л�ȡ���㹻��, �Ա�ɸ�������� USB ��������. �������ֻ�� OUT urb.

-EOVERFLOW

��� urb ����һ��"babble"����. һ��"babble"���������˵�������ݶ��ڶ˵���ض�����Ĵ�С.

-EREMOTEIO

ֻ�����ڵ� URB_SHORT_NOT_OK ��־�������� urb �� transfer_flags ����, ������ζ�� urb �������������������û���յ�.

-ENODEV

��� USB �豸���ڴ�ϵͳ����ʧ.

-EXDEV

ֻ��ͬ�� urb ����, ������ζ�Ŵ���ֻ�������. Ϊ�˾�������ʲô, �������뿴������֡״̬.

-EINVAL

��� urb �����˷dz���������. USB �ں��ĵ����������ֵ��ζ��ʲô:

ISO ����, ����������: �˳����ؼ�.

��Ҳ�ɷ���, ���һ�������� urb �ṹ�б�����ȷ��������, ����������ύ��� urb �� USB ���ĵ� usb_submit_urb ������, ��һ������ȷ�ĺ�������.

-ESHUTDOWN

��� USB �������������������صĴ���; �������ѱ���ֹ, �����豸��ϵͳȥ������, �������urb ���豸��ȥ�����ύ. ��Ҳ�ɷ���������豸�����øı�, ����� urb ���ύ���豸.

ͨ��, ����ֵ -EPROTO, -EILSEQ, �� -EOVERFLOW ָʾ�豸��Ӳ������, �豸�̼�, ���������豸�������������.
int start_frame

���û򷵻�ͬ������Ҫʹ�õij�ʼ֡��.

int interval

urb ����ѯ�ļ��. ��ֻ���жϻ���ͬ�� urb ��Ч. ���ֵ�ĵ�λ�����豸�ٶȶ���ͬ. ���ڵ��ٺ͸��ٵ��豸, ��λ��֡, ����ͬ�ں���. �����豸, ��λ�Ǻ�֡���豸, ����ͬ�� 1/8 ΢�뵥λ. ���ֵ���뱻 USB �������ø�ͬ�������ж� urb, ����� urb�����͵� USB ����֮ǰ.

int number_of_packets

ֻ��ͬ�� urb ��Ч, ����ָ����� urb Ҫ������ͬ�����ͻ���ı��. ���ֵ���뱻 USB �������ø�ͬ�� urb, ����� urb ���͸� USB ����֮ǰ.

int error_count

�� USB ��������, ֻ��ͬ�� urb ���������֮��. ��ָ�������κ����ʹ����ͬ�����͵ĺ���.

struct usb_iso_packet_descriptor iso_frame_desc[0]

ֻ��ͬ�� urb ��Ч. ��������������� urb ��һ�� struct usb_iso_packet_descriptor �ṹ����. ����ṹ�������� urb ��һ�ζ�����ͬ������. ��Ҳ�����ռ�ÿ���������͵Ĵ���״̬.

�ṹ usb_iso_packet_descriptor �����г�Ա���:

unsigned int offset

�����������ڵĴ��ͻ����е�ƫ��(��һ���ֽڴ� 0 ��ʼ).

unsigned int length

������ĵĴ��ͻ���ij���.

unsigned int actual_length

���յ������ͬ�����ĵĴ��ͻ�������ݳ���.

unsigned int status

������ĵĵ���ͬ�����͵�״̬. ���ɲ���ͬ���ķ���ֵ��ͬ�� struct urb �ṹ��״̬����.

13.3.2. ���������� urb

struct urb �ṹ�������б��벻����̬����, ��������һ���ṹ��, ��Ϊ������ƻ� USB ���ĸ� urb ʹ�õ����ü�������. ������ʹ�ö� usb_alloc_urb �����ĵ��ö�������. ������������ԭ��:

struct urb *usb_alloc_urb(int iso_packets, int mem_flags);

��һ������, iso_packet, ����� urb Ӧ��������ͬ�����ĵ���Ŀ. ����㲻�봴��һ��ͬ�� urb, �������Ӧ��������Ϊ 0. �� 2 ������, mem_flags, �Ǻʹ��ݸ� kmalloc �������������ں˷����ڴ����ͬ�ı�־����(��"flags ����"һ��, �� 8 ��, ������Щ��־��ϸ��). �����������ڷ����㹻�ڴ����� urb �ɹ�, һ��ָ�� urb ��ָ�뱻���ظ�������. �������ֵ�� NULL, ij�������� USB �����з�����, ����������Ҫ��ȷ������.

�ڴ�����һ�� urb ֮��, �����뱻��ȷ��ʼ�������ɱ� USB ����ʹ��֮ǰ. ��γ�ʼ����ͬ���� urb ����һ��

Ϊ�˸��� USB ��������������� urb, ����������� usb_free_urb ����. �������ֻ��һ������:

void usb_free_urb(struct urb *urb);

������һ��ָ����Ҫ�ͷŵ� struct urb ��ָ��. ���������������֮��, urb �ṹ��ʧ, ���������ٴ�ȡ��.

13.3.2.1. �ж� urb

���� usb_fill_int_urb ��һ����æ����, ����ȷ��ʼ��һ��urb �����͸� USB �豸��һ���ж϶˵�:

void usb_fill_int_urb(struct urb *urb, struct usb_device *dev,
 unsigned int pipe, void *transfer_buffer,
 int buffer_length, usb_complete_t complete,
 void *context, int interval);

������������������:

struct urb *urb

ָ��Ҫ����ʼ���� urb ��ָ��.

struct usb_device *dev

��� urb Ҫ���͵��� USB �豸.

unsigned int pipe

��� urb Ҫ�����͵��� USB �豸���ض��˵�. ���ֵ������, ʹ��ǰ������� usb_sndintpipe ���� usb_rcvintpipe ����.

void *transfer_buffer

ָ�򻺳��ָ��, ��������������ݱ���ȡ���߽������ݱ�����. ע���ⲻ����һ����̬�Ļ��岢�ұ���ʹ�� kmalloc ����������.

int buffer_length

����ij���, �� transfer_buffer ָ��ָ��.

usb_complete_t complete

ָ��, ָ����� urb ���ʱ�����õ���ɴ�����.

void *context

ָ�����ݿ��ָ��, �������ӵ���� urb �ṹΪ�Ժ���ɴ����ߺ�����ȡ.

int interval

��� urb Ӧ�������ȵļ��. ��֮ǰ�� struct urb �ṹ������, ���ҵ����ֵ����ȷ��λ.

13.3.2.2. �� urb

�� urb ����ʼ���dz����ж� urb. ������ĺ����� usb_fill_bulk_urb, ���������:

void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev,
 unsigned int pipe, void *transfer_buffer,
 int buffer_length, usb_complete_t complete,
 void *context);

������������� usb_fill_int_urb �����Ķ���ͬ. ����, û�� interval ������Ϊ bulk urb û�м��ֵ. ��ע����� unsiged int pipe �������뱻��ʼ���ö� usb_sndbulkpipe ���� usb_rcvbulkpipe �����ĵ���.

usb_fill_int_urb ���������� urb �е� transfer_flags ����, ����κζ������Ա���޸IJ��ò�����������Լ����.

13.3.2.3. ���� urb

���� urb ����ʼ�������� �� urb ��ͬ�ķ�ʽ, ʹ�öԺ��� usb_fill_control_urb �ĵ���:

void usb_fill_control_urb(struct urb *urb, struct usb_device *dev,
 unsigned int pipe, unsigned char *setup_packet,
 void *transfer_buffer, int buffer_length,
 usb_complete_t complete, void *context);

���������� usb_fill_bulk_urb ��������ͬ, �����и��²���, unsigned char *setup_packet, ������ָ��Ҫ���͸��˵�� setup ��������. ����, unsigned int pipe �������뱻��ʼ��, ʹ�ö� usb_sndctrlpipe ���� usb_rcvictrlpipe �����ĵ���.

usb_fill_control_urb ���������� transfer_flags ������ urb ��, ����κζ������Ա���޸ı����������Լ����. �󲿷�������ʹ���������, ��Ϊʹ����"USB ���Ͳ��� urb"һ���н��ܵ�ͬ�� API ���ø���.

13.3.2.4. ͬ�� urb

���ҵ���, ͬ�� urb û��һ�����ж�, ����, �Ϳ� urb �ij�ʼ������. ������DZ�����������"�ֶ�"��ʼ��, �����ǿɱ��ύ�� USB ����֮ǰ. ������һ�������ȷ��ʼ������ urb ������. ���Ǵ� konicawc.c �ں�������ȡ�õ�, ��λ�����ں�Դ������ drivers/usb/media Ŀ¼.

urb->dev = dev;
urb->context = uvd;
urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp-1);
urb->interval = 1;
urb->transfer_flags = URB_ISO_ASAP;
urb->transfer_buffer = cam->sts_buf[i];
urb->complete = konicawc_isoc_irq;
urb->number_of_packets = FRAMES_PER_DESC;
urb->transfer_buffer_length = FRAMES_PER_DESC;
for (j=0; j < FRAMES_PER_DESC; j++) {

 urb->iso_frame_desc[j].offset = j;
 urb->iso_frame_desc[j].length = 1;
}

13.3.3. �ύ urb

һ�� urb ����ȷ�ش���,���ұ� USB ������ʼ��, ����׼���ñ��ύ�� USB ���������ͳ��� USB �豸. ��ͨ�����ú��� usb_submit_urb ʵ��:

int usb_submit_urb(struct urb *urb, int mem_flags);

urb ������һ��ָ�� urb ��ָ��, ��Ҫ�����͵��豸. mem_flags ������ͬ�ڴ��ݸ� kmalloc ���õ�ͬ���IJ���, ������������ USB ������μ�ʱ�����κ��ڴ滺�������ʱ��.

�� urb ���ɹ��ύ�� USB ����֮��, Ӧ���Ӳ���ͼ��ȡ urb �ṹ���κγ�Աֱ����ɺ���������.

��Ϊ���� usb_submit_urb �ɱ����κ�ʱ�򱻵���(������һ���ж�������), mem_flags ������ָ��������ȷ. ����ֻ�� 3 ����Чֵ����, ���ݺ�ʱ usb_submit_urb ������:

GFP_ATOMIC

���ֵӦ����ʹ�����ۺ�ʱ���������:

  • �����ߴ���һ�� urb ��ɴ�����, һ���ж�, һ����벿, һ�� tasklet, ����һ��ʱ�ӻص�.

  • �����߳���һ�����������߶�д��. ע�����������һ�����, ���ֵ����Ҫ.

  • current->state ���� TASK_RUNNING. ״̬һֱ�� TASK_RUNNING �����������Լ��ı� current ״̬.

GFP_NOIO

���ֵӦ����ʹ��, ��������ڿ� I/O ������. ����Ӧ���������еĴ洢���͵Ĵ�����������.

GFP_KERNEL

��Ӧ���������������������, ������֮ǰ�ᵽ�����.

13.3.4. ��� urb: ��ɻص�������

����� usb_submit_urb �ĵ��óɹ�, ���ݶ� urb �Ŀ��Ƹ� USB ����, ����������� 0; ����, һ��������ֵ������. ��������ɹ�, urb ����ɴ�����(��ͬ����ɺ���ָ��ָ����)��ȷ�еص���һ��, �� urb �����. ���������������, USB ���������� urb, ���Ҷ����Ŀ������ڷ��ظ��豸����.

ֻ�� 3 ������, һ��urb �ɱ���������ʹ��ɺ���������:

  • urb ���ɹ����͸��豸, �����豸������ȷ��ȷ��. ����һ�� OUT urb, ���ݱ��ɹ�����, ����һ�� IN urb, ��������ݱ��ɹ��յ�. ����������, urb �е�״̬����������Ϊ 0.

  • һЩ������������, �����ͻ��߽������ݴ��豸��. �� urb �ṹ�е� status �����еĴ���ֵ����¼.

  • ��� urb ���� USB ����ȥ��. �ⷢ����Ҫô��������֪ USB ����ȡ��һ�����ύ�� urb ͨ������ usb_unlink_urb ���� usb_kill_urb, Ҫô���豸��ϵͳ��ȥ��, �Լ�һ�� urb �Ѿ����ύ����.

һ����β�����һ�� urb ��ɵ����в�ͬ����ֵ�������ڱ����Ժ�չʾ.

13.3.5. ȡ�� urb

Ϊֹͣһ���Ѿ��ύ�� USB ���ĵ� urb, ���� usb_kill_urb ���� usb_unlink_urb Ӧ��������:

int usb_kill_urb(struct urb *urb); 
int usb_unlink_urb(struct urb *urb);
The urb parameter for both of these functions is a pointer to the urb that is to be canceled.

�������� usb_kill_urb, ��� urb ������ѭ����ֹͣ��. ��������������豸��ϵͳȥ��ʱ��ʹ��, ��ȥ���ӻص���.

��һЩ����, Ӧ���� usb_unlink_urb ��������֪ USB ����ȥֹͣ urb. ��������ڷ��ص�������֮ǰ���ȴ���� urb ��ȫֹͣ. ��������жϴ������߳���һ��������ʱֹͣ urb ʱ�����õ�, ��Ϊ�ȴ�һ�� urb ��ȫֹͣ��Ҫ USB ����������ʹ���ý���˯��. Ϊ����ȷ�����������Ҫ�� URB_ASYNC_UNLINK ��־ֵ������������Ҫ��ֹͣ�� urb ��.