Linux usb主机控制器HC阅读

intel的UHCI
一种usb主机控制器的接口规范,遵守它的硬件称为UHCI主机控制器,Linux中,把这种硬件叫做HC,host controller,与之对应的软件,叫做HCD,hc driver,
depends on usb & pci:
它的内核软件模块代码是uhci-hcd.c
uhci_hcd_init初始化开始:
usb_disable函数:在启动参数cmdline,加入nousb参数可以禁止usb模块
kmalloc和kmem_cache_creat:slab分配器的接口函数,用于创建一个cache,之后可以使用kmem_cache_zalloc申请内存了
debugfs_creat_dir:虚拟的一个文件系统,挂载在/sys/kernel/debug下面
pci_register_driver:注册一个pci驱动
usb_hcd_pci_probe:pci驱动的开始
hcd的代码,一部分在core下,hcd-pci.c、hcd.c,公共的代码,,另一部分在host下面,具体的控制器代码,如uhci,xhci等
PCI寄存器图
pci_enable_device:pci设备使用之前必须调用的,激活pci设备上的IO资源和内存资源
图中寄存器有必须也有非必须的,class就是必选的,usb的class code就是0x0C03
usb_creat_hcd:正式进入hcd,主要就是为了给struct usb_hcd申请内存空间并且初始化
struct hc_driver结构体描述一个主机控制器设备
struct usb_hcd结构体描述一个主机控制器驱动
一个主机控制器意味着一条总线,所以还有一个结构体:struct usb_bus
IO内存和IO端口
有处理器,内存和IO是独立编址独立寻址的,所以有了内存空间和IO空间,访问内存和IO空间要使用不同的指令,IO端口的物理地址被映射到IO地址空间,IO映射
嵌入式处理器中,只有一个地址空间,内存空间,那IO端口的物理地址就要被映射到内存地址空间中,内存映射
Linux中,IO Memory和IO ports都被视作一种资源,分别被记录在/proc/iomem和/proc/ioports中
要使用IO内存首先要申请(request_mem_region),然后再映射(ioremap或者ioremap_nocache)
usb_add_hcd:
1、hcd_buffer_creat:初始化一个buffer池,
DMA:直接内存访问,cpu直接和设备数据传输
usb主机控制器控制着一条usb总线,总线一项工作就是在内存和usb总线之间传输数据,这个过程不适用DMA就是PIO方式,使用DMA就似乎HCD这边先创建一个内存池,然后设备驱动可以直接使用
在hcd_buffer_creat中调用dma_pool_creat函数,去创建DMA池,结构体是struct dma_pool
2、使用dma_pool_alloc和dma_pool_free去从dma池中使用和释放,usb中对应usb_buffer_alloc和usb_buffer_free
控制器是否支持DMA操作,看dma_mask的值不为NULL
3、usb_register_bus: bus_map,一共有64位,可以有64条usb总线
class_device_create,/sys/class下创建了usb_host类
usb_notify_add_bus:牵涉内核的notify机制,常用的一种事件回调处理机制

主机控制器初始化

usb_alloc_dev:为root_hub申请一个struct usb_device结构体并初始化,root_hub的parent指针指向了controller本身
device_init_wakeup:第二个参数是1意味着把root_hub的wakeup能力打开,0可以关闭
uhci_init:struct uhci_hcd
hcd_to_uhci:uhci_hcd和usb_hcd之间的转换,
然后决定root_hub有几个端口了,端口号从0开始,UHCI的root_hub最多不能超过8个端口,最少有2个端口
继续回到usb_add_hcd中:
hcd->irq记录中断号,使用request_irq请求中断,中断句柄࿱

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150244.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【openwrt】 libubox组件——ustream

文章目录 ustream 核心数据结构struct ustreamstruct ustream_buf_liststruct ustream_bufstruct ustream_fd ustream 核心APIustream_fd_initustream_uloop_cbustream_fd_read_pendingustream_fill_read ustream_write_pendingustream_writeustream_fd_write ustream 应用示例…

前端开发必须了解的css知识

