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 �ĵ�������ѭ������:
��һ�� USB �豸��������.
���Ÿ�һ���ض� USB �豸���ض��˵�.
�ύ�� USB ����, �� USB �豸����.
�ύ���ض��豸�ı� USB ����ָ���� USB ��������������, .
�� USB ��������������, ����һ�� USB ���͵��豸.
�� urb ���, USB ��������������֪ͨ USB �豸����.
urb Ҳ�ɱ��ύ��� urb ���������κ�ʱ��ȡ��, ���߱� USB ��������豸����ϵͳ���Ƴ�. urb ����̬�������Ұ���һ���ڲ����ü���, ʹ��������� urb �����һ���û��ͷ���ʱ���Զ��ͷ�.
�����������Ĵ��� urb �Ĺ��������õ�, ��Ϊ�����������������ӵ�, ������ͨѶ�����������������߿��ܵ����ݴ����ٶ�. �����и����鷳�Ĺ��̿���, �����ֻ���뷢�͵����Ŀ���߿�����Ϣ, ���Ҳ���������������.(��"USB ���Ͳ��� urb"һ��).
struct urb �ṹ�к� USB �豸�����йصij�Ա��:
ָ����� urb Ҫ���͵��� struct usb_device ��ָ��. ����������뱻 USB ������ʼ��, ����� urb �����͵� USB ����֮ǰ.
�˵���Ϣ, ����� urb Ҫ�����͵����ض� struct usb_device. ����������뱻 USB ������ʼ��, ����� urb �����͵� USB ����֮ǰ.
Ϊ��������ṹ�ij�Ա, ����ʹ������ĺ������ʵ���, ���������ķ���. ע��ÿ���˵�ֻ����һ������.
ָ��һ������ OUT �˵���ض��Ĵ����ض��˵�ŵ� USB �豸.
ָ��һ������ IN �˵�������ض��˵�ŵ��ض� USB �豸.
ָ��һ���� OUT �˵�������ض��˵�ŵ��ض� USB �豸
ָ��һ���� IN �˵�������ض��˵�ŵ��ض� USB �豸
ָ��һ���ж� OUT �˵�������ض��˵�ŵ��ض� USB �豸
ָ��һ���ж� IN �˵�������ض��˵�ŵ��ض� USB �豸
ָ��һ��ͬ�� OUT �˵�������ض��˵�ŵ��ض� USB �豸
ָ��һ��ͬ�� IN �˵�������ض��˵�ŵ��ض� USB �豸
��������ɱ�����Ϊ��ͬλֵ, ������� USB ��������� urb ����ʲô. ���õ�ֵ��:
����λ, ��ָ���κ���һ�� IN �˵��Ͽ��ܷ����Ķ̶�, Ӧ���� USB ���ĵ���һ������. ���ֵֻ�Դ� USB �豸���� urb ����, ����д urbs.
������ urb ��ͬ����, ���λ�ɱ���λ������������ urb ������, ֻҪ��������������, �����ڴ˵�������� urb �е� start_frame ����. �������ͬ�� urb ���λû�б���λ, ��������ָ�� start_frame ֵ���ұ����ܹ���ȷ�ָ�, ���û�����Ǹ�ʱ������. ��������½ڹ���ͬ�� urb �������Ϣ.
Ӧ������λ, �� urb ����һ��Ҫ�����͵� DMA ����. USB ����ʹ������� transfer_dma ����ָ��Ļ���, ���DZ� transfer_buffer ����ָ��Ļ���.
�� URB_NO_TRANSFER_DMA_MAP λ, ���λ����������һ�� DMA �����Ѿ������� urb. ���������λ, USB ����ʹ������� setup_dma ���������� setup_packet ����ָ��Ļ���.
�����λ, ����� urb �Ķ� usb_unlink_urb �ĵ��ü������̷���, ������� urb �ں��汻�������. ����, ��������ȴ�ֱ�� urb ��ȫ��ȥ�������ڷ���ǰ����. С��ʹ�����λ, ��Ϊ�����зdz����ڵ��Ե�ͬ������.
ֻ�� UHCI USB ��������������ʹ��, ���Ҹ�������Ҫ��ͼ�� Front Side Bus Reclamation ��. ���λͨ��Ӧ��������, ��Ϊ�� UHCI �����������Ļ������������� CPU ����, ���� PCI ���߱��ȴ����������λ�� urb ������.
�����λ, һ���� OUT urb ͨ�����Ͳ��������ݵĶ̱��Ķ�����, �����ݶ��뵽һ���˵㱨�ı߽�. �ⱻһЩ������ USB �豸����Ҫ(����һЩ USB �� IR ���豸) Ϊ����ȷ�Ĺ���..
�����λ, Ӳ���� urb ����ʱ���ܲ�����һ���ж�. ���λӦ��С��ʹ�ò���ֻ���ŶӶ������ͬ�˵�� urb ʱʹ��. USB ���ĺ���ʹ�����Ϊ���� DMA ���崫��.
ָ�����ڷ������ݵ��豸(��һ�� OUT urb)���ߴ��豸�л�ȡ����(����һ�� IN urb)�Ļ����ָ��. ������������Ϊ����ȷ��ȡ�������, �����뱻ʹ��һ���� kmalloc ����������, �����ڶ�ջ���߾�̬��. �Կ��ƶ˵�, ��������Ǹ����͵����ݽ�.
����ʹ�� DMA �������ݵ� USB �豸�Ļ���.
����ij���, �� transfer_buffer ���� transfer_dma ����ָ��(����ֻ��һ���ɱ�һ�� urb ʹ��). ������� 0, û�д��ͻ��屻 USB ������ʹ��.
����һ�� OUT �˵�, �������˵����Ĵ�С���������ָ����ֵС, ����� USB �豸�Ĵ��ͱ��ֳɸ�С�Ŀ�Ϊ����ȷ�Ĵ�������. ���ִ�Ĵ��ͷ����������� USB ֡. �ύһ�����������һ�� urb ���Ƿdz���, ����ʹ USB ����������ȥ����Ϊ��С�Ŀ�, ����������˳����С����.
ָ���һ������ urb �� setup ���ĵ�ָ��. ����λ�ڴ��ͻ����е�����֮ǰ������. �������ֻ�Կ��� urb ��Ч.
������ urb �� setupt ���ĵ� DMA ����. ��λ���������ͻ��������֮ǰ������. �������ֻ�Կ��� urb ��Ч.
ָ����ɴ����ߺ�����ָ��, ���� USB ���ĵ��õ���� urb ����ȫ���ͻ��ߵ� urb ����һ������. �����������, USB �����ɼ����� urb, �ͷ���, ���������ύ������һ�δ���.(��"completingUrbs: ��ɻص�������", ������ɴ����ߵĸ���ϸ��).
usb_complete_t ���Ͷ������:
typedef void (*usb_complete_t)(struct urb *, struct pt_regs *);
ָ�����ݵ��ָ��, ���ɱ� USB ��������. ��������ɴ�������ʹ�õ� urb �����ص�����. �������������ϸ�ڼ������½�.
����� urb �����, �������������Ϊ���ݵ���ʵ����, ��������� urb (���� OUT urb)���ͻ�������� urb(���� IN urb)����. ���� IN urb, ������뱻������� transfer_buffer_length ����, ��Ϊ���յ����ݿ��ܱ����������СС.
����� urb ������, ���߿�ʼ�� USB ���Ĵ���, �������������Ϊ urb �ĵ�ǰ״̬. һ�� USB �����ɰ�ȫ��ȡ���������Ψһʱ������ urb ��ɴ����ߺ�����(��"CompletingUrbs: ��ɻص�������"һ��������). �����������ֹ�������, ��������� urb �� USB ���Ĵ�������. ����ͬ�� urb, ����������е�һ���ɹ���ֵ(0)ָֻʾ�Ƿ���� urb �ѱ�ȥ��. Ϊ�����ͬ�� urb �ϵ���ϸ״̬, Ӧ����� iso_frame_desc ����.
�����������Чֵ����:
��� urb �����dzɹ���.
��� urb ���� usb_kill_urb �ĵ���ֹͣ.
urb ���� usb_unlink_urb �ĵ���ȥ��, ���� transfer_flags ����������Ϊ URB_ASYNC_UNLINK.
��� urb ��Ȼ�ڱ� USB ����������������. �������������������ֵ, ����һ����������е� bug.
��� urb ��������һ������:
һ�� bitstuff �����ڴ����з���.
Ӳ��û�м�ʱ�յ���Ӧ֡.
����� urb ��������һ�� CRC ��ƥ��.
����˵����ڱ�ֹͣ. �����������Ķ˵㲻��һ�����ƶ˵�, �������ɱ����ͨ��һ���Ժ��� usb_clear_halt �ĵ���.
�ڴ��������ݽ��տ����ܱ�д��ϵͳ�ڴ�. �������ֵֻ�� IN urb.
�ڴ��������ݲ��ܴ�ϵͳ�ڴ��л�ȡ���㹻��, �Ա�ɸ�������� USB ��������. �������ֻ�� OUT urb.
��� urb ����һ��"babble"����. һ��"babble"���������˵�������ݶ��ڶ˵���ض�����Ĵ�С.
ֻ�����ڵ� URB_SHORT_NOT_OK ��־�������� urb �� transfer_flags ����, ������ζ�� urb �������������������û���յ�.
��� USB �豸���ڴ�ϵͳ����ʧ.
ֻ��ͬ�� urb ����, ������ζ�Ŵ���ֻ�������. Ϊ�˾�������ʲô, �������뿴������֡״̬.
��� urb �����˷dz���������. USB �ں��ĵ����������ֵ��ζ��ʲô:
ISO ����, ����������: �˳����ؼ�.
��Ҳ�ɷ���, ���һ�������� urb �ṹ�б�����ȷ��������, ����������ύ��� urb �� USB ���ĵ� usb_submit_urb ������, ��һ������ȷ�ĺ�������.
��� USB �������������������صĴ���; �������ѱ���ֹ, �����豸��ϵͳȥ������, �������urb ���豸��ȥ�����ύ. ��Ҳ�ɷ���������豸�����øı�, ����� urb ���ύ���豸.
���û�ͬ������Ҫʹ�õij�ʼ֡��.
urb ����ѯ�ļ��. ��ֻ���жϻ���ͬ�� urb ��Ч. ���ֵ�ĵ�λ�����豸�ٶȶ���ͬ. ���ڵ��ٺ��ٵ��豸, ��λ��֡, ����ͬ�ں���. �����豸, ��λ�Ǻ�֡���豸, ����ͬ�� 1/8 �뵥λ. ���ֵ���뱻 USB �������ø�ͬ�������ж� urb, ����� urb�����͵� USB ����֮ǰ.
ֻ��ͬ�� urb ��Ч, ����ָ����� urb Ҫ������ͬ�����ͻ���ı��. ���ֵ���뱻 USB �������ø�ͬ�� urb, ����� urb ���� USB ����֮ǰ.
�� USB ��������, ֻ��ͬ�� urb ���������֮��. ��ָ�������κ����ʹ����ͬ�����͵ĺ���.
ֻ��ͬ�� urb ��Ч. ��������������� urb ��һ�� struct usb_iso_packet_descriptor �ṹ����. ����ṹ�������� urb ��һ�ζ�����ͬ������. ��Ҳ�����ռ�ÿ���������͵Ĵ���״̬.
�ṹ usb_iso_packet_descriptor �����г�Ա���:
�����������ڵĴ��ͻ����е�ƫ��(��һ���ֽڴ� 0 ��ʼ).
������ĵĴ��ͻ���ij���.
���յ������ͬ�����ĵĴ��ͻ�������ݳ���.
������ĵĵ���ͬ�����͵�״̬. ���ɲ���ͬ���ķ���ֵ��ͬ�� struct 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 �ṹ��ʧ, ���������ٴ�ȡ��.
���� 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);
������������������:
ָ��Ҫ����ʼ���� urb ��ָ��.
��� urb Ҫ���͵��� USB �豸.
��� urb Ҫ�����͵��� USB �豸���ض��˵�. ���ֵ������, ʹ��ǰ������� usb_sndintpipe ���� usb_rcvintpipe ����.
ָ���ָ��, ��������������ݱ���ȡ���߽������ݱ�����. ע���ⲻ����һ����̬�Ļ��岢�ұ���ʹ�� kmalloc ����������.
����ij���, �� transfer_buffer ָ��ָ��.
ָ��, ָ����� urb ���ʱ�����õ���ɴ�����.
ָ�����ݿ��ָ��, �������ӵ���� urb �ṹΪ�Ժ���ɴ����ߺ�����ȡ.
��� urb Ӧ�������ȵļ��. ��֮ǰ�� struct 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��ò�����������Լ����.
���� 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 ���ø���.
���ҵ���, ͬ�� 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; }
һ�� 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 ������:
���ֵӦ����ʹ�����ۺ�ʱ���������:
�����ߴ���һ�� urb ��ɴ�����, һ���ж�, һ����벿, һ�� tasklet, ����һ��ʱ�ӻص�.
�����߳���һ�����������߶�д��. ע�����������һ�����, ���ֵ����Ҫ.
current->state ���� TASK_RUNNING. ״̬һֱ�� TASK_RUNNING �����������Լ��ı� current ״̬.
���ֵӦ����ʹ��, ��������ڿ� I/O ������. ����Ӧ���������еĴ洢���͵Ĵ�����������.
��Ӧ���������������������, ������֮ǰ�ᵽ�����.
����� 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 ��ɵ����в�ͬ����ֵ�������ڱ����Ժ�չʾ.
Ϊֹͣһ���Ѿ��ύ�� 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 ��.