bitpie钱包下载官网|urb
词根词缀第4天:urb - 知乎
词根词缀第4天:urb - 知乎首发于看美剧学英语切换模式写文章登录/注册词根词缀第4天:urb魏老师帮求职深圳市帮帮留学服务有限公司 法定代表人欢迎关注我的“硅谷帮”公众号,专属美国华人的组织。每天学会一个词根或词缀,就能轻松背会一堆新单词。大家好,我是硅谷帮帮主今天学习的词根是:urb,意思是:都市,城市。词根urb来源于拉丁语 urbs 城市,它的异形同义词根: polis 城市。相关的常用单词:1、suburb :[名词]郊区,靠近城市的地方单词逻辑:sub(=under:下,也有“次要“的意思)+urb,次要的城市,城市的下面,就是郊区的感觉2、urbanite:[名词]城市居住的人单词逻辑:urb+an+ite(ite:人),看到urb,就想到城市,可以直接忽略an,ite跟在任何单词最后都表示“人”的意思。所以和在一起就是“城市人”其他:urbanize: 意思是“使城市化”,“ize”后缀在任何单词最后都是“使变成xxx样”;urbanology:意思是“城市学”,我也不知道这个学科具体是研究啥的,任何单词最后跟着“ology”一般都是“xxx学”的意思3、conurbation:[名词]城市群单词逻辑:con(集合,组合)+urb+ation,con在很多单词的前缀都是“组合”的意思。“ion”放在单词后面的作用是把单词名词化。这样很简单好记吧!如果你记住了每天讲的这些词根,说实话,你就是自己组合出来一个根本不存在的新词,美国人也是能够猜出意思的。就像我们也会经常造出“作死”这类以前不存在的中文词。4、inurbane:[形容词]不文雅的,不礼貌的单词逻辑:in(非,不)+urb+ane,in在很多单词的前面都是“非,不”的意思,ane会常用在形容词后面。“不城市的”那就是不文明,不文雅的感觉了。发布于 2019-12-14 11:54词根词缀词根英语词根赞同 9添加评论分享喜欢收藏申请转载文章被以下专栏收录看美剧学英语通过美剧场景把单词记到骨
urb是什么意思_urb的翻译_音标_读音_用法_例句_爱词霸在线词典
什么意思_urb的翻译_音标_读音_用法_例句_爱词霸在线词典首页翻译背单词写作校对词霸下载用户反馈专栏平台登录urb是什么意思_urb用英语怎么说_urb的翻译_urb翻译成_urb的中文意思_urb怎么读,urb的读音,urb的用法,urb的例句翻译人工翻译试试人工翻译翻译全文urb英 ['ɜ:b]美 ['ɜb]释义abbr.urban 都市的; urbanite 城市居民; urbanization 都市化; urbanist 城市规划专家点击 人工翻译,了解更多 人工释linux内核中的URB请求(30) - 知乎
linux内核中的URB请求(30) - 知乎首发于zuost的linux驱动学习切换模式写文章登录/注册linux内核中的URB请求(30)小左路在脚下?1 URB结构体USB请求块(USB Request Block,URB)是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体。2 URB处理流程USB设备中的每个端点都处理一个URB队列,在队列被清空之前,一个URB的典型生命周期如下。 被一个USB设备驱动创建 iso_packets是这个URB应当包含的等时数据包的数目,若为0表示不创建等时数据包。mem_flags参数是分配内存的标志,和kmalloc()函数的分配标志参数含义相同。如果分配成功,该函数返回一个URB结构体指针,否则返回0。 URB结构体在驱动中不宜静态创建,因为这可能破坏USB核心给URB使用的引用计数方法。 usb_alloc_urb()的“反函数”为: 该函数用于释放由usb_alloc_urb()分配的URB结构体。 初始化,被安排给一个特定USB设备的特定端点。 对于中断URB,使用usb_fill_int_urb()函数来初始化URB,如下所示: URB参数指向要被初始化的URB的指针;dev指向这个URB要被发送到的USB设备;pipe是这个URB要被发送到的USB设备的特定端点;transfer_buffer是指向发送数据或接收数据的缓冲区的指针,和URB一样,它也不能是静态缓冲区,必须使用kmalloc()来分配;buffer_length是transfer_buffer指针所指向缓冲区的大小;complete指针指向当这个URB完成时被调用的完成处理函数;context是完成处理函数的“上下文” ;interval是这个URB应当被调度的间隔。 上述函数参数中的pipe使用usb_sndintpipe()或usb_rcvintpipe()创建。 对于批量URB,使用usb_fill_bulk_urb()函数来初始化,如下所示: 除了没有对应于调度间隔的interval参数以外,该函数的参数和usb_fill_int_urb()函数的参数含义相同。 上述函数参数中的pipe使用usb_sndbulkpipe()或者usb_rcvbulkpipe()函数来创建。 对于控制URB,使用usb_fill_control_urb()函数来初始化,如下所示: 除了增加了新的setup_packet参数以外,该函数的参数和usb_fill_bulk_urb()函数的参数含义相同。 setup_packet参数指向即将被发送到端点的设置数据包。 上述函数参数中的pipe使用usb_sndctrlpipe()或usb_rcvictrlpipe()函数来创建。 等时URB没有像中断、控制和批量URB的初始化函数usb_fill_iso_urb(),我们只能手动对它初始化,而后才能提交给USB核心。代码如下给出了初始化等时URB的例子,它来自drivers/media/usb/uvc/uvc_video.c文件。 被USB设备驱动提交给USB核心。 在完成第1)、2)步的创建和初始化URB后,URB便可以提交给USB核心了,可通过usb_submit_urb()函数来完成,如下所示: URB参数是指向URB的指针,mem_flags参数与传递给kmalloc()函数参数的意义相同,它用于告知USB核心如何在此时分配内存缓冲区。 在提交URB到USB核心后,直到完成函数被调用之前,不要访问URB中的任何成员。 usb_submit_urb()在原子上下文和进程上下文中都可以被调用,mem_flags变量需根据调用环境进行相应的设置,如下所示。 ·GFP_ATOMIC:在中断处理函数、底半部、tasklet、定时器处理函数以及URB完成函数中,在调用者持有自旋锁或者读写锁时以及当驱动将current->state修改为非TASK_RUNNING时,应使用此标志。 GFP_NOIO:在存储设备的块I/O和错误处理路径中,应使用此标志; GFP_KERNEL:如果没有任何理由使用GFP_ATOMIC和GFP_NOIO,就使用GFP_KERNEL 如果usb_submit_urb()调用成功,即URB的控制权被移交给USB核心,该函数返回0;否则,返回错误号。 提交由USB核心指定的USB主机控制器驱动 被USB主机控制器处理, 进行一次到USB设备的传送 第4)~5)步由USB核心和主机控制器完成,不受USB设备驱动的控制。 当URB完成,USB主机控制器驱动通知USB设备驱动。 在如下3种情况下,URB将结束,URB完成回调函数将被调用(完成回调是通过usb_fill_xxx_urb的参数传入的)。在完成回调中,我们通常要进行urb->status的判断。 ·URB被成功发送给设备,并且设备返回正确的确认。如果urb->status为0,意味着对于一个输出URB,数据被成功发送;对于一个输入URB,请求的数据被成功收到。 如果发送数据到设备或从设备接收数据时发生了错误,urb->status将记录错误值。 URB被从USB核心“去除连接” ,这发生在驱动通过usb_unlink_urb()或usb_kill_urb()函数取消或URB虽已提交而USB设备被拔出的情况下。 usb_unlink_urb()和usb_kill_urb()这两个函数用于取消已提交的URB,其参数为要被取消的URB指针。usb_unlink_urb()是异步的,搞定后对应的完成回调会被调用;而usb_kill_urb()会彻底终止URB的生命周期并等待这一行为,它通常在设备的disconnect()函数中被调用。 当URB生命结束时(处理完成或被解除链接),在URB的完成回调中通过URB结构体的status成员可以获知其原因,如0表示传输成功,-ENOENT表示被usb_kill_urb()杀死,-ECONNRESET表示被usb_unlink_urb()杀死,-EPROTO表示传输中发生了bitstuff错误或者硬件未能及时收到响应数据包,-ENODEV表示USB设备已被移除,-EXDEV表示等时传输仅完成了一部分等。 对以上URB的处理步骤进行一个总结,图16.4给出了一个URB的完整处理流程,虚线框的usb_unlink_urb()和usb_kill_urb()并不一定会发生,它们只是在URB正在被USB核心和主机控制器处理时又被驱动程序取消的情况下才发生。发布于 2023-07-19 10:28・IP 属地江苏LinuxLinux 内核请求数据赞同添加评论分享喜欢收藏申请转载文章被以下专栏收录zuost的linux驱动学习记录自己的linux驱动学
linux usb驱动中的urb详解_linux kernel usb_kill_urb实现的内容-CSDN博客
>linux usb驱动中的urb详解_linux kernel usb_kill_urb实现的内容-CSDN博客
linux usb驱动中的urb详解
最新推荐文章于 2024-03-04 17:32:18 发布
lemontree1945
最新推荐文章于 2024-03-04 17:32:18 发布
阅读量9.8k
收藏
29
点赞数
6
分类专栏:
linux
文章标签:
linux
usb
urb
linux
专栏收录该内容
141 篇文章
9 订阅
订阅专栏
linux 内核中的 USB 代码和所有的 USB 设备通讯使用称为 urb 的东西( USB request block). 这个请求块用 struct urb 结构描述并且可在 include/linux/usb.h 中找到.
一个urb 用来发送或接受数据到或者从一个特定 USB 设备上的特定的 USB 端点, 以一种异步的方式.一个 USB 设备驱动可能分配许多 urb 给一个端点或者可能重用单个 urb 给多个不同的端点, 根据驱动的需要. 设备中的每个端点都处理一个 urb 队列, 以至于多个 urb 可被发送到相同的端点, 在队列清空之前. 一个 urb 的典型生命循环如下:
被一个 USB 设备驱动创建. 安排给一个特定 USB 设备的特定端点. 提交给 USB 核心, 被 USB 设备驱动. 提交给特定设备的被 USB 核心指定的 USB 主机控制器驱动, . 被 USB 主机控制器处理, 它做一个 USB 传送到设备. 当 urb 完成, USB 主机控制器驱动通知 USB 设备驱动.
urb 也可被提交这个 urb 的驱动在任何时间取消, 或者被 USB 核心如果设备被从系统中移出. urb 被动态创建并且包含一个内部引用计数, 使它们在这个 urb 的最后一个用户释放它时被自动释放.
1、URB结构体分析
struct urb代码如下:
1 struct urb {
2
3 struct kref kref;
4 void *hcpriv;
5 atomic_t use_count;
6 atomic_t reject;
7 int unlinked;
8
9
10 struct list_head urb_list;
12 struct list_head anchor_list;
13 struct usb_anchor *anchor;
14 struct usb_device *dev;
15 struct usb_host_endpoint *ep;
16 unsigned int pipe;
17 int status;
18 unsigned int transfer_flags;
19 void *transfer_buffer;
20 dma_addr_t transfer_dma;
21 struct usb_sg_request *sg;
22 int num_sgs;
23 u32 transfer_buffer_length;
24 u32 actual_length;
25 unsigned char *setup_packet;
26 dma_addr_t setup_dma;
27 int start_frame;
28 int number_of_packets;
29 int interval;
31 int error_count;
32 void *context;
33 usb_complete_t complete;
34 struct usb_iso_packet_descriptor iso_frame_desc[0];
35
36 };
14 struct usb_device *dev;
指向这个urb要发送的struct usb_device 的指针,在urb发送到usb核心之前,这个变量必须被usb驱动初始化。
16 unsigned int pipe;
可以称之为管道,也可以称为端点消息,是给这个urb发送到的特定struct usb_device,同理,在urb发送到usb核心之前,这个变量必须被usb驱动初始化。
为了设置这个pipe,驱动有一些初始化函数,这里要注意,每个pipe只可能是其中一种类型、、、
unsigned int usb_sndctrlpipe(struct usb_device *dev, unsigned int endpoint)
//指定一个控制 OUT 端点给特定的带有特定端点号的 USB 设备.
unsigned int usb_rcvctrlpipe(struct usb_device *dev, unsigned int endpoint)
//指定一个控制 IN 端点给带有特定端点号的特定 USB 设备.
unsigned int usb_sndbulkpipe(struct usb_device *dev, unsigned int endpoint)
//指定一个块 OUT 端点给带有特定端点号的特定 USB 设备
unsigned int usb_rcvbulkpipe(struct usb_device *dev, unsigned int endpoint)
//指定一个块 IN 端点给带有特定端点号的特定 USB 设备
unsigned int usb_sndintpipe(struct usb_device *dev, unsigned int endpoint)
//指定一个中断 OUT 端点给带有特定端点号的特定 USB 设备
unsigned int usb_rcvintpipe(struct usb_device *dev, unsigned int endpoint)
//指定一个中断 IN 端点给带有特定端点号的特定 USB 设备
unsigned int usb_sndisocpipe(struct usb_device *dev, unsigned int endpoint)
//指定一个同步 OUT 端点给带有特定端点号的特定 USB 设备
unsigned int usb_rcvisocpipe(struct usb_device *dev, unsigned int endpoint)
//指定一个同步 IN 端点给带有特定端点号的特定 USB 设备
18 unsigned int transfer_flags;
这个变量可被设置为不同的位值,根据这个位,usb驱动可以设置urb传输的状态,具体可用值详见ldd3.
19 void *transfer_buffer;
指向缓冲区的指针,这个指针可以是OUT urb 或者是In urb。主机控制器为了正确使用这个缓冲区,必须使用kmalloc调用来创建它,而不是堆栈或者静态数据区。对于控制端点,这个缓冲是给发送的数据。
20 dma_addr_t transfer_dma;
用来使用DMA传送数据到usb设备的缓冲。
23 u32 transfer_buffer_length;
缓冲区的长度,由于urb只会使用buffer或者dma其中一种来传输数据,所以这个长度可以被它们共用。如果这是0,表示没有传送缓冲被usb核心所使用。
25 unsigned char *setup_packet;
指向一个控制urb的setup报文的指针,在位于正常传送缓冲的数据之前被传送,这个变量只对控制urb有效。
26 dma_addr_t setup_dma;
给控制 urb 的 setupt 报文的 DMA 缓冲. 在位于正常传送缓冲的数据之前被传送. 这个变量只对控制 urb 有效.
24 u32 actual_length;
当urb完成处理后,这个变量被设置为数据的真实长度,或者由这个urb(OUT)发送,或者由这个urb(IN)接受。对于IN urb,这个值必须被用来替代taansfer_buffer_length,因为接收的数据可能比整个缓冲区的大小小。
17 int status;
当这个 urb 被结束, 或者开始由 USB 核心处理, 这个变量被设置为 urb 的当前状态. 一个 USB 驱动可安全存取这个变量的唯一时间是在 urb 完成处理者函数中(在"CompletingUrbs: 完成回调处理者"一节中描述). 这个限制是阻止竞争情况, 发生在这个 urb 被 USB 核心处理当中. 对于同步 urb, 在这个变量中的一个成功的值(0)只指示是否这个 urb 已被去链. 为获得在同步 urb 上的详细状态, 应当检查 iso_frame_desc 变量.
这个变量的有效值包括:
0
//这个 urb 传送是成功的.
-ENOENT
//这个 urb 被对 usb_kill_urb 的调用停止.
-ECONNRESET
//urb 被对 usb_unlink_urb 的调用去链, 并且 transfer_flags 变量被设置为 URB_ASYNC_UNLINK.
-EINPROGRESS
-EPROTO
-EILSEQ
//在这个 urb 传送中有一个 CRC 不匹配.
-EPIPE
-ECOMM
//在传送中数据接收快于能被写入系统内存. 这个错误值只对 IN urb.
-ENOSR
-EOVERFLOW
-EREMOTEIO
-ENODEV
//这个 USB 设备现在从系统中消失.
-EXDEV
-EINVAL
-ESHUTDOWN
33 usb_complete_t complete;
指向完成处理者函数的指针, 它被 USB 核心调用当这个 urb 被完全传送或者当 urb 发生一个错误. 在这个函数中, USB 驱动可检查这个 urb, 释放它, 或者重新提交它给另一次传送.
32 void *context;
指向数据点的指针, 它可被 USB 驱动设置. 它可在完成处理者中使用当 urb 被返回到驱动. 可能是在回调函数使用的数据。
27 int start_frame;
设置或者返回同步传送要使用的初始帧号。
29 int interval; 只对同步 urb 有效, 并且指定这个 urb 要处理的同步传送缓冲的编号. 在这个 urb 发送给 USB 核心之前,这个值必须被 USB 驱动设置给同步 urb .
31 int error_count;
被 USB 核心设置, 只给同步 urb 在它们完成之后. 它指定报告任何类型错误的同步传送的号码.
34 struct usb_iso_packet_descriptor iso_frame_desc[0];
只对同步 urb 有效. 这个变量是组成这个 urb 的一个 struct usb_iso_packet_descriptor 结构数组. 这个结构允许单个 urb 来一次定义多个同步传送. 它也用来收集每个单独传送的传送状态
2、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, 某个错误在 USB 核心中发生了, 并且驱动需要正确地清理.
在创建了一个 urb 之后, 它必须被正确初始化在它可被 USB 核心使用之前. 如何初始化不同类型 urb 见下一节
为了告诉 USB 核心驱动用完这个 urb, 驱动必须调用 usb_free_urb 函数. 这个函数只有一个参数:
void usb_free_urb(struct urb *urb);
参数是一个指向你要释放的 struct urb 的指针. 在这个函数被调用之后, urb 结构消失, 驱动不能再存取它.
3、中断 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);
这个函数包含许多参数:
struct urb *urb
指向要被初始化的 urb 的指针.
struct usb_device *dev
这个 urb 要发送到的 USB 设备.
unsigned int pipe
这个 urb 要被发送到的 USB 设备的特定端点. 这个值被创建, 使用前面提过的 usb_sndintpipe 或者 usb_rcvintpipe 函数.
void *transfer_buffer
指向缓冲的指针, 从那里外出的数据被获取或者进入数据被接受. 注意这不能是一个静态的缓冲并且必须使用 kmalloc 调用来创建.
int buffer_length
缓冲的长度, 被 transfer_buffer 指针指向.
usb_complete_t complete
指针, 指向当这个 urb 完成时被调用的完成处理者.
void *context
指向数据块的指针, 它被添加到这个 urb 结构为以后被完成处理者函数获取.
int interval
这个 urb 应当被调度的间隔. 见之前的 struct urb 结构的描述, 来找到这个值的正确单位.
4、块urb
块 urb 被初始化非常象中断 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 变量, 因此任何对这个成员的修改不得不由这个驱动自己完成.
5、控制urb
控制 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 调用更简单.
6、同步urb
不幸的是, 同步 urb 没有一个象中断, 控制, 和块 urb 的初始化函数. 因此它们必须在驱动中"手动"初始化, 在它们可被提交给 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;
}
7、提交 urb
一旦 urb 被正确地创建,并且被 USB 驱动初始化, 它已准备好被提交给 USB 核心来发送出到 USB 设备. 这通过调用函数usb_submit_urb 实现:
int usb_submit_urb(struct urb *urb, int mem_flags);
urb 参数是一个指向 urb 的指针, 它要被发送到设备. mem_flags 参数等同于传递给 kmalloc 调用的同样的参数, 并且用来告诉 USB 核心如何及时分配任何内存缓冲在这个时间.
在 urb 被成功提交给 USB 核心之后, 应当从不试图存取 urb 结构的任何成员直到完成函数被调用.
因为函数 usb_submit_urb 可被在任何时候被调用(包括从一个中断上下文), mem_flags 变量的指定必须正确.根据 usb_submit_urb 被调用的时间,只有 3 个有效值可用:
GFP_ATOMIC
只要满足以下条件,就应当使用此值:
1.调用者处于一个 urb 结束处理例程,中断处理例程,底半部,tasklet或者一个定时器回调函数.
2.调用者持有自旋锁或者读写锁. 注意如果正持有一个信号量, 这个值不必要.
3.current->state 不是 TASK_RUNNING. 除非驱动已自己改变 current 状态,否则状态应该一直是 TASK_RUNNING .
GFP_NOIO
驱动处于块 I/O 处理过程中. 它还应当用在所有的存储类型的错误处理过程中.
GFP_KERNEL
所有不属于之前提到的其他情况
8、完成 urb: 完成回调处理者
如果对 usb_submit_urb 的调用成功, 驱动将传递对 urb 的控制给 USB 核心, 这个函数返回 0; 否则, 一个负错误值被返回. 如果函数调用成功, urb 的完成处理者(就是complete指定的的函数)被确切地调用一次, 当 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 已经被提交给它
9、取消 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 中.
至此,关于urb的结构,功能,提交和取消全部介绍完毕,对于一般的USB驱动,应该是足够用了,本文大多数内容引用自ldd3,有少部分我做了修改,方便自己查阅,同时分享自己的学习心得。
优惠劵
lemontree1945
关注
关注
6
点赞
踩
29
收藏
觉得还不错?
一键收藏
知道了
0
评论
linux usb驱动中的urb详解
linux 内核中的 USB 代码和所有的 USB 设备通讯使用称为 urb 的东西( USB request block). 这个请求块用 struct urb 结构描述并且可在 include/linux/usb.h 中找到. 一个urb 用来发送或接受数据到或者从一个特定 USB 设备上的特定的 USB 端点, 以一种异步的方式.一个 USB 设备驱动可能分配许
复制链接
扫一扫
专栏目录
RK3588平台开发系列讲解(USB篇)URB通信过程详解
内核笔记
09-25
3686
在Linux系统中,USB驱动程序和USB设备之间使用URB进行通信。urb以异步传输的方式,同一个特定USB设备的特定端点实现数据发送和接收。
Linux系统下USB摄像头驱动开发
12-10
摘要:介绍了在Iinux系统下开发符合Video for Linux标准的USB摄像头驱动的方法,并对该标准提出“不间断采集”的改进思路,配合双URB、双帧缓冲等方法,提高采集速度。 关键词:Linux设备驱动 USB摄像头 Video for ...
参与评论
您还未登录,请先
登录
后发表或查看评论
urb分析,usb_fill_bulk_urb函数理解
linken_yue的博客
06-23
779
https://blog.csdn.net/liangxiaozhang/article/details/8332080
Linux环境下的USB摄像头驱动开发
08-14
嵌入式环境下的USB摄像头驱动需要充分利用USB总线与内核中的USB核心密切配合并且保证数据流的高速与稳定。本文从Linux内核的USB核心模块出发,遵循Video4Linux接口标准,采用urb策略与内存映射的方式以提高数据读取速度,设计开发了基于Linux环境下的USB摄像头驱动,并在ARM9实验平台上对该驱动程序进行了测试与分析。
linux usb 驱动之创urb的创建和销毁
一叶知秋的博客
01-05
884
linux usb 驱动之创urb的创建和销毁
linux usb urb,usb中urb接口函数
weixin_42122306的博客
05-13
535
一. 简介usb总线是一种轮询式总线,协议规定所有的数据传输都必须由主机发起,usb主机与设备之间是通过管道(pipe)传输的,管道两边分别对应主机中的数据缓冲区和设备侧的端点(endpoint),端点是通信的发送和接收点,要发送数据,只要把数据发到对应的端点就可以,而这个数据发送的动作由usb主机实现,驱动中只需确定接收端点,然后把数据提交给主机控制器,主机会把数据发送给接收端点,原理同i2c,...
浅谈Linux USB设备驱动
JJ1116的博客
03-23
4809
1、USB基础介绍
1-1、USB硬件接口介绍
USB接口在硬件上总共有四根线组成VCC、D+、D-、GND,通过计算D+和D-的差值来确定数据。USB设备在传输速率上可以分为低速(1.5Mbps)、全速(12Mbps),高速(480Mbps)。在USB主机控制器端D+和D-都皆有一个下拉电阻,在USB设备端的D+或D-接了一个上拉电阻,USB设备插入后USB主机控制器的D+或D-会被拉高,这样USB主机控制器就能发现有设备接入。USB设备是主从式的设备,主机是在host端的主机控制器,从机就是如鼠标、
Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
|~~~热爱生活、努力学习的小伙汁~~~|
07-01
943
设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。
设备驱动程序是内核的一部分,主要完成以下功能:
对设备的初始化和释放;把数据从内核传送到硬件设备和从硬件设备读取数据;读取应用程序数据传送给设备文件和回送应用程序请求的数据;检测和处理硬件设备出现...
linux的usb驱动中urb的理解
abkzcyb5892的博客
10-07
873
linux 内核中的 USB 代码和所有的 USB 设备通讯使用称为 urb 的东西( USB requestblock). 这个请求块用 struct urb 结构描述并且可在 include/linux/usb.h 中找到.
一个urb 用来发送或接受数据到或者从一个特定 USB 设备上的特定的 USB 端点, 以一种异步的方式.一个 USB 设备驱动可能...
linux usb声卡 submit urb,linux usb urb详解
weixin_34602954的博客
05-13
324
linux usb urb详解谨以此文纪念过往的岁月一.前言在前文中看过了hub的驱动以及host的驱动还有usb设备的驱动,在把这些东西关联起来的东东中,一个很重要的urb(usb request blk),在本文中会详细来看urb的实现,以及具体的应用。二.Urburb是什么东西,那先来看urb的定义吧。1struct urb2{3/*私有的:只能由usb核心和主机控制器访问的字段*/4str...
USB URB
wangsh217的专栏
08-09
858
URB定义:
usb 请求块(usb request block, urb)是usb设备驱动中用来描述与usb设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体,是usb主机与设备通信的电波。
struct urb {
/* private: usb core and host controller only fields in the urb
Linux System Error & Urb Error Status
07-14
-EINPROGRESS 这个 urb 仍然在被 USB 主机控制器处理中. 如果你的驱动 曾见到这个值, 它是一个你的驱动中的 bug. -EPROTO 这个 urb 发生下面一个错误: 一个 bitstuff 错误在传送中 发生.硬件没有及时收到响应帧. ......
linux系统USB键盘驱动源码+使用说明文档.zip
07-08
linux系统下USB键盘驱动源码+使用文档说明 如何编写Linux下的USB键盘驱动 1. 指定USB键盘驱动所需的头文件: #include
【Linux】Linux的管道与重定向
AliceNo的博客
03-02
988
在Linux系统中,管道和重定向是使命令行操作更为灵活和高效的关键工具。通过管道,我们可以将一个命令的输出作为另一个命令的输入,实现命令之间的连接和协作。而重定向则允许我们将命令的输入和输出从默认位置进行定向,使得我们能够轻松地将结果保存到文件中或者从文件中读取输入。本文将详细探讨这两个重要概念,并演示它们在日常Linux命令行操作中的应用。管道和重定向是Linux命令行中的两个强大而灵活的工具,它们为用户提供了处理和操作命令输入输出的便利方式。
Linux的安全性有哪些保障措施和实现方式
coder_wwwdy的博客
03-03
546
使用`iptables`或`firewalld`等工具配置网络防火墙规则,控制进出系统的网络流量。- 使用安全配置工具和脚本,如`security-onion`或`cis-benchmarks`。- 通过`chown`、`chmod`和`chgrp`命令管理文件和目录的所有权和权限。- 使用`syslog`、`rsyslog`或`logrotate`等工具记录系统日志。- 使用`yum`、`apt`或`pacman`等包管理器自动安装安全更新。- 使用`sudo`命令限制普通用户执行特定命令的权限。
在 Linux 上用 zram 替代传统交换空间 | Linux 中国
最新发布
bo_的博客
03-04
1034
我在我的电脑上花了很多时间(我是说工作),我发现了很多有趣的东西。其中最近引起我注意的是zram0设备。我是在几个月前写一篇文章时第一次注意到它,它显示在lsblk它被识别为交换空间,这就是首先引起我的好奇心的原因,所以我做了一些研究。zram 最初被称为 “压缩缓存(compcache)”,即 “压缩的高速缓存”。事实证明,zram 是一个用于创建内存内压缩缓存的工具,特别是作为交换空间使用。但为什么呢?当我开始研究 zram 时,我只发现了几篇关于将 zram 用于交换空间的基础文章。
Linux文本处理三剑客:awk
TiYong的博客
03-02
1525
gawk - pattern scanning and processing language(模式扫描和处理语言)。AWK 的名称是由它们设计者的名字缩写而来 ——Afred Aho, Peter Weinberger与Brian Kernighan。
Linux 查询端口被占用命令
qq_43108153的博客
03-02
815
端口冲突查看
linux usb驱动开发 清理缓存区
06-10
在Linux USB驱动中,清理缓存区的方法会根据具体的情况而有所不同。下面我列出几种常见的情况和对应的清理方法:
1. 在读取USB数据时,可以使用usb_bulk_msg函数,函数会将读取到的数据存放在缓存区中,此时可以使用usb_kill_urb函数来终止当前的读取操作并清空缓存区。
2. 在写入USB数据时,可以使用usb_bulk_msg函数,函数会将要写入的数据存放在缓存区中,此时可以使用usb_get_urb函数来获取当前的写入操作,然后使用usb_kill_urb函数终止写入操作并清空缓存区。
3. 在USB驱动中,可能会有一些缓存区用于存放驱动程序自己的数据,此时可以使用memset函数将缓存区清空。
需要注意的是,在清空缓存区时,需要注意是否有其他线程或者进程正在访问缓存区,以避免出现数据竞争等问题。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
lemontree1945
CSDN认证博客专家
CSDN认证企业博客
码龄8年
暂无认证
68
原创
4万+
周排名
5797
总排名
104万+
访问
等级
7011
积分
160
粉丝
322
获赞
44
评论
1181
收藏
私信
关注
热门文章
linux kill -9 杀不掉的进程
101514
tcp retransmission原因
96976
shell将命令执行的结果赋值给 变量
45968
Linux开启路由转发功能
45741
划分子网例题详解
39534
分类专栏
lua
3篇
python
12篇
linux
141篇
android
2篇
git
5篇
STM32
3篇
shell
27篇
杂谈
net
1篇
nginx
10篇
svn
1篇
kvm
9篇
tomcat
3篇
redis
12篇
xshell
1篇
丁丁
1篇
samba
2篇
监控
mongodb
1篇
lvs
1篇
docker
2篇
elk
1篇
mysql
1篇
C++
19篇
kernel
4篇
vs
1篇
golang
7篇
最新评论
Linux操作系统不同大小硬盘之间的系统拷贝
阿富→入门小白:
真的太牛了大神
linux kill -9 杀不掉的进程
jiangdoubing:
结果一路找到1号进程是吧
E: Some index files failed to download. They have been ignored, or old ones used instead.解决方案
qq_41609921:
非常感谢,已解决
E: Some index files failed to download. They have been ignored, or old ones used instead.解决方案
横刀天笑:
长姿势了,非常感谢。应该更多时候就是自己的网络问题。当我切换源以后还提示我网络问题时我果断更换自己的网络了
linux kill -9 杀不掉的进程
trisunlee:
如果父进程因处于T状态也kill不掉,则再用文章中的方法找父进程pid的方法找父进程的父进程的pid,直到找到能kill的父进程。
最新文章
使用vs编译paho.mqqt.c
开源libmodbus编译为32位和64位动态库
ubuntu离线安装包下载和安装
2024年1篇
2023年4篇
2022年2篇
2021年6篇
2020年2篇
2019年13篇
2018年202篇
2017年42篇
目录
目录
分类专栏
lua
3篇
python
12篇
linux
141篇
android
2篇
git
5篇
STM32
3篇
shell
27篇
杂谈
net
1篇
nginx
10篇
svn
1篇
kvm
9篇
tomcat
3篇
redis
12篇
xshell
1篇
丁丁
1篇
samba
2篇
监控
mongodb
1篇
lvs
1篇
docker
2篇
elk
1篇
mysql
1篇
C++
19篇
kernel
4篇
vs
1篇
golang
7篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
USB 请求块 (URB) - Windows drivers | Microsoft Learn
USB 请求块 (URB) - Windows drivers | Microsoft Learn
跳转至主内容
此浏览器不再受支持。
请升级到 Microsoft Edge 以使用最新的功能、安全更新和技术支持。
下载 Microsoft Edge
有关 Internet Explorer 和 Microsoft Edge 的详细信息
目录
退出焦点模式
使用英语阅读
保存
目录
使用英语阅读
保存
打印
电子邮件
目录
USB 请求阻止 (URB)
项目
01/12/2024
1 个参与者
反馈
本文内容
本文介绍 (URB) 的 USB 请求块,并提供有关 USB 客户端驱动程序如何使用 Windows 驱动程序模型 (WDM) 例程来分配、生成 URB 并将其提交到 USB 驱动程序堆栈的信息。
通用串行总线 (USB) 客户端驱动程序无法直接与其设备通信。 相反,客户端驱动程序会创建请求并将其提交到 USB 驱动程序堆栈进行处理。 在每个请求中,客户端驱动程序提供一个可变长度的数据结构,称为 USB 请求块 (URB) 。 URB 结构描述请求的详细信息,还包含有关已完成请求状态的信息。 客户端驱动程序通过 URL 执行所有特定于设备的操作,包括数据传输。 在将请求提交到 USB 驱动程序堆栈之前,客户端驱动程序必须使用有关请求的信息初始化 URB。 对于某些类型的请求,Microsoft 提供帮助程序例程和宏,这些例程和宏分配 URB 结构,并使用客户端驱动程序提供的详细信息填充 URB 结构的必要成员。
每个 URB 都以标准固定大小的标头开头, (_URB_HEADER) ,其用途是标识请求的操作类型。 _URB_HEADER 的 Length 成员指定 URB 的大小(以字节为单位)。 Function 成员必须是一系列系统定义的URB_FUNCTION_XXX常量之一,用于确定所请求的操作类型。 例如,在数据传输的情况下,此成员指示传输的类型。 函数代码URB_FUNCTION_CONTROL_TRANSFER、URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER和URB_FUNCTION_ISOCH_TRANSFER分别指示控制、批量/中断和常时等量传输。 USB 驱动程序堆栈使用 Status 成员返回特定于 USB 的状态代码。
为了提交 URB,客户端驱动程序使用 IOCTL_INTERNAL_USB_SUBMIT_URB 请求,该请求通过 I/O 请求数据包 (IRP) 类型IRP_MJ_INTERNAL_DEVICE_CONTROL传递到设备。
USB 驱动程序堆栈处理完 URB 后,驱动程序堆栈将使用 URB 结构的 Status 成员返回特定于 USB 的状态代码。
注意
KMDF 和 UMDF 驱动程序开发人员应使用相应的框架接口来与 USB 设备通信。 有关详细信息,请参阅使用用于 KMDF 驱动程序的 USB 设备和在 UMDF 中使用 USB 接口。 这些主题讨论用于 USB 设备通信的基础 WDM 驱动程序接口。
在本节中
主题
说明
分配和构建 URB
本主题介绍 USB 客户端驱动程序如何在将请求发送到 Microsoft 提供的 USB 驱动程序堆栈之前,使用 Windows 驱动程序模型 (WDM) 驱动程序例程来分配和格式化 URB。
如何提交 URB
本主题介绍将初始化的 URB 提交到 USB 驱动程序堆栈以处理特定请求所需的步骤。
最佳做法:使用 URB
本主题介绍客户端驱动程序分配、生成 URB 并将其发送到Windows 8随附的 USB 驱动程序堆栈的最佳做法。
相关主题
USB 驱动程序开发指南
其他资源
加州消费者隐私法案 (CCPA) 禁用图标
你的隐私选择
主题
亮
暗
高对比度
早期版本
博客
参与
隐私
使用条款
商标
© Microsoft 2024
其他资源
本文内容
加州消费者隐私法案 (CCPA) 禁用图标
你的隐私选择
主题
亮
暗
高对比度
早期版本
博客
参与
隐私
使用条款
商标
© Microsoft 2024
USB设备---URB请求块 - 隔壁王叔叔a - 博客园
USB设备---URB请求块 - 隔壁王叔叔a - 博客园
会员
周边
新闻
博问
AI培训
云市场
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式 ...
退出登录
注册
登录
隔壁王叔叔a
博客园
首页
新随笔
联系
订阅
管理
USB设备---URB请求块
1.urb 结构体
USB 请求块(USB request block,urb)是USB 设备驱动中用来描述与USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff 结构体。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct urb
{
/*
私有的:只能由USB 核心和主机控制器访问的字段 */
struct kref
kref; /*urb
引用计数 */
void *hcpriv; /*
主机控制器私有数据 */
atomic_t
use_count; /*
并发传输计数 */
u8
reject; /*
传输将失败*/
int unlink; /*
unlink 错误码 */
/*
公共的: 可以被驱动使用的字段 */
struct list_head
urb_list; /*
链表头*/
struct usb_anchor
*anchor;
struct usb_device
*dev; /*
关联的USB 设备 */
struct usb_host_endpoint
*ep;
unsigned int pipe; /*
管道信息 */
int status; /*
URB 的当前状态 */
unsigned int transfer_flags; /*
URB_SHORT_NOT_OK | ...*/
void *transfer_buffer; /*
发送数据到设备或从设备接收数据的缓冲区 */
dma_addr_t
transfer_dma; /*用来以DMA
方式向设备传输数据的缓冲区 */
int transfer_buffer_length;/*transfer_buffer
或transfer_dma 指向缓冲区的大小 */
int actual_length; /*
URB 结束后,发送或接收数据的实际长度 */
unsigned char *setup_packet; /*
指向控制URB 的设置数据包的指针*/
dma_addr_t
setup_dma; /*控制URB
的设置数据包的DMA 缓冲区*/
int start_frame; /*等时传输中用于设置或返回初始帧*/
int number_of_packets; /*等时传输中等时缓冲区数量
*/
int interval; /*
URB 被轮询到的时间间隔(对中断和等时urb 有效) */
int error_count; /*
等时传输错误数量 */
void *context; /*
completion 函数上下文 */
usb_complete_t
complete; /*
当URB 被完全传输或发生错误时,被调用 */
/*单个URB
一次可定义多个等时传输时,描述各个等时传输 */
struct usb_iso_packet_descriptor
iso_frame_desc[0];
};
2.urb 处理流程
USB 设备中的每个端点都处理一个urb 队列,在队列被清空之前,一个urb 的典型生命周期
如下。
(1)被一个USB 设备驱动创建。 (创建URB)
创建urb 结构体的函数为:
struct urb *usb_alloc_urb(int iso_packets, int mem_flags);
iso_packets 是这个urb 应当包含的等时数据包的数目,若为0 表示不创建等时数据包。
mem_flags 参数是分配内存的标志,和kmalloc()函数的分配标志参数含义相同。如果分配成功,该函数返回一个urb 结构体指针,否则返回0。
urb 结构体在驱动中不能静态创建,因为这可能破坏USB 核心给urb 使用的引用计数方法。
usb_alloc_urb()的“反函数”为:
void usb_free_urb(struct urb *urb);
该函数用于释放由usb_alloc_urb()分配的urb 结构体。
(2)初始化,被安排给一个特定USB 设备的特定端点。(填充URB)
对于中断urb,使用usb_fill_int_urb()函数来初始化urb,如下所示:
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 的指针;dev 指向这个urb 要被发送到的USB 设备;pipe 是这个urb 要被发送到的USB 设备的特定端点;transfer_buffer 是指向发送数据或接收数据的缓冲区的指针,和urb 一样,它也不能是静态缓冲区,必须使用kmalloc()来分配;buffer_length 是transfer_buffer 指针所指向缓冲区的大小;complete
指针指向当这个 urb 完成时被调用的完成处理函数;context 是完成处理函数的“上下文”;interval 是这个urb 应当被调度的间隔。
上述函数参数中的pipe 使用usb_sndintpipe()或usb_rcvintpipe()创建。
对于批量urb,使用usb_fill_bulk_urb()函数来初始化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);
除了没有对应于调度间隔的interval 参数以外,该函数的参数和usb_fill_int_urb()函数的参数含义相同。
上述函数参数中的pipe 使用usb_sndbulkpipe()或者usb_rcvbulkpipe()函数来创建。
对于控制 urb,使用usb_fill_control_urb()函数来初始化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);
除了增加了新的setup_packet 参数以外,该函数的参数和usb_fill_bulk_urb()函数的参数含义相同。setup_packet 参数指向即将被发送到端点的设置数据包。
上述函数参数中的pipe 使用usb_sndctrlpipe()或usb_rcvictrlpipe()函数来创建。
unsigned int pipe
一个管道号码,该管道记录了目标设备的端点以及管道的类型。每个管道只有一种类型和一个方向,它与他的目标设备的端点相对应,我们可以通过以下几个函数来获得管道号并设置管道类型:
unsigned int usb_sndctrlpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB设备的指定端点设置为一个控制OUT端点。
unsigned int usb_rcvctrlpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB设备的指定端点设置为一个控制IN端点。
unsigned int usb_sndbulkpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB设备的指定端点设置为一个批量OUT端点。 /* 把数据从批量OUT端口发出 */
unsigned int usb_rcvbulkpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB设备的指定端点设置为一个批量IN端点。
unsigned int usb_sndintpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB设备的指定端点设置为一个中断OUT端点。
unsigned int usb_rcvintpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB设备的指定端点设置为一个中断IN端点。
unsigned int usb_sndisocpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB设备的指定端点设置为一个等时OUT端点。
unsigned int usb_rcvisocpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB设备的指定端点设置为一个等时IN端点。
(3)被USB 设备驱动提交给USB 核心。(提交URB)
在完成第(1)、(2)步的创建和初始化urb 后,urb 便可以提交给USB 核心,通过usb_submit_urb()函数来完成,如下所示:
int usb_submit_urb(struct urb *urb, int mem_flags);
urb 参数是指向urb 的指针,mem_flags 参数与传递给kmalloc()函数参数的意义相同,它用于告知USB 核心如何在此时分配内存缓冲区。
在提交urb 到USB 核心后,直到完成函数被调用之前,不要访问urb 中的任何成员。
usb_submit_urb()在原子上下文和进程上下文中都可以被调用,mem_flags 变量需根据调用环
境进行相应的设置,如下所示。
GFP_ATOMIC:在中断处理函数、底半部、tasklet、定时器处理函数以及urb 完成函数中,在调用者持有自旋锁或者读写锁时以及当驱动将current→state 修改为非 TASK_RUNNING 时,应使用此标志。
GFP_NOIO:在存储设备的块I/O 和错误处理路径中,应使用此标志;
GFP_KERNEL:如果没有任何理由使用GFP_ATOMIC 和GFP_NOIO,就使用GFP_KERNEL。
如果usb_submit_urb()调用成功,即urb 的控制权被移交给USB 核心,该函数返回0;否则,
返回错误号。
(4)提交由USB 核心指定的USB 主机控制器驱动。
(5)被USB 主机控制器处理,进行一次到USB 设备的传送。
第(4)~(5)步由USB 核心和主机控制器完成,不受USB 设备驱动的控制。
(6)当urb 完成,USB 主机控制器驱动通知USB 设备驱动。
(处理URB)
在如下3 种情况下,urb 将结束,urb 完成函数将被调用。
1、urb 被成功发送给设备,并且设备返回正确的确认。如果urb→status 为0,意味着对于一个输出urb,数据被成功发送;对于一个输入urb,请求的数据被成功收到。
2、如果发送数据到设备或从设备接收数据时发生了错误,urb→status 将记录错误值。
3、urb 被从USB 核心“去除连接”,这发生在驱动通过usb_unlink_urb()或usb_kill_urb()函数取消urb,或urb 虽已提交,而USB 设备被拔出的情况下。
当urb 生命结束时(处理完成或被解除链接),通过urb 结构体的status 成员可以获知其原因,
如0 表示传输成功,-ENOENT 表示被usb_kill_urb()杀死,-ECONNRESET 表示被usb_unlink_urb()
杀死,-EPROTO 表示传输中发生了bitstuff 错误或者硬件未能及时收到响应数据包,-ENODEV
表示USB 设备已被移除,-EXDEV 表示等时传输仅完成了一部分等。
对以上urb 的处理步骤进行一个总结,图20.5 给出了一个urb 的整个处理流程,虚线框的usb_unlink_urb()和usb_kill_urb()并非一定会发生,它只是在urb 正在被USB 核心和主机控制器处理时,被驱动程序取消的情况下才发生。
(7). urb的取消
如果想取消之前提交的urb,可以用usb_unlink_urb来实现:
int usb_unlink_urb(struct urb *urb);
3.简单的批量与控制URB
用前面的方式提交urb或取消urb时,程序不会阻塞,属于异步方式。除了异步方式外,usb还可用同步方式来提交和取消urb。同样由于isochronous中发送数据包个数不确定性,驱动只实现了control,interrupt和bulk三种方式
的同步方式操作urb接口。
有时USB驱动程序只是从USB设备上接收或向USB设备发送一些简单的数据,这时候,没有必要将urb创建、初始化、提交、完成处理的整个流程走一遍,而可以使用两个更简单的函数,如下所示。
(1)usb_bulk_msg()
usb_bulk_msg()函数创建一个USB批量urb 并将它发送到特定设备,这个函数是同步的,它一直等待urb完成后才返回。usb_bulk_msg()函数的原型为:
int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
void *data, int len, int *actual_length,
int timeout);usb_dev参数为批量消息要发送的USB 设备的指针,pipe为批量消息要发送到的USB设备的端点,data参数为指向要发送或接收的数据缓冲区的指针,len参数为data参数所指向的缓冲区的长度,actual_length用于返回实际发送或接收的字节数,timeout是发送超时,以jiffies为单位,0意味着永远等待。
如果函数调用成功,返回0;否则,返回1个负的错误值。
(2)usb_control_msg()函数
usb_control_msg()函数与usb_bulk_msg()函数类似,不过它提供驱动发送和结束USB控制信息而非批量信息的能力,该函数的原型为:
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);
dev指向控制消息发往的USB设备,pipe是控制消息要发往的USB设备的端点,request是这个控制消息的USB请求值,requesttype是这个控制消息的USB请求类型,value是这个控制消息的USB消息值,index是这个控制消息的USB消息索引值,data指向要发送或接收的数据缓冲区,size是data参数所指向的缓冲区的大小,timeout是发送超时,以jiffies为单位,0意味着永远等待。
参数request、requesttype、value和index与USB规范中定义的USB控制消息直接对应。
如果函数调用成功,该函数返回发送到设备或从设备接收到的字节数;否则,返回一个负的错误值。
对usb_bulk_msg()和usb_control_msg()函数的使用要特别慎重,由于它们是同步的,因此不能在中断上下文和持有自旋锁的情况下使用。而且,该函数也不能被任何其他函数取消,因此,务必要使得驱动程序的disconnect()函数掌握足够的信息,以判断和等待该调用的结束。
(3)usb_interrupt_msg() 函数
int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe,
void *data, int len, int *actual_length, int timeout)
上面三个接口函数都已经将之前提到过的申请urb,填充urb和提交urb过程封装在一起,在使用时只要指定对应该数据,数据长度及超时时间就可以。在使用上面三个接口提交urb时,程序阻塞,直到超时或urb提交成功并通过回调函数返回结果并唤醒等待队列。
在同步方式下对应的urb取消函数接口为:
void usb_kill_urb(struct
urb *urb)
usb_kill_urb提交取消urb申请后,会一直等待urb取消完成才会退出,里面的等待也是通过等待队列实现的。
参考:
https://www.cnblogs.com/chd-zhangbo/p/5261045.html
http://book.51cto.com/art/200803/66930.htm
http://blog.sina.com.cn/s/blog_a336aee70102x5hk.html
posted @
2017-12-26 14:42
隔壁王叔叔a
阅读(6714)
评论(0)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面返回顶部
公告
Copyright © 2024 隔壁王叔叔a
Powered by .NET 8.0 on Kubernetes
URB(USB request block)_urb结构体-CSDN博客
>URB(USB request block)_urb结构体-CSDN博客
URB(USB request block)
最新推荐文章于 2024-01-05 17:53:03 发布
dyq1991
最新推荐文章于 2024-01-05 17:53:03 发布
阅读量4.3k
收藏
7
点赞数
1
分类专栏:
USB request block
文章标签:
urb
USB request block
专栏收录该内容
1 篇文章
0 订阅
订阅专栏
http://www.cnblogs.com/chd-zhangbo/p/5261045.html
1.urb 结构体 USB 请求块(USB request block,urb)是USB 设备驱动中用来描述与USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff 结构体。
struct
urb {
/* 私有的:只能由USB 核心和主机控制器访问的字段 */
struct
kref kref;
/*urb 引用计数 */
void
*hcpriv;
/* 主机控制器私有数据 */
atomic_t use_count;
/* 并发传输计数 */
u8 reject;
/* 传输将失败*/
int
unlink;
/* unlink 错误码 */
/* 公共的: 可以被驱动使用的字段 */
struct
list_head urb_list;
/* 链表头*/
struct
usb_anchor *anchor;
struct
usb_device *dev;
/* 关联的USB 设备 */
struct
usb_host_endpoint *ep;
unsigned
int
pipe;
/* 管道信息 */
int
status;
/* URB 的当前状态 */
unsigned
int
transfer_flags;
/* URB_SHORT_NOT_OK | ...*/
void
*transfer_buffer;
/* 发送数据到设备或从设备接收数据的缓冲区 */
dma_addr_t transfer_dma;
/*用来以DMA 方式向设备传输数据的缓冲区 */
int
transfer_buffer_length;
/*transfer_buffer 或transfer_dma 指向缓冲区的大小 */
int
actual_length;
/* URB 结束后,发送或接收数据的实际长度 */
unsigned
char
*setup_packet;
/* 指向控制URB 的设置数据包的指针*/
dma_addr_t setup_dma;
/*控制URB 的设置数据包的DMA 缓冲区*/
int
start_frame;
/*等时传输中用于设置或返回初始帧*/
int
number_of_packets;
/*等时传输中等时缓冲区数量 */
int
interval;
/* URB 被轮询到的时间间隔(对中断和等时urb 有效) */
int
error_count;
/* 等时传输错误数量 */
void
*context;
/* completion 函数上下文 */
usb_complete_t complete;
/* 当URB 被完全传输或发生错误时,被调用 */
/*单个URB 一次可定义多个等时传输时,描述各个等时传输 */
struct
usb_iso_packet_descriptor iso_frame_desc[0];
};
2.urb 处理流程 USB 设备中的每个端点都处理一个urb 队列,在队列被清空之前,一个urb 的典型生命周期 如下。 (1)被一个USB 设备驱动创建。 创建urb 结构体的函数为: struct urb *usb_alloc_urb(int iso_packets, int mem_flags); iso_packets 是这个urb 应当包含的等时数据包的数目,若为0 表示不创建等时数据包。 mem_flags 参数是分配内存的标志,和kmalloc()函数的分配标志参数含义相同。如果分配成功,该函数返回一个urb 结构体指针,否则返回0。 urb 结构体在驱动中不能静态创建,因为这可能破坏USB 核心给urb 使用的引用计数方法。
usb_alloc_urb()的“反函数”为: void usb_free_urb(struct urb *urb); 该函数用于释放由usb_alloc_urb()分配的urb 结构体。
(2)初始化,被安排给一个特定USB 设备的特定端点。 对于中断urb,使用usb_fill_int_urb()函数来初始化urb,如下所示: 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 的指针;dev 指向这个urb 要被发送到的USB 设备;pipe 是这个urb 要被发送到的USB 设备的特定端点;transfer_buffer 是指向发送数据或接收数据的缓冲区的指针,和urb 一样,它也不能是静态缓冲区,必须使用kmalloc()来分配;buffer_length 是transfer_buffer 指针所指向缓冲区的大小;complete 指针指向当这个 urb 完成时被调用的完成处理函数;context 是完成处理函数的“上下文”;interval 是这个urb 应当被调度的间隔。 上述函数参数中的pipe 使用usb_sndintpipe()或usb_rcvintpipe()创建。 对于批量urb,使用usb_fill_bulk_urb()函数来初始化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); 除了没有对应于调度间隔的interval 参数以外,该函数的参数和usb_fill_int_urb()函数的参数含义相同。 上述函数参数中的pipe 使用usb_sndbulkpipe()或者usb_rcvbulkpipe()函数来创建。
对于控制 urb,使用usb_fill_control_urb()函数来初始化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); 除了增加了新的setup_packet 参数以外,该函数的参数和usb_fill_bulk_urb()函数的参数含义相同。setup_packet 参数指向即将被发送到端点的设置数据包。 上述函数参数中的pipe 使用usb_sndctrlpipe()或usb_rcvictrlpipe()函数来创建。
(3)被USB 设备驱动提交给USB 核心。 在完成第(1)、(2)步的创建和初始化urb 后,urb 便可以提交给USB 核心,通过usb_submit_urb()函数来完成,如下所示: int usb_submit_urb(struct urb *urb, int mem_flags); urb 参数是指向urb 的指针,mem_flags 参数与传递给kmalloc()函数参数的意义相同,它用于告知USB 核心如何在此时分配内存缓冲区。 在提交urb 到USB 核心后,直到完成函数被调用之前,不要访问urb 中的任何成员。
usb_submit_urb()在原子上下文和进程上下文中都可以被调用,mem_flags 变量需根据调用环 境进行相应的设置,如下所示。 GFP_ATOMIC:在中断处理函数、底半部、tasklet、定时器处理函数以及urb 完成函数中,在调用者持有自旋锁或者读写锁时以及当驱动将current→state 修改为非 TASK_RUNNING 时,应使用此标志。 GFP_NOIO:在存储设备的块I/O 和错误处理路径中,应使用此标志; GFP_KERNEL:如果没有任何理由使用GFP_ATOMIC 和GFP_NOIO,就使用GFP_KERNEL。
如果usb_submit_urb()调用成功,即urb 的控制权被移交给USB 核心,该函数返回0;否则, 返回错误号。 (4)提交由USB 核心指定的USB 主机控制器驱动。 (5)被USB 主机控制器处理,进行一次到USB 设备的传送。 第(4)~(5)步由USB 核心和主机控制器完成,不受USB 设备驱动的控制。 (6)当urb 完成,USB 主机控制器驱动通知USB 设备驱动。
在如下3 种情况下,urb 将结束,urb 完成函数将被调用。 1、urb 被成功发送给设备,并且设备返回正确的确认。如果urb→status 为0,意味着对于一个输出urb,数据被成功发送;对于一个输入urb,请求的数据被成功收到。 2、如果发送数据到设备或从设备接收数据时发生了错误,urb→status 将记录错误值。 3、urb 被从USB 核心“去除连接”,这发生在驱动通过usb_unlink_urb()或usb_kill_urb()函数取消urb,或urb 虽已提交,而USB 设备被拔出的情况下。 当urb 生命结束时(处理完成或被解除链接),通过urb 结构体的status 成员可以获知其原因, 如0 表示传输成功,-ENOENT 表示被usb_kill_urb()杀死,-ECONNRESET 表示被usb_unlink_urb() 杀死,-EPROTO 表示传输中发生了bitstuff 错误或者硬件未能及时收到响应数据包,-ENODEV 表示USB 设备已被移除,-EXDEV 表示等时传输仅完成了一部分等。
对以上urb 的处理步骤进行一个总结,图20.5 给出了一个urb 的整个处理流程,虚线框的usb_unlink_urb()和usb_kill_urb()并非一定会发生,它只是在urb 正在被USB 核心和主机控制器处理时,被驱动程序取消的情况下才发生。
优惠劵
dyq1991
关注
关注
1
点赞
踩
7
收藏
觉得还不错?
一键收藏
知道了
0
评论
URB(USB request block)
http://www.cnblogs.com/chd-zhangbo/p/5261045.html1.urb 结构体USB 请求块(USB request block,urb)是USB 设备驱动中用来描述与USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff 结构体。struct urb {/* 私有的:只能由USB 核心和主机控制器访
复制链接
扫一扫
专栏目录
usb驱动详细介绍
02-21
usb驱动详细介绍
Linux System Error & Urb Error Status
07-14
URB STATUS VALUE
0 这个 urb 传送是成功的.
-ENOENT 这个 urb 被对 usb_kill_urb 的调用停止.
-ECONNRESET urb 被对 usb_unlink_urb 的调用去链, 并且
transfer_flags 变量被设置为 URB_ASYNC_UNLINK.
-EINPROGRESS 这个 urb 仍然在被 USB 主机控制器处理中. 如果你的驱动
曾见到这个值, 它是一个你的驱动中的 bug.
-EPROTO 这个 urb 发生下面一个错误: 一个 bitstuff 错误在传送中
发生.硬件没有及时收到响应帧.
......
参与评论
您还未登录,请先
登录
后发表或查看评论
linux usb 驱动之创urb的创建和销毁
一叶知秋的博客
01-05
884
linux usb 驱动之创urb的创建和销毁
STM32/GD32的USB HostU盘读取例程
07-22
USB作为主机读写U盘例程,集合Fatfs文件系统,适用于STM32F407以及GD32F407,稍加改动可适用于其他单片机。另外还有Keil5版本,请自行编译。
linux的usb驱动中urb的理解
abkzcyb5892的博客
10-07
873
linux 内核中的 USB 代码和所有的 USB 设备通讯使用称为 urb 的东西( USB requestblock). 这个请求块用 struct urb 结构描述并且可在 include/linux/usb.h 中找到.
一个urb 用来发送或接受数据到或者从一个特定 USB 设备上的特定的 USB 端点, 以一种异步的方式.一个 USB 设备驱动可能...
USB鼠标驱动
qq_41483419的博客
02-07
288
USB鼠标驱动
嵌入式Linux开发-USB驱动
chuadeichuadei
04-20
582
0.前言
1.概述
通用串行总线(USB)是主机和外围设备之间的一种连接。
从拓扑上来看,是一颗由几个点对点的连接构建而成的树。这些连接是连接设备和集线器(hub)的四线电缆(底线、电源线和两根信号线)。USB主控制器(host controller)负责询问每一个USB设备是否有数据需要发送。
Linux内核支持两种主要类型的USB驱动程序:宿主(host)系统上的驱动程序和设备(device)...
33.驱动--usb
LingLinTianShang的博客
01-20
1109
驱动--usb
USB驱动程序设计(4)—Linux USB驱动程序设计
小虾米编程
08-21
480
1.USB驱动模型
USB设备包括配置(configuration)、接口(interface)和端点(endpoint),一个USB设备驱动程序对应一个USB接口,而非整个USB设备。比如说一个MP4的播放设备,他可以播放视频、也可以播放声音,这2个功能称为一个接口,而每一个驱动只能驱动一个接口,所以如果需要同时播放视频和音频则需要2个驱动程序。
在Linux内核中,使用struct...
USB URB的status及其代表的意义
基建工时福贵
04-28
2692
USB URB的status及其代表的意义
平时在处理客户问题时,经常需要分析出现问题时抓取的usbmon log,这个log中有一个字段非常重要:URB Status word,这个字段就是struct urb结构体中的status成员变量。
通过这个status的值,可以分析出模块端和HOST端usb的一些状态,有利于定位到问题点。
Linux内核中对该成员变量的注释如下:
表明该...
linux 内核 中断,Linux 内核 中断 urb
weixin_30741527的博客
04-30
113
函数 usb_fill_int_urb 是一个帮忙函数, 来正确初始化一个 urb 来发送给 USB 设备的 一个中断端点:voidusb_fill_int_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,void *transfer_buffer,int buffer_length,usb_complete_t com...
usb_urb分析
12-17
usb_urb分析:抓包工具抓到的数据包的详细解析。
Linux系统下USB摄像头驱动开发
12-10
摘要:介绍了在Iinux系统下开发符合Video for Linux标准的USB摄像头驱动的方法,并对该标准提出“不间断采集”的改进思路,配合双URB、双帧缓冲等方法,提高采集速度。 关键词:Linux设备驱动 USB摄像头 Video for ...
urb数据结构
MyArrow的专栏
11-29
7095
一、 transfer_flags
/*
* urb->transfer_flags:
*
* Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb().
*/
#define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */
#defin
USB设备驱动(一):简单分析USB设备驱动框架
Linux
07-05
1052
在生活、工作中经常会接触到USB设备,如鼠标、键盘、摄像头、可移动硬盘、扫码枪等。这些设备通过USB接口连接到电脑上后,电脑会立刻提示“检测到新硬件...”、安装驱动等。这里需要强调下USB设备使用的是USB总线,window或Linux内核中都会自带usb总线驱动,所以接上USB设备后,主机能够立刻检测到,提醒需要安装设备驱动是指安装USB设备驱动。
USB设备驱动使用USB总线,所以很多操作由USB总线驱动帮我们完成了,我们只需要的按照总线、设备、驱动框架来实现USB设备的驱动既可。USB设备数据的读
USB请求块(URB)——框架及机制
噌胥苑——行思驿站
05-15
2400
USB请求块(URB)——框架及机制
《Linux设备驱动开发详解》本书全面而详细地讲解了Linux设备驱动开发中涉及的理论以及多种设备驱动的框架。第20章主要讲解从主机侧角度看到的USB主机控制器驱动和设备驱动。本文写的是USB请求块(urb)。
1.urb结构体
USB请求块(USB request block,urb)是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据
Linux usb子系统(一) _写一个usb鼠标驱动
weixin_34408717的博客
03-10
173
USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配。
USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动,通常,对于USB这种标准化的设备,内核已经将主机控制器的驱动编写好了,设备上的Gadget驱动通常只运行固件程序而不是基于Linux, 所以驱动工程师的主要工作就是编写主机端的USB设备驱动。
US...
usb urb请求超时
最新发布
01-13
根据提供的引用内容,我可以为您介绍USB URB请求超时的情况。
在USB通信中,URB(USB Request Block)是用于描述和管理USB传输的数据结构。URB包含了传输的相关信息,例如传输类型、数据缓冲区、传输方向等。当主机与USB设备进行通信时,会使用URB来发送和接收数据。
当一个URB请求被提交给USB驱动程序后,驱动程序会将该请求发送给USB控制器进行处理。在正常情况下,USB控制器会及时地完成请求并返回结果。然而,有时候由于各种原因,URB请求可能会超时。
URB请求超时可能是由以下原因引起的:
1. USB设备未正确响应:USB设备可能出现故障或异常,导致无法及时响应URB请求。
2. USB总线负载过重:当USB总线上的设备数量过多或数据传输量过大时,可能会导致URB请求超时。
3. USB驱动程序错误:USB驱动程序可能存在bug或错误,导致URB请求无法正常完成。
当URB请求超时时,可以采取以下措施:
1. 重新提交URB请求:可以尝试重新提交URB请求,以便再次发送请求并等待响应。
2. 检查USB设备状态:检查USB设备是否正常工作,是否存在故障或异常情况。
3. 检查USB总线负载:检查USB总线上的设备数量和数据传输量,确保不超过总线的承载能力。
4. 更新USB驱动程序:如果存在USB驱动程序的bug或错误,可以尝试更新驱动程序版本或使用其他可靠的驱动程序。
请注意,具体的处理方法可能因系统和设备的不同而有所差异。建议在遇到URB请求超时问题时,参考相关文档或咨询厂商或开发者以获取更准确的解决方案。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
dyq1991
CSDN认证博客专家
CSDN认证企业博客
码龄13年
暂无认证
6
原创
18万+
周排名
99万+
总排名
15万+
访问
等级
1632
积分
38
粉丝
39
获赞
7
评论
232
收藏
私信
关注
热门文章
解析dump的几种方式
15668
unable to connect to 172.20.10.10:5555 解决办法
14675
make编译命令
9403
USB中CDC-ECM的了解和配置
7700
time+dd测试硬盘读写速度
7620
分类专栏
charger
1篇
处理器
1篇
android fingerprint
1篇
Android VTS
1篇
adb命令
1篇
usb主机控制器ECHI
1篇
usb
12篇
USB request block
1篇
adb
5篇
Android编译
2篇
Linux power supply
1篇
dump解析
1篇
type-c
2篇
linux
5篇
Andorid Display
2篇
最新评论
Android编译源码时werror报错设置
双鱼千殇:
请问楼主 .mk 文件具体是在哪个路径下呢?因为有很多个 刚开始接触这种 无处下手
Android编译源码时werror报错设置
linuxdog2:
-Wno-error ###这一个就够!了
MMU初探
Windalove:
以参考原图,侵权删除
Android Vendor Test Suite (VTS) 的概念、作用及测试方法
timyhao:
编译出的二进制文件必须放到手机这个目录执行吗? /data/nativetest
USB中CDC-ECM的了解和配置
国产小芯片:
USB CDC Ethernet Support Lan card like SR9900 RTL8152b
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Android charger笔记
MMU初探
中断中为何不能使用信号量,中断上下文为何不能睡眠
2020年2篇
2019年5篇
2018年16篇
2017年18篇
目录
目录
分类专栏
charger
1篇
处理器
1篇
android fingerprint
1篇
Android VTS
1篇
adb命令
1篇
usb主机控制器ECHI
1篇
usb
12篇
USB request block
1篇
adb
5篇
Android编译
2篇
Linux power supply
1篇
dump解析
1篇
type-c
2篇
linux
5篇
Andorid Display
2篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
e sorry but yanshee learn doesn't work properly without JavaScript enabled. Please enable it to continUSB请求块_百度百科
求块_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心收藏查看我的收藏0有用+10USB请求块播报讨论上传视频计算机术语本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。USB请求块(USB request block,URB)是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构,与网络设备驱动中的sk_buff结构体类似,是USB主机与设备之间传输数据的封装。 [1]中文名USB请求块外文名USB request block简 称URB定 义USB主机与设备传输数据的封装系 统计算机应用学科计算机原理目录1传输过程2填充传输过程播报编辑一个urb包含了执行usb传输所需要的所有信息。当要进行数据传输时,需要分配一个urb结构体,对其进行初始化,然后将其提交给usb核心。USB核心对urb进行解析,将控制信息提交给主机控制器,由主机控制器负责数据到设备的传输。这时,驱动程序只需等待,当数据回传到主机控制器后,会转发给USB核心,唤醒等待的驱动程序,由驱动程序完成剩下的工作。更为具体地说,Linux中的设备驱动程序只要为每一次请求准备一个urb结构体,然后把它填充好,就可以调用函数usb_submit_urb()提交给USB核心。然后USB核心将urb传递给USB主机控制器,最终传递给USB设备。USB设备获得urb结构体后,会解析这个结构体,并以相反的路线将数据返回给Linux内核。填充播报编辑USB支持4种基本的数据传输模式:控制传输、同步传输、中断传输、批量传输。控制传输方式支持双向传输,用来处理主端口到USB从端口的数据传输,包括设备控制指令、设备状态查询及确认命令。对于高速设备,允许数据包最大容量为8,16,32或64字节,对于低速设备只有8字节一种选择。同步传输是一种周期的、连续的单向传输方式,通常用于与时间有密切关系的信息的传输。同步传输每次传输的最大有效负荷为1024字节。中断传输用于非周期的、自然发生的、数据量很小的信息的传输,主要用在键盘、鼠标及操纵杆等设备上。批量传输方式也是一种单向传输,用于大量的、对时间没有要求的数据传输。 [3]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000为什么在城市建设统计年鉴里面有的城市的城区面积(Urban Area)会在某一年出现大幅的下降? - 知乎
为什么在城市建设统计年鉴里面有的城市的城区面积(Urban Area)会在某一年出现大幅的下降? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册城市规划城市建设规划为什么在城市建设统计年鉴里面有的城市的城区面积(Urban Area)会在某一年出现大幅的下降?在住建部公布的《全国城市建设统计年鉴》中,所谓城区面积(Urban Area)是这样定义的: [图片] 那么问题就来了,正常理解下,在中国城市化不断深…显示全部 关注者67被浏览12,342关注问题写回答邀请回答好问题 74 条评论分享2 个回答默认排序Yawning Song泰和泰(重庆)律师事务所 执业律师 关注因为在此之前很多城市统计城区面积的时候有把“市辖区面积总和”等同于“市区面积”的习惯。比如广州市,从化和增城是2014年撤市设区的,我们把这两个区拿出来,剩下在2010年时的9个区辖区面积总和为3843.43平方公里(引自百度百科词条“广州市”),而2012年时市区面积变为1387平方公里。从2012年的凤凰新闻网上找到了广州常住人口十年增275万的新闻,当时广州市区常住人口是1270万。按照我国城区面积1平方公里约1万人的比例,广州市2012年的这个市区面积是比较可信的。至于为何2012年时大家突然一下子幡然醒悟,不再拿辖区面积当市区面积,有空查查资料,或者哪位大神来补充~___________2016.8.11补充_______________ 根据住建部《城市(县城)和村镇建设统计报表制度》(2015),“设市城市城区包括:市本级(1)街道办事处所辖地域;(2)城市公共设施、居住设施和市政公用设施等连接到的其他镇(乡)地域;(3)常住人口在3000人以上独立的工矿区、开发区、科研单位、大专院校等特殊区域。”,再看了2011年版的上报规定,也是同样的以乡镇为基础单位,而不是市辖区。更早的报表制度有一个2006版,住建部网站上就没有下载链接了。至少,在2011年的统计报表制度里,市区面积统计就已经不是以市辖区面积总和来确定了。而在网上看到一篇2010年的帖子看看城市城区面积和建成区面积是怎么统计的,这篇文章说得很明确 里贴了2007年湖南省统计局的一篇文章《长沙城区发展与统计的思考》里提到,“ 2006年长沙包括县城的城区面积为709.33平方公里,不包括县城的城区面积为591.33平方公里,内五区范围的城区面积为556.33平方公里。通常情况下,省统计局对长沙城市区域面积的认定是内五区范围的面积556.33平方公里。(见表)”、“近五年以来,长沙城市的城区面积没有变化,内五区面积之和为556.33平方公里;”,可以看出那个时候的“城区面积”就被认为是“市辖区面积总和”。不过,我在湖南省统计局网站上没有找到这篇文章,没法验证它的真实性。编辑于 2016-08-11 20:18赞同 6添加评论分享收藏喜欢收起DataFun 关注市场经济是惟一自然、合理和能够带来繁荣的经济,因为它是惟一能反映生活本质的经济。生活的精髓就在于它无穷无尽和神秘多样,因而,就生活的完美性和变幻性而言,任何中心人物的智慧都无法加以涵盖和设计。——维克拉夫·哈韦尔《中国城市建设统计年鉴》共分14个部分,包括城市市政公用设施水平、城市人口和建设用地、城市维护建设财政性资金收支、城市市政公用设施固定资产投资、城市供水、城市节约用水、城市燃气、城市集中供热、城市轨道交通、城市道路和桥梁、城市排水和污水处理、城市园林绿化、国家级风景名胜区、城市市容环境卫生。每部分均包含分年度、分地区、分城市数据。小虾给大家收集了最新的2000-2020年《中国城市统计年鉴》,数据以EXCEL为主,搜索查询方便。同时,小虾还给大家整理出了各部分的条目,方便大家查查阅按城市分类:按城市分列的城市道路和桥梁按城市分列的城市供水按城市分列的城市供水(公共供水)按城市分列的城市供水(自建设施供水)按城市分列的城市轨道交通(建成)按城市分列的城市轨道交通(在建)按城市分列的城市集中供热按城市分列的城市排水和污水处理按城市分列的城市人工煤气按城市分列的城市市容环境卫生按城市分列的城市天然气按城市分列的城市液化石油气按城市分列的城市园林绿化按城市分列的全国城市节约用水按省分类:按省分列的城市道路和桥梁按省分列的城市供水按省分列的城市供水(公共供水)按省分列的城市供水(自建设施供水)按省分列的城市轨道交通(建成)按省分列的城市轨道交通(在建)按省分列的城市集中供热按省分列的城市排水和污水处理按省分列的城市人工煤气按省分列的城市市容环境卫生按省分列的城市天然气按省分列的城市液化石油气按省分列的城市园林绿化按省分列的全国城市节约用水按行业、资金来源分类:按行业分全国城市市政公用设施建设固定资产投资(按城市分列)按行业分全国城市市政公用设施建设固定资产投资(按省分列)按资金来源分全国城市市政公用设施建设固定资产投资(按城市分列)按资金来源分全国城市市政公用设施建设固定资产投资(按省分列)全国状况及历年水平全国城市人口和建设用地(按城市分列)全国城市人口和建设用地(按省分列)全国城市市政公用设施水平(按城市分列)全国城市市政公用设施水平(按省分列)按行业分全国历年城市市政公用设施建设固定资产投资(1978-2019)按资金来源分全国历年城市市政公用设施建设固定资产投资(1978-2019)城市分类污水排放系数全国历年城市道路和桥梁情况(1978-2019)全国历年城市供水情况(1978-2019)全国历年城市轨道交通情况(1978-2019)全国历年城市集中供热情况(1981-2019)全国历年城市节约用水情况(1991-2019)全国历年城市排水和污水处理情况(1978-2019)全国历年城市燃气情况(1978-2019)全国历年城市市容环境卫生情况(1979-2019)全国历年城市市政公用设施建设固定资产投资(1978-2019)全国历年城市市政公用设施水平(1981-2019)全国历年城市数量及人口、面积情况(1978-2019)全国历年城市维护建设资金收支(1978-2016)全国历年城市园林绿化情况(1981-2019)资源获取方式:链接:https://pan.baidu.com/s/1rX2X3ELN90y55Tiqcba3nw提取码:见个人简介版权及转载说明:见专栏文章“版权声明”编辑于 2023-04-20 18:47赞同添加评论分享收藏喜欢收起写回答1 个回答被折叠(为什