xhci 寄存器学习

xhci 寄存器介绍

查看linux 代码:

1733 /* There is one xhci_hcd structure per controller */
1734 struct xhci_hcd {
1735     struct usb_hcd *main_hcd;
1736     struct usb_hcd *shared_hcd;
1737     /* glue to PCI and HCD framework */
1738     struct xhci_cap_regs __iomem *cap_regs;
1739     struct xhci_op_regs __iomem *op_regs;
1740     struct xhci_run_regs __iomem *run_regs;
1741     struct xhci_doorbell_array __iomem *dba;
1742     /* Our HCD's current interrupter register set */
1743     struct  xhci_intr_reg __iomem *ir_set;

主要寄存器是:xhci_cap_regs, xhci_op_regs, xhci_run_regs,xhci_doorbell_array

  50 struct xhci_cap_regs {51     __le32  hc_capbase;52     __le32  hcs_params1;53     __le32  hcs_params2;54     __le32  hcs_params3;55     __le32  hcc_params;56     __le32  db_off;57     __le32  run_regs_off;58     __le32  hcc_params2; /* xhci 1.1 */59     /* Reserved up to (CAPLENGTH - 0x1C) */60 };

对应手册是
在这里插入图片描述

 176 struct xhci_op_regs {177     __le32  command;178     __le32  status;179     __le32  page_size;180     __le32  reserved1;181     __le32  reserved2;182     __le32  dev_notification;183     __le64  cmd_ring;184     /* rsvd: offset 0x20-2F */185     __le32  reserved3[4];186     __le64  dcbaa_ptr;187     __le32  config_reg;188     /* rsvd: offset 0x3C-3FF */189     __le32  reserved4[241];190     /* port 1 registers, which serve as a base address for other ports */191     __le32  port_status_base;192     __le32  port_power_base;193     __le32  port_link_base;194     __le32  reserved5;195     /* registers for ports 2-255 */196     __le32  reserved6[NUM_PORT_REGS*254];197 };

对用手册是:

在这里插入图片描述
在这里插入图片描述
其中端口寄存器:
在这里插入图片描述
在这里插入图片描述

寄存器读写实操

root@raoxu-PC:/sys# lspci | grep -i usb
00:14.0 USB controller: Intel Corporation Comet Lake PCH-V USB Controller
root@raoxu-PC:/sys# lspci -s 00:14.0 -v
00:14.0 USB controller: Intel Corporation Comet Lake PCH-V USB Controller (prog-if 30 [XHCI])Subsystem: ASRock Incorporation Device a3afFlags: bus master, medium devsel, latency 0, IRQ 122Memory at 99330000 (64-bit, non-prefetchable) [size=64K]Capabilities: [70] Power Management version 2Capabilities: [80] MSI: Enable+ Count=1/8 Maskable- 64bit+Kernel driver in use: xhci_hcd

首先查看xhci 寄存器基地址为:0x99330000
也可以通过其他方式获取到:

cat /proc/iomem | grep xhci99330000-9933ffff : xhci-hcd

读取 Operational Register Space 首地址:
在这里插入图片描述
在这里插入图片描述
根据代码和手册可以找到,需要找到Host Controller Operational Registers的地址偏移为:

root@raoxu-PC:/sys# busybox devmem 0x99330000 
0x01000080

读出来的偏移值0x80
那么偏移地址就是0x99330080

那么如何得到port的地址呢:
在这里插入图片描述
根据介绍,我们只需要根据port num 进行计算就可以了。
以我插入的鼠标为例:

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M|__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M|__ Port 5: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 12M|__ Port 5: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M|__ Port 10: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M|__ Port 3: Dev 8, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M

如何port 为 10
那么基地址为:addr = 0x99330080 + (0x400 + 0x10 * (10 -1)) = 0x99330510
那么读取状态:

root@raoxu-PC:/sys# busybox devmem 0x99330510 
0x00000E03

在这里插入图片描述
最高位写1 进行复位

root@raoxu-PC:/sys# busybox devmem 0x99330510 32 0x80000E03
root@raoxu-PC:/sys# busybox devmem 0x99330510 
0x000006E1

输入命令可以看到设备复位了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈希表第5/9题--两数之和

题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。…

实操专区-第11周-课堂练习专区-图的标记线和标记点

下载安装ECharts,完成如下样式图形。 代码和截图上传 完成 3.1.3.5 图的标记线和标记点 中的任务点 在一些折线图或柱状图当中,可以经常看到图中对最高值和最低值进行了标记。 在ECharts中,标记点(markPoint)常用于表示…

自定义实现 Java17+SpringBoot3+OpenAPI+Knife4j Starter

文章目录 前言正文1 创建starter项目1.1 依赖文件1.2 配置信息 2 自定义starer代码开发2.1 配置字段的定义2.2 自动配置类 3 验证starter3.1 测试项目的配置3.2 功能配置 application.yml3.3 测试代码3.3.1 实体类3.3.2 控制器13.3.2 控制器2 4 效果展示4.1 主页4.2 实体类列表…

构造二叉树

推断二叉树 P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先序遍历 : 根 左 右 中序遍历 : 左 根 右 后序遍历 : 左 右 跟 由前序遍历和中序遍历推后序遍历 // 由中序遍历和先序遍历 --> 后序遍历 void dfs(string InOr…

数据结构之----线性表顺序表

线性表分为 顺序存储结构 和 链式存储结构 线性表的顺序存储结构: 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。 1,顺序表的结构: #define MAXSIZE 20 typedef int El…

计算机组成与结构 计算机基本原理 软设刷题

计算机组成与结构 1-9 1-9 1 在()校验方法中,采用模二运算来构造校验位。 A 水平奇偶 B 垂直奇偶 C 海明码 D 循环冗余 Cache与主存之间的映射由硬件实现,主存与辅存之间的交互是硬件与软件结合起来实现的。 D 2 采用n位补码&…

JS中手写函数实现数据的深度拷贝以及异常的抓取

1、手写深度拷贝函数 function deepCopy(data:any) {if (typeof data ! object || data null) {return data; // 非对象直接返回};let copied Array.isArray(data) ? [] : {};for (let key in data) {if (data.hasOwnProperty(key)) {//ts-ignorecopied[key] deepCopy(da…

Windows快速部署DCNv4(成功版)

文章目录 一、介绍二、编译DCNv42.1 下载源码2.2 编译DCNv4 三、报错提示3.1 Cuda is not available3.2 需要Microsoft Visual C 14.0 一、介绍 论文链接:[https://arxiv.org/pdf/2401.06197.pdf] (https://arxiv.org/pdf/2401.06197.pdf)   在这篇文章中介绍了一…

MySQL Undo Log、Redo Log、bin Log

Undo Log 回滚日志,用于将数据回滚到之前的状态。 MySQL在进行数据的增、删、改时,会将数据写入到Undo Log日志中。 对于Undo Log存在着insert和update两种类型的数据。插入语句对应的是insert类型,修改、删除语句对应的是update类型。 U…

【嵌入式开发 Linux 常用命令系列 7.6 -- sed 替换指定字符串】

请阅读【嵌入式开发学习必备专栏】 文章目录 sed 替换指定字符串 sed 替换指定字符串 背景: 找到当前目录下所有的.h 和 .c 文件 将他们中的字符 print_log替换为 demo_log 可以使用find命令结合sed命令在Linux环境下完成这项任务。下面是一个命令行示例&#xff…

【Android】Kotlin学习之Kotlin方法的声明和传参

方法声明 普通类的方法 静态类的方法 不需要构建实例对象, 可以通过类名直接访问静态方法 : NumUtil.double(1) companion object 伴生类的方法 使用companion object 在普通类里定义静态方法 参数 括号内传入方法 : 当参数是方法时, 并且是最后一个参数 , 可以使用括号外…

Linux -- > vim

vi和vim是什么 vi和vim是两款流行的文本编辑器,广泛用于Unix和类Unix系统中。它们以其强大的功能和灵活的编辑能力而闻名,特别是在编程和系统管理中非常受欢迎。 vi(Visual Interface) vi是最初的文本编辑器之一,由…

React 之 lazy(延迟加载)(十七)

lazy 能够让你在组件第一次被渲染之前延迟加载组件的代码。 在组件外部调用 lazy,以声明一个懒加载的 React 组件: import { lazy } from react;const MarkdownPreview lazy(() > import(./MarkdownPreview.js)); 配合 Suspense 实现懒加载组件 //App.js imp…

外观模式详解

外观模式 1 概述 有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就…

课时122:awk实践_进阶知识_赋值运算

1.2.1 赋值运算 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 awk本质上属于一种编程语言,所以它具有编程语言的一般功能,表达式、流程控制等基本上都在awk中具有想当程度的使用。这一节我们学习awk进…

【智能算法】最优捕食算法(OFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2017年,GY Zhu受到动物行为生态学理论启发,提出了最优捕食算法(Optimal Foraging Algorithm, OFA)。 2.算法原理 2.1算法思想 OFA灵感来源…

【C++风云录】跨越语音壁垒:口语识别与方言分析

解码语音:语音识别新篇章 前言 本文将探讨C在口语识别与方言分析中的应用,简述其重要性和挑战,并详细介绍Kaldi, ProsodyLab-Aligner, PocketSphinx, HTK (HMM Toolkit), 和 OpenFst等语音识别和处理工具包和库的特点、主要功能以及实际应用…

常用的命令技巧总结

java命令执行 如下编码网站: Runtime.exec Payload Generater | AresXs Blogjava.lang.Runtime.exec() Payload Workarounds - Jackson_Thttps://www.bugku.net/runtime-exec-payloads/ 手动编码操作 bash -c {echo,cGluZyAxMjcuMC4wLjE7ZWNobyAxID50ZXN0LnR4dA}|…

Lab4: traps

RISC-V assembly Which registers contain arguments to functions? For example, which register holds 13 in mains call to printf? 根据RISC-V函数调用规范,函数的前8个参数使用a0-a7寄存器传递。 当main函数调用printf函数时,a2寄存器保存13 …

MVCC 详解

介绍 MVCC,全称 Multi-Version Concurrency Control,即多版本并发控制 MVCC的目的主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁。 这里的多版本指的是数据库中同时…