linux基于urb的以及usb的数据传输

Urb:usb的请求块(include/linux/usb.h)

负责与usb设备通信。以一种异步的特定的方式从USB设备特定的端点接收发送数据,设备驱动可以为单个端点分配多个urb,或多个端点共用单个urb。

urb的创建周期:由usb设备驱动程序创建,分配一个特定usb的特定端点,usb驱动递交给usb核心,由usb主控制器驱动处理,他从设备进行usb传送,usb结束,usb主控制器程序通知usb设备驱动程序。

结构体 struct urb 

一些Urb需要字段:

unsigned int pipe;   urb所要发送的特定目标usb_device的端点信息,该值取决于数据的传输方向:

  usb_rcvintpipe()设置端点为控制输入端点,usb_sndctrlpipe()将端点号设置为控制输出端点。

  usb_rcvbulkpipe批量输入输出端点,usb_rcvintpipe中断输入输出端点,usb_rcvisocpipe等时输入输出端点。

unsigned int transfer_flags;不同的值不同的标志,(具体问题具体对待)。

void *transfer_buffer:缓冲数据指针(需要kmalloc去创建)

dma_addr_t transfer_dma;dma方式传输到缓冲数据指针中去,

u32 transfer_buffer_length; 数据传输长度(指向缓冲区的大小)。

u32 actual_length;urb结束后发送或者接受的实际长度。

dma_addr_t setup_dma;设置dma数据缓冲区。

usb_complete_t complete;(比较重要):urb传输完成,则调用该函数。

int status;   urb的当前状态

int interval;等时传输时间间隔。

int number_of_packets;等时传输时缓冲区的包的数量,

struct usb_iso_packet_descriptor iso_frame_desc[0];该结构体用来容许单个urb一次定义许多的等时传输,

(暂时就写这么些)还有一些,具体用到的时候还要查资料。

分配销毁urb:

分配urb:usb_alloc_urb()

释放:usb_free_urb()

几种不同urb的初始化

中断urb

static inline 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_fn,
                 void *context,
                 int interval);

批量urb
static inline 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_fn,
                 void *context);
 控制urb
static inline 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_fn,
                    void *context);
等时urb的创建
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:

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

在 urb 被成功提交给 USB 核心之后, 直到结束处理例程函数被调用前,都不能访问 urb 结构的任何成员.

urb结束处理:

usb_submit_urb被成功调用之后,对urb的控制权传递给USB核心,函数调用成功,urb被结束例程会被调用,表示usb核心完成了urb,并将控制权返回给驱动设备。

status状态设置,

取消urb void usb_kill_urb(struct urb *urb)

不使用urb的传输::(使用条件:usb驱动程序值发送或者接受一些简单的usb数据)

usb_bulk_msg()创建一个批量urb,把它发送到指定设备等待完成,

int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
         void *data, int len, int *actual_length, int timeout)

批量发送的目标usb设备指针usb_dev, 端点,数据,长度,实际长度,超时时间。

int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
            __u8 requesttype, __u16 value, __u16 index, void *data,
            __u16 size, int timeout)

可以发送接收usb的控制消息。

猜你喜欢

转载自blog.csdn.net/zuodenghuakai/article/details/83898054