URB结构体

struct urb {
/* private: usb core and host controller only fields in the urb */
struct kref kref; /* reference count of the URB */
void *hcpriv; /* private data for host controller */
atomic_t use_count; /* concurrent submissions counter */
atomic_t reject; /* submissions will fail */
int unlinked; /* unlink error code */ /* public: documented fields in the urb that can be used by drivers */
struct list_head urb_list; /* list head for use by the urb's
* current owner */
struct list_head anchor_list; /* the URB may be anchored */
struct usb_anchor *anchor;
struct usb_device *dev; /* (in) pointer to associated device */
struct usb_host_endpoint *ep; /* (internal) pointer to endpoint */
unsigned int pipe; /* (in) pipe information */
unsigned int stream_id; /* (in) stream ID */
int status; /* (return) non-ISO status */
unsigned int transfer_flags; /* (in) URB_SHORT_NOT_OK | ...*/
void *transfer_buffer; /* (in) associated data buffer */
dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */
struct scatterlist *sg; /* (in) scatter gather buffer list */
int num_mapped_sgs; /* (internal) mapped sg entries */
int num_sgs; /* (in) number of entries in the sg list */
u32 transfer_buffer_length; /* (in) data buffer length */
u32 actual_length; /* (return) actual transfer length */
unsigned char *setup_packet; /* (in) setup packet (control only) */
dma_addr_t setup_dma; /* (in) dma addr for setup_packet */
int start_frame; /* (modify) start frame (ISO) */
int number_of_packets; /* (in) number of ISO packets */
int interval; /* (modify) transfer interval
* (INT/ISO) */
int error_count; /* (return) number of ISO errors */
void *context; /* (in) context for completion */
usb_(1)异步提交urb,提交完成后通过usb_fill[control] [int] [bulk]_urb传入的回调函数
_t complete; /* (in) completion routine */
struct usb_iso_packet_descriptor iso_frame_desc[0];
/* (in) ISO ONLY */
};
  • pipe:端点需要和主机控制器需要通过pipe进行通信;
unsigned int pipe;        /* (in) pipe information */
  • urb是主机控制器发给设备的,因此需要将设备的pipe告诉主机控制器。

  • transfer_buffer:in端点时,存放设备发给主机控制器的数据;out端点时,存放主机控制器发给设备的数据。

void *transfer_buffer;        /* (in) associated data buffer */
  • buffder长度;
u32 transfer_buffer_length;    /* (in) data buffer length */
  • complete:complete是一个回调函数,当通讯接收后,会调用。
usb_complete_t complete;    /* (in) completion routine */

每一个urb都是由usb主机控制器发送给usb设备的。

urb使用方式

1.分配urb

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

2.初始化urb

usb控制传输:void usb_fill_control_urb();

usb中断传输:void usb_fill_int_urb();

usb批量传输:void usb_fill_bulk();

以上函数不适用于等时传输:

3.提交urb(提交给主控制器,由主控制器发送给usb设备)

(1)异步提交urb,提交完成后通过usb_fill[control] [int] [bulk]_urb传入的回调函数

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

该函数只管发出去,不管是否发送成功。

(2)同步提交urb

int usb_fill[control] [int] [bulk]_msg(
struct usb_device *usb_dev,
unsigned int pipe,
void *data,
int len,
int *actual_length,
int timeout);

同步提交会一直等待urb提交成功;

usb 驱动数据结构

struct usb_device {
int devnum;
char devpath[16];
u32 route;
enum usb_device_state state;
enum usb_device_speed speed;
unsigned int rx_lanes;
unsigned int tx_lanes; struct usb_tt *tt;
int ttport; unsigned int toggle[2]; struct usb_device *parent;
struct usb_bus *bus;
struct usb_host_endpoint ep0; struct device dev; struct usb_device_descriptor descriptor;
struct usb_host_bos *bos;
struct usb_host_config *config; struct usb_host_config *actconfig;
struct usb_host_endpoint *ep_in[16];
struct usb_host_endpoint *ep_out[16]; char **rawdescriptors; unsigned short bus_mA;
u8 portnum;
u8 level; unsigned can_submit:1;
unsigned persist_enabled:1;
unsigned have_langid:1;
unsigned authorized:1;
unsigned authenticated:1;
unsigned wusb:1;
unsigned lpm_capable:1;
unsigned usb2_hw_lpm_capable:1;
unsigned usb2_hw_lpm_besl_capable:1;
unsigned usb2_hw_lpm_enabled:1;
unsigned usb2_hw_lpm_allowed:1;
unsigned usb3_lpm_u1_enabled:1;
unsigned usb3_lpm_u2_enabled:1;
int string_langid; /* static strings from the device */
char *product;
char *manufacturer;
char *serial; struct list_head filelist; int maxchild; u32 quirks;
atomic_t urbnum; unsigned long active_duration; #ifdef CONFIG_PM
unsigned long connect_time; unsigned do_remote_wakeup:1;
unsigned reset_resume:1;
unsigned port_is_suspended:1;
#endif
struct wusb_dev *wusb_dev;
int slot_id;
enum usb_device_removable removable;
struct usb2_lpm_parameters l1_params;
struct usb3_lpm_parameters u1_params;
struct usb3_lpm_parameters u2_params;
unsigned lpm_disable_count; u16 hub_delay;
};

struct usb_device描述一个usb设备

管道

每个断点通过管道和usb主控制器连接,管道包括以下几个部分:

1.端点地址

2.数据传输方向(IN或OUT)

3.数据传输模式

usb_[rcv][snd][ctrl][int][bulk][isoc]pipe(struct usb_device *usb_dev,_u8 endpointAddress);

分别表示接收,发送,控制,中断,批量,等时管道;

得到一个pipe,主机得到这个pipe,就知道跟谁去通讯了;

usb请求块以及提交方式的更多相关文章

  1. angularJS 条件查询 品优购条件查询品牌(条件查询和列表展示公用方法解决思路 及 post请求混合参数提交方式)

    Brand.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  2. USB设备---URB请求块

    1.urb 结构体 USB 请求块(USB request block,urb)是USB 设备驱动中用来描述与USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff 结 ...

  3. 关于Ajax的type为post提交方式出现请求失效问题

    最近碰到这样一个问题,原本一个ajax异步提交数据之前是很好的,很多系统都延用了均未出现任何问题.最近这个版本却出现ajax方式post数据不到后台程序,让我折腾了好几天.起初的ajax是这样写的: ...

  4. 表单_post提交方式和get的区别,元素集

    提交方式及表单域的name属性 使用form表单一种是post提交方式,一种是get提交方式,它们以method属性来定义,如果没有指定method属性,默认get方式提交. 表单域必须配合name属 ...

  5. 华为手机浏览器不支持PUT提交方式的解决方案

    最近所在技术团队在开发webapp项目,前端angularjs+后端.Net MVC API,API登录接口定义为PUT提交方式,在做兼容测试时发现UC.safari.微信浏览器下都可以登录,但在华为 ...

  6. 三种POST和GET的提交方式

    向服务器提交数据有两种方式,post和get.两者的区别主要有三点,安全性.长度限制.数据结构.其中get请求安全性相比较而言较差,数据长度受浏览器地址栏限制,没有方法体.两种都是较为重要的数据提交方 ...

  7. ASP.NET知识总结(2.对比Get和Post提交方式)

    2.对比Get和Post提交方式 get:<1>在地址栏中通过?key1=value1&key2=value2...的方式传值 <2>传递的数据用户可以直接在url中看 ...

  8. 四种常见的 POST-------- content-type数据提交方式

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

  9. 今天在研究jquery用ajax提交form表单中得数据时,学习到了一种新的提交方式

    今天在研究jquery用ajax提交form表单中得数据时,学习到了一种新的提交方式 jquery中的serialize() 方法 该方法通过序列化表单值,创建 URL 编码文本字符串 序列化的值可在 ...

  10. POST不同提交方式对应的Content-Type,及java服务器接收参数方式

    POST不同提交方式对应的Content-Type,及java服务器接收参数方式 注:本博客参考了网上的文章结合自己工作总结后所写,主要用于记录自己工作所得,如有错误请批评指正. 简介: Conten ...

随机推荐

  1. pytest数据驱动 pandas

    pytest数据驱动 pandas 主要过程:用pandas读取excel里面的数据,然后进行百度查询,并断言 pf = pd.read_excel('data_py.xlsx', usecols=[ ...

  2. 【SpringBoot】14 数据访问P2 整合Druid数据源

    [SpringBoot引入Druid数据源] 在整合Jdbc的工程基础上加入这个依赖 并注册一个配置类即可 maven坐标: <!-- https://mvnrepository.com/art ...

  3. ubuntu18.04 源码方式安装wine , 警告,libxrender 64-bit development files not found, XRender won't be supported.

    警告信息: configure: WARNING: libxrender 64-bit development files not found, XRender won't be supported. ...

  4. vim跳转到上次和下次光标位置

    在vim的命令模式下: ctrl + i    下次光标位置; ctrl + o   上次光标位置. =====================================

  5. 解决 jquery attr多次使用失效的问题

    今天做一个全选功能的时候用到了jq 的attr 的方法,可是在真正使用的时候首次是可以实现全选和全不选的功能,然而 多点几次就会发勾选的效果消失了!先看下代码吧: <!DOCTYPE html& ...

  6. 7月30日CSP-S模拟赛赛后总结

    7月30日模拟赛赛后总结 \[7月30日 \ \ 模拟赛 \ \ 赛后总结 \\ 2024年7月30日 \\ by \ \ \ hcy \] 洛谷同步:点我 一.做题情况 第一题比赛 \(100pts ...

  7. Jmeter SHA512接口加密测试

    前言:最近,我遇到一些测试接口必须传入经过SHA512加密后的sign签名,并且签名有1小时时间限制,即签名不是一成不变超1小时就会过期,这导致在测试过程中就得频繁手工去更新签名.其实Jmeter是有 ...

  8. java关于二维数组的操作

    代码: ''' package tests; public class Yanghui { public static void main(String[] args) { //声明二维数组的三种方式 ...

  9. 代码随想录Day11

    150. 逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式. 请你计算该表达式.返回一个表示表达式值的整数. 注意: 有效的算符为 '+'.'-'.' ...

  10. 最短小精悍的js数组打乱顺序

          let number = [1, 45, 13, 17];       // 封装一个打乱数组的方法       function getarr(arr) {         return ...