USB驱动相关知识

来源:互联网 发布:淘宝什么周几流量大 编辑:程序博客网 时间:2024/05/20 06:50

static struct usb_device_id id_table[]={

{ USB_DEVICE(VENDOR_ID,PRODUCT) },

{},

};

MODULE_ID_TABLE(usb,id_table);

当usb核心检测到设备属性与某个驱动程序的id_table信息一致时,就会执行驱动程序的probe函数,拔出设备是就会执行disconnect函数。


要注意usb请求块即struct urb结果类似于网络驱动程序的sk_buff结构

数据流向的载体。

urb处理流程:

1 分配urb

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

iso_packets:等时数据包数目 

iso_packets=0 表示不创建等时数据包

mem_flags:与kmalloc函数参数一致,分配方式

如GFP_KERNEL等

对立函数是:

void usb_free_urb(struct urb * urb);

2 初始化urb

(1)对于中断类型:

void usb_fill_int_urb(struct urb*urb,struct usb_device*dev,

uint pipe,void * transfer_buffer,int buffer_length,

usb_complete_t complete,void * context,

int interval);

urb:要初始化的urb指针 dev:urb发送到的usb设备

pipe:要发送到usb设备的特定端点(管道)

由usb_sndintpipe()或者usb_rcvintpipe函数创建

transfer_buffer :发送或者接收的缓冲区指针 ,不能是静态缓冲区

buffer_length:数据长度

complete:urb发送完成的完成处理函数

context:完成处理函数的参数

interval: 时间间隔

(2)对于批量urb:

void usb_fill_bulk_urb(struct urb * urb,struct usb_device * dev,uint pipe,

void *transfer_buffer,int length,

usb_complete_t complete,void * context);

参数意思同上;

pipe:有usb_sndbulkpipe()或者usb_rcvbulkpipe()函数创建

(3)对于控制urb:

void usb_fill_control_urb(struct urb * urb,struct usb_device *dev,uint pipe,

uchar * set_packet, void *transfer_buffer,int buffer_length,

usb_complete_t complete ,void * context);

set_packet:指向即将发送到端点的设置数据包

pipe:usb_sndctrlpipe()或者usb_rcvctrlpipe()函数创建

3 提交urb:

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


0 0
原创粉丝点击