Linux USB驱动相关细节知识
注意:urb 回调函数是在中断上下文运行, 因此它不应做任何内存分配, 持有任何信号量, 或任何可导致进程休眠的事情. 如果从回调中提交 urb 并需要分配新内存块, 需使用 GFP_ATOMIC 标志来告知 USB 核心不要休眠.
2. urb封装函数:
1) int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,void*data, int len, int*actual_length,int timeout)
功能:创建批量 urb 并发送到指定的设备, 接着在返回之前等待完成.
参数:
struct usb_device *usb_dev :目标 USB 设备指针
unsigned int pipe :目标 USB 设备的特定端点. 必须使用特定的宏创建.
void *data :如果是 OUT 端点, 指向要发送到设备的数据的指针. 如果是 IN 端点, 这是从设备读取的数据的缓冲区指针.
int len : data 参数指向的缓冲的长度
int *actual_length :指向函数放置真实字节数的指针,根据端点方向,这些字节要么是被发送到设备的,要么是从设备中读取的.
int timeout :时钟嘀哒数, 应等待的时间. 如果为 0, 函数永远等待操作完成.
返回值:成功返回0,actual_length 参数包含被传送或从设备中读取的字节数.否则返回负的错误值.
2)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)
功能:创建控制 urb 并发送到指定的设备, 接着在返回之前等待完成.
参数:
struct usb_device *usb_dev :目标 USB 设备指针
unsigned int pipe :目标 USB 设备的特定端点. 必须使用特定的宏创建.
__u8 request :控制消息的 USB 请求值.
__u8 requesttype :控制消息的 USB 请求类型.
__u16 value :控制消息的 USB 消息值.
__u16 index :控制消息的 USB 消息索引值.
void *data :如果是 OUT 端点, 指向要发送到设备的数据的指针. 如果是 IN 端点, 这是从设备读取的数据的缓冲区指针.
__u16 size : data 参数指向的缓冲的长度
int timeout :时钟嘀哒数, 应等待的时间. 如果为 0, 函数永远等待操作完成.
返回值:成功返回被传送到或从设备读取的字节数.否则返回负的错误值.
3)int usb_interrupt_msg(struct usb_device*usb_dev, unsigned int pipe,void *data,int len, int *actual_length,int timeout)
功能:创建中断 urb 并发送到指定的设备, 接着在返回之前等待完成.其实就是usb_bulk_msg的包装,所有参数和usb_bulk_msg一样使用
更多推荐
所有评论(0)