Linux usb主机控制器HC阅读

news2024/9/25 4:49:41

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.coloradmin.cn/o/2162418.html

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

相关文章

408选择题笔记|自用|随笔记录

文章目录 B树:访问节点建堆!将结点插入空堆广义指令求每个子网可容纳的主机数量虚拟内存的实现方式文件目录项FCB和文件安全性管理级别索引文件三种存取方式及适用器件成组分解访问磁盘次数 C语言标识符 最小帧长物理传输层介质 局域网&广域网考点总…

基于BeagleBone Black的网页LED控制功能(flask+gpiod)

目录 项目介绍硬件介绍项目设计开发环境功能实现控制LED外设构建Webserver 功能展示项目总结 👉 【Funpack3-5】基于BeagleBone Black的网页LED控制功能 👉 Github: EmbeddedCamerata/BBB_led_flask_web_control 项目介绍 基于 BeagleBoard Black 开发板…

ubuntu 安裝 Poetry 示例

ubuntu 安裝 Poetry 示例 一、前言 poetry 是一个命令行工具,安装之后就可以使用 poetry 指令。可以将其安装全局环境或者是虚拟环境,我推荐安装在全局环境,这样在后面使用时不需要单独激活虚拟环境。 (1)安装 Poet…

ubuntu22.04磁盘挂载(多磁盘和单磁盘挂载)

多磁盘挂载到同一个目录 # 如果没有安装逻辑卷管理系统工具sudo apt install lvm2 # 查看磁盘分区sudo fdisk -l # 新建物理卷sudo pvcreate /dev/nvme0n1 /dev/nvme1n1 # 查看现有物理卷信息sudo pvdisplay # 新建物理卷sudo vgcreate dnyjy_vg /dev/nvme0n1 /dev/nvme1n1…

STM32F407之超声波模块使用

#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "HC_SR04.h"int main() {OS_ERR err;//错误uart_init(9600);//串口初始化//超声波初始化HC_SR04();//OS初始化 他是第一个运行的函…

【VUE3.0】动手做一套像素风的前端UI组件库---Message

目录 引言自己整一个UI设计稿代码编写1. 设计信息窗口基础样式2. 设置打开和关闭的方法3. 编写实例化组件的js文件4. 看下最终效果5. 组件完整代码6. 组件调用方式 总结 引言 本教程基于前端UI样式库 NES.css 的UI设计,自行研究复现。欢迎大家交流优化实现方法~ 此次…

Flask建立的Web网站的can‘t open file C_Program问题的分析

前言 想自己制作一个Web网站对接私有化的大模型。考虑到私有化的大模型都是Python编写为主的。所以,就打算用Python建立一个Web网站。目前,选定的是Flask框架(Python3.11)。但是,用PyCharm进行调试的时候却出现了问题。…

努比亚z17努比亚NX563j原厂固件卡刷包下载_刷机ROM固件包下载-原厂ROM固件-安卓刷机固件网

努比亚z17努比亚NX563j原厂固件卡刷包下载_刷机ROM固件包下载-原厂ROM固件-安卓刷机固件网 统版本:官方软件作者:热心网友rom大小:911MB发布日期:2018-12-23 努比亚z17努比亚NX563j原厂固件卡刷包下载_刷机ROM固件包下载-原厂RO…

【工作流集成】springboot+vue集成工作流activiti,flowable,智能审批系统,集成方案(源码)

基于Javavue开发的智能审批系统,低代码平台 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需…

多智能体笔记本专家系统:集成CrewAI、Ollama和自定义Text-to-SQL工具

在这个项目中,我们的目标是创建一个由多智能体架构和本地大语言模型(LLM)驱动的个人笔记本电脑专家系统。该系统将使用一个SQL数据库,包含有关笔记本电脑的全面信息,包括价格、重量和规格。用户可以根据自己的特定需求…

数据结构3——双向链表

在上篇文章数据结构2——单链表中,我们了解了什么是链表,以及单链表的实现,接着上篇文章,本篇文章介绍一下比单链表更常用的链表——双向循环链表。 目录 1.双向链表的实现 1.1节点 1.2 初始化节点 1.3 动态开辟新节点 1.4 遍…

美团中间件C++一面-面经总结

1、TCP和UDP 的区别? 速记标识符:连靠刘墉宿营 解释: 面向连接vs无连接 可靠传输vs不保证可靠 字节流vs报文传输 拥塞控制流量控制vs无 速度慢vs速度快 应用场景自己描述 2、服务端处于close wait是什么情况,是由什么造成的&…

【算法】模拟:(leetcode)495.提莫攻击(easy)

目录 题目链接 题目介绍 解法 代码 题目链接 495. 提莫攻击 - 力扣(LeetCode) 题目介绍 解法 模拟 分情况讨论。 当寒冰再次中毒时,上次「中毒」是否已经结束。 ​ 当上次中毒已经结束了,那么上次「中毒」维持的时间就是 …

C++【类和对象】(构造函数与析构函数)

文章目录 1. 类的默认成员函数2. 构造函数析构函数的特点3. 析构函数析构函数的特点 结语 1. 类的默认成员函数 默认成员对象就是我们没有显示的写,但是编译器会自动生成的成员函数。一个类,我们不写的情况下编译器会默认生成以下6个成员函数&#xff0…

【JVM】一篇文章彻底理解JVM的组成,各组件的底层实现逻辑

文章目录 JVM 的主要组成部分类加载器(Class Loader)1. 加载(Loading)2. 链接(Linking)3. 初始化(Initialization) Execution Engine(执行引擎)1. 解释器&…

微服务--Docker

Docker是一个开源的应用容器引擎,它基于Go语言并遵从Apache2.0协议开源。Docker提供了一种轻量级、可移植和自包含的容器化环境,使开发人员能够在不同的计算机上以一致的方式构建、打包和分发应用程序。 一、Docker的基本概念 容器(Contain…

828华为云征文|使用Flexus X实例创建FDS+Nginx服务实现图片上传功能

一、Flexus X实例 什么是Flexus X实例呢,这是华为云最新推出的云服务器产品,如下图: 华为云推出的Flexus云服务器X系列,是在华为顶尖技术团队,特别是荣获国家科技进步奖的领军人物顾炯炯博士及其团队的主导下精心研发…

AWS注册时常见错误处理

引言 创建AWS账号是使用AWS云服务的第一步,但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题,包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …

记一次Mac 匪夷所思终端常用网络命令恢复记录

一天莫名奇妙发现ping dig 等基础命令都无法正常使用。还好能浏览器能正常访问&#xff0c;&#xff0c;&#xff0c;&#xff0c; 赶紧拿baidu试试^-^ ; <<>> DiG 9.10.6 <<>> baidu.com ;; global options: cmd ;; connection timed out; no serve…

leetcode24. 两两交换链表中的节点,递归

leetcode24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;he…