文本过长省略显示 单行 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }多行 方法一: .ellipsis {overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp: 3;word-break: break-all; }方法二: .ellipsis {ove…

文献笔记 - Neural Lander: Stable Drone Landing ControlUsing Learned Dynamics

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者,文献的引用格式如下,原文更有价值 [1]Guanya Shi∗,Xichen Shi∗,Michael OConnell∗,et al.Neural La…

LOGO设计新革命:5款AI工具让你秒变设计大师(必藏)

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 你是否曾因设计一个既独特又专业的LOGO而感…

Tableau|二 如何利用功能区创建视图

一 认识 Tableau 数据 1.数据角色 维度和度量是Tableau的一种数据角色划分,离散和连续是另一种划分方式。 1.维度和度量 维度往往是一些分类、时间方面的定性字段,将其拖放到功能区时,Tableau不会对其进行计算,而是对视图区进行分…

Swin Transformer(ICCV 2021 best paper):基于卷积层级式架构的移动窗口视觉Transformer!

有关ViT的学习笔记详见:学习笔记——ViT(Vision Transformer)-CSDN博客 ViT在图像分类方面的结果令人鼓舞,但由于其低分辨率的特征映射和复杂度随图像大小的二次方增长,其架构不适合作为密集视觉任务或高分辨率输入图像的backbone。根据经验&…

JetBrains系列产品无限重置免费试用方法

JetBrains系列产品无限重置免费试用方法 写在前面安装插件市场安装插件 写在前面 支持的产品: IntelliJ IDEA AppCode CLion DataGrip GoLand PhpStorm PyCharm Rider RubyMine WebStorm为了保证无限重置免费试用方法的稳定性,推荐下载安装2021.2.2及其…

OpenAI GPT-3 API error: “This model‘s maximum context length is 2049 tokens“

题意:OpenAI GPT-3 API 错误:“此模型的最大上下文长度是 2049 个token” 问题背景: I have two issues relating to the response result from OpenAI completion. 我遇到了两个与OpenAI完成响应结果相关的问题 The following result does…

Sam Altman的博客:The Intelligence Age

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

《深入解析:水果销售数据库操作与查询技巧》

文章目录 一、数据库结构与数据源插入1.1 创建数据库与表1.2 插入数据 二、基础数据查询2.1 查询客户信息2.2 查询供应商信息 三、查询优化与技巧3.1 使用LIMIT子句 四、高级查询技巧4.1 使用聚合函数4.2 连接查询4.3 使用子查询 五、案例分析5.1 客户订单详情查询 一、数据库结…

无法将“allure”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方法-allure的安装配置全过程

新手在使用allure之前,以为只是pip install allure-pytest就可以,no!!! 其实,还需要下载allure,allure的具体步骤如下: 1.下载 allure。 allure的下载地址:Central Re…

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例 一、华为云Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点 二、1Panel介绍2.1 1Panel 简介2.2 1Panel 特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购…

报表做着太费劲?为你介绍四款好用的免费报表工具

1. 山海鲸可视化 介绍: 山海鲸可视化是一款免费的国产可视化报表软件,与许多其他宣传免费的软件不同,山海鲸的报表功能完全免费并且没有任何限制,就连网站管理后台这个功能也是免费的。同时山海鲸可视化还提供了种类丰富的可视化…

「数组」离散化 / Luogu B3694(C++)

目录 概述 思路 算法过程 复杂度 Code 概述 Luogu B3694: 给定一个长度为 n 的数列 aa。定义 rank(i) 表示数列 a 中比 ai 小的不同数字个数再加一。 对 1≤i≤n,现在请你求出所有的 rank(i)。 输出格式 对每组数据,输出一行 n 个整数&a…

BUUCTF [SCTF2019]电单车

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反…

值得入手的宠物空气净化器——希喂、352、IAM三款产品真实测评

在快节奏的现代生活中,养宠成为很多人的精神寄托,回到家中与猫咪玩耍是一天中最放松的时刻。但这美好的生活也存在着一些烦恼——宠物毛发清理与异味。宠物空气净化器作为一种新兴的清理工具,以其高效、全面的特点,受到了越来越多…

PMP--二模--解题--91-100

文章目录 14.敏捷91、 [单选] 在敏捷团队完成三次迭代之后,项目经理确定团队在这三次迭代中的平均速度是30个故事点。还有292个故事点来完成项目的剩余部分。团队需要多少次额外的迭代才能完成项目? 9.资源管理92、 [单选] 项目经理前往另一个国家执行最…

Go基础学习04-变量重声明;类型转换;类型断言;Unicode代码点;类型别名;潜在类型

目录 变量重声明 类型断言 类型转换 类型转换注意事项 Unicode代码点 类型别名、潜在类型 类型别名的意义 变量重声明 编写代码: package mainimport "fmt"var container []string{"Beijing", "Shanghai"}func main() {fmt.Pr…

关于Python升级以后脚本不能运行的问题

近日将Python从3.11升级到了3.12,然后把几个包例如numpy等也通过pip给upgrade了一下,结果原来运行的好好的脚本,都运行不了了,还出现各种报错。怀疑是自己升级了环境导致的,因此通过搜索引擎检索了一下,有这…