ehci及其伴随ohci主机控制器驱动分析
1. 正常插入
插上U盘产生中断调用usb_hcd_irq:
usb_hcd_irq
ehci_irq
usb_hcd_resume_root_hub
queue_work(pm_wq, &hcd->wakeup_work); //hcd.c中的__usb_create_hcd中INIT_WORK(&hcd->wakeup_work, hcd_resume_work);
hcd_resume_work
usb_remote_wakeup
usb_autoresume_device
__pm_runtime_resume
rpm_resume
rpm_callback
__rpm_callback
usb_runtime_resume
usb_resume_both
usb_resume_interface
hub_resume
hub_activate //这个函数中会延时HUB_DEBOUNCE_STABLE时间
kick_hub_wq
queue_work(hub_wq, &hub->events) //hub.c的hub_probe中INIT_WORK(&hub->events, hub_event);
hub_event //hub.c
usb_reset_device //hub.c
usb_reset_and_verify_device
hub_port_init //hub.c
hub_port_reset //hub.c 在这里面进行速率识别握手,默认路由到ehci上,握手就可能路由到ohci上,然后中断线程判断寄存器状态后ohci直接就处理了,然后ehci判断断开了连接就退出了。
hub_set_address
port_event
hub_port_connect_change
hub_port_connect
hub_port_debounce_be_stable
hub_port_debounce //执行消抖操作
usb_new_device
usb_enumerate_device //hub.c 枚举设备 正常拔出
hub_irq 作为一个中断传输最先调用
2. 斜着插入U盘,使D+先接触,还会调用到其伴随的ohci控制器驱动
ohci和ehci在 hub_port_init() 中加 dump_stack() 显示的调用路径是一样的!
在 kick_hub_wq 中继续 dump_stack() 直到 usb_hcd_resume_root_hub() 也应该是一样的
不同之处:
//ehci:
start_kernel
rest_init
cpu_startup_entry
do_idle
arch_cpu_idle
el1_irq //起源于硬件中断,产生中断进入中断处理,el1_irq汇编,中断总入口
gic_handle_irq
__handle_domain_irq
generic_handle_irq
handle_fasteoi_irq //这个是有IO中断直接触发的
handle_irq_event
handle_irq_event_percpu
__handle_irq_event_percpu
usb_hcd_irq
ehci_irq
usb_hcd_resume_root_hub
//ohci:
ksoftirqd //起源于软中断
ret_from_fork
kthread
worker_thread
process_one_work //kick_hub_wq中queue_work(hub_wq, &hub->events),hub_irq中调用了kick_hub_wq
hub_event
hub_port_init
hub_port_reset
hub_ext_port_status
usb_control_msg
usb_start_wait_urb
usb_submit_urb
usb_hcd_submit_urb //这里面触发了这个中断
el1_irq //这个中断是?
gic_handle_irq
__handle_domain_irq
generic_handle_irq
handle_fasteoi_irq
handle_irq_event
handle_irq_event_percpu
__handle_irq_event_percpu
usb_hcd_irq
ohci_irq
usb_hcd_poll_rh_status
ohci_hub_status_data
usb_hcd_resume_root_hub
3. 结论
插入U盘产生的IO中断直接作用在ehci上,并由ehci先处理一遍。当由于速率识别,导致中断不再ehci上,此传输完成,hub_irq被调用,
然后它执行hub_event,之后触发一个硬中断,此中断由ohci处理了!
ehci及其伴随ohci主机控制器驱动分析的更多相关文章
- linux设备驱动之USB主机控制器驱动分析 【转】
转自:http://blog.chinaunix.net/uid-20543183-id-1930831.html ---------------------------------------- ...
- linux内核SPI总线驱动分析(一)(转)
linux内核SPI总线驱动分析(一)(转) 下面有两个大的模块: 一个是SPI总线驱动的分析 (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) ...
- Linux SD/MMC/SDIO驱动分析_转
转自:Linux SD/MMC/SDIO驱动分析 https://www.cnblogs.com/cslunatic/p/3678045.html#3053341 一.SD/MMC/SDIO概念 ...
- (linux)MMC 卡驱动分析
最近花时间研究了一下 MMC 卡驱动程序,开始在网上找了很多关于 MMC 卡驱动的分析文章,但大都是在描述各个层,这对于初学者来讲帮助并不大,所以我就打算把自己的理解写下来,希望对大家有用.个人觉得理 ...
- USB键盘驱动分析
简介 本文介绍USB驱动程序编写的流程,分析一个键盘的USB程序,基于linux-2.6.39 USB驱动概要 分层 主机层面的USB驱动的整体架构可以分成4层,自顶到下依次是 1.USB设备驱动:本 ...
- [tty与uart]3.tty驱动分析
转自:http://www.wowotech.net/linux_kenrel/183.html 目录: 1 首先分析设备驱动的注册 1.1 uart_register_driver分析 1.2 tt ...
- linux的串口驱动分析
1.串口驱动中的数据结构 • UART驱动程序结构:struct uart_driver 驱动 • UART端口结构: struct uart_port 串口 • UART相关操作函数结构: st ...
- Mini2440 DM9000 驱动分析(一)
Mini2440 DM9000 驱动分析(一) 硬件特性 Mini2440开发板上DM9000的电气连接和Mach-mini2440.c文件的关系: PW_RST 连接到复位按键,复位按键按下,低电平 ...
- mini2440触摸屏驱动分析
mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...
随机推荐
- 20161212xlVBA文本文件多列合并
Sub NextSeven_CodeFrame() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAlerts = Fal ...
- codeforces 559a//Gerald's Hexagon// Codeforces Round #313(Div. 1)
题意:面积是sqrt(3)/4的多少倍? 做延长线 #pragma comment(linker,"/STACK:1024000000,1024000000") #include& ...
- warning: LF will be replaced by CRLF in ***. The file will have its original line endings in your working directory.
git config --global core.autocrlf false
- UVA-1632 Alibaba (区间DP+滚动数组)
题目大意:在一条直线上有n件珠宝,已知每件珠宝的位置,并且第 i 件珠宝在 ti 时刻就消失,问能否将所有的珠宝收集起来?如果能,求出最短时间.搜集能瞬间完成. 题目分析:区间DP.dp(i,j,0) ...
- overflow属性-摘自网友
关于我们 版权声明 网站地图 前端观察 专注于网站前端设计与前端开发 用IE6抢不到火车票的!!! Home 首页 CSS样式之美 Front News前端资讯 JavascriptAjax与JS技术 ...
- Oracle数据库的“健康指示器”——事件(events)
Oracle数据库“赢在”在架构,这话还是有道理的,除了锁(lock)这个最大的架构上的“赢点”之外,Oracle事件(event)也是另外一个很重要的架构上的“赢点”,因为当今的Oracle数据库, ...
- G1收集器
转载:https://blog.csdn.net/zhou2s_101216/article/details/79202893 http://blog.jobbole.com/109170/ http ...
- Inno Setup 编译器操作
Inno Setup 编译器 1◆ 下载inno ha_innosetup5502_skygz_DownG.com 2◆ 安装 next 3◆ 操作 success 4◆ 测试安装 5◆ 卸载 uni ...
- POJ 1847 Floyd_wshall算法
前面用dijstra写过了.但是捏.数据很小.也可以用Floyd来写. 注意题目里给出的是有向的权值. 附代码:#include<stdio.h>#include<string.h& ...
- pywin32 的安装
这个东西不是在包管理器安装一下就可以的. https://github.com/mhammond/pywin32/releases 请到git下载exe安装文件.