读Linux那些事儿之我是USB CORE笔记(一)

简介:

1、  Usb总线:

USB总线是一种轮询方式的总线。 协议规定所有的数据传输都必须由主机发起 host controller初始化所有的数据传输,各种设备紧紧围绕在主机周围。

2DMA 映射:

一般来说,都是驱动里提供了 kmalloc 等分配的缓冲区,HCD 做一定的 DMA 映射处理,从而外设和内存之间进行数据交换的目的;外设是通过各种总线连到主机里边儿的,使用的是总线地址,而内存使用的是虚拟地址,它们之间本来就是两条互不相交的平行线,要让它们中间产生连接点,必须得将一个地址转化为另一个地址,这样才能找得到对方,才能互通有无,而 DMA 映射就是干这个的。URB_NO_TRANSFER_DMA_MAP,还有 URB_NO_SETUP_DMA_MAP这里的两个标志,告诉 HCD 不要再自己做 DMA 映射了,驱动提供的 urb 里已经提供有 DMA 缓冲区地址;(transfer_buffertransfer_dmasetup_packetsetup_dma

2、  transfer_buffertransfer_dmatransfer_buffer_length

前面说过管道的一端是主机上的缓冲区,一端是设备上的端点,这三个家伙就是描述主机上的那个缓冲区的。transfer_buffer 是使用 kmalloc 分配的缓冲区,transfer_dma 是使用

usb_buffer_alloc分配的 dma 缓冲区,HCD 不会同时使用它们两个,如果你的 urb自带了 transfer_dma,就要同时设置URB_NO_TRANSFER_DMA_MAP 来告诉 HCD 一声,不用它再费心做 DMA 映射了。transfer_buffer 是必须要设置的,因为不是所有的主机控制器都能够使用 DMA 的,万一遇到这样的情况,也好有个备用。transfer_buffer_length指的就是 transfer_buffer transfer_dma的长度。

   setup_packetsetup_dma,同样是两个缓冲区,一个是kmalloc

配的,一个是用usb_buffer_alloc分配的,不过,这两个缓冲区是控制传输专用的,记得struct usb_ctrlrequest不?它们保存的就是一个struct usb_ctrlrequest结构体,如果你的urb设置了setup_dma 同样要设置URB_NO_SETUP_DMA_MAP标志来告诉HCD。如果进行的是控制传输,setup_packet是必须要设置的,也是为了防止出现主机控制器不能使用DMA的情况。

3、  interval,等时和中断传输专用,端点希望主机轮询自己的时间间隔;

    对于中断传输,全速时,这个范围为1~255ms,低速是为 10~255ms,高速时为 1~16,这个 1~16 只是 bInterval可以取的值,实际的间隔时间需要计算一下,为 2 的(bInterval-1)次方乘以 125 微妙,也就是 2 的(bInterval-1)次方个微帧。对于等时传输,没有低速了

 



本文转自 曾永刚 51CTO博客,原文链接:http://blog.51cto.com/zyg0227/560129


相关文章
|
29天前
|
NoSQL 安全 Linux
Linux 中 core dump 文件的作用和使用方法
Linux 中 core dump 文件的作用和使用方法
59 1
|
5月前
|
运维 网络协议 Linux
腾讯T6-9首发“Linux内核源码底层原理开发进阶笔记”,差距不止一点点哦
腾讯T6-9首发“Linux内核源码底层原理开发进阶笔记”,差距不止一点点哦
|
1月前
|
算法 Linux
【Linux笔记】压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法
【Linux笔记】压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法
|
3月前
|
NoSQL Linux
Linux系统调试中出现核心转储(core dump)的问题
Linux系统调试中出现核心转储(core dump)的问题
81 0
|
13天前
|
Linux API C语言
FFmpeg开发笔记(一)搭建Linux系统的开发环境
本文指导初学者如何在Linux上搭建FFmpeg开发环境。首先,由于FFmpeg依赖第三方库,可以免去编译源码的复杂过程,直接安装预编译的FFmpeg动态库。推荐网站<https://github.com/BtbN/FFmpeg-Builds/releases>提供适用于不同系统的FFmpeg包。但在安装前,需确保系统有不低于2.22版本的glibc库。详细步骤包括下载glibc-2.23源码,配置、编译和安装。接着,下载Linux版FFmpeg安装包,解压至/usr/local/ffmpeg,并设置环境变量。最后编写和编译简单的C或C++测试程序验证FFmpeg环境是否正确配置。
34 8
FFmpeg开发笔记(一)搭建Linux系统的开发环境
|
5月前
|
缓存 网络协议 Linux
牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万(下)
牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万
|
1月前
|
Linux
Linux内核中USB设备驱动实现
Linux内核中USB设备驱动实现
24 0
|
1月前
|
Linux 网络安全 开发工具
【Linux笔记】常用的Linux的指令
【Linux笔记】常用的Linux的指令
|
2月前
|
Linux 数据安全/隐私保护 Android开发
10 个最佳 Linux 开源笔记软件
10 个最佳 Linux 开源笔记软件
109 1
|
2月前
|
缓存 Shell Linux
《linux鸟哥的私房菜》笔记(下)
《linux鸟哥的私房菜》笔记(下)
24 0