Linux boot 时 USB 的初始化过程分析 3 中断

中断是 usb host 和 中断控制器 之间的 连线 , 注意, usb device 和 中断控制器之间 没有连线
所以中断都是 usb device 和 usb host (通过GND VCC D+ D-)通信之后, usb host 产生的中断


OHCI_Specification_Rev.1.0a.pdf P94有讲 中断来了改如何处理
	基本上是 读取 DeviceData->HC->HcInterruptStatus(即 HOST controler 的 HcInterruptStatus 寄存器),并针对每一位进行解析,判断中断原因


OHCI_Specification_Rev.1.0a.pdf P122 列出了 所有的HC寄存器
	P127 : 
	When a bit becomes set, a hardware interrupt is generated 
	if the interrupt is enabled in the HcInterruptEnable register (see Section 7.1.5)
	and the MasterInterruptEnable bit is set.
	
	总共有7种中断源:
		SO
		WDH
		SF
		RD
		UE
		FNO
		RHSC
		OC
  • 常见中断对应的原因
常见的中断有 
	WritebackDoneHead
	StartofFrame
	ResumeDetected
	RootHubStatusChange

每次中断发生时,必在 StartofFrame , 所以 StartofFrame 肯定会发生 // TODO
为什么插入完成后,就没有StartofFrame  中断了??? , MASK 了 ?

WritebackDoneHead 
	当 HC 发起了一次 request , HC 接收到了信息,填充了DDR,会设置 WritebackDoneHead
	例如 
		https://blog.csdn.net/u011011827/article/details/126452348 中 "枚举过程中的一次 control transfer : set address"
		当 STATUS 阶段完成之后,会产生一个中断.
		
		https://blog.csdn.net/u011011827/article/details/126452348 中 "枚举过程中的一次 control transfer : get device descriptor"
		当 STATUS 阶段完成之后,会产生一个中断.
		
RootHubStatusChange
	当 1个寄存器(HcRhStatus)1类寄存器(HcRhPortStatus[1:NDP])中的任一位发生变化,都会产生该中断
ResumeDetected
	A resume detected event occurs when the Root Hub detects resume signaling on the USB bus.
	// 是 reset 时序吗

在 linux-5.11, usb_hcd_irq 是 驱动侧最底层的中断函数,适用于 ohci echi xhci
在 linux上, ohci 对应的 最底层的中断函数 则是 ohci_irq 

[<c0392eac>] (usb_hcd_poll_rh_status) from [<c03ac9a0>] (ohci_irq+0x9c/0x298)    
[<c03ac9a0>] (ohci_irq) from [<c03920c4>] (usb_hcd_irq+0x24/0x38)                    
[<c03920c4>] (usb_hcd_irq) from [<c0147678>] (__handle_irq_event_percpu+0x40/0x128)
[<c0147678>] (__handle_irq_event_percpu) from [<c0147788>] (handle_irq_event_percpu+0x28/0x7c)
[<c0147788>] (handle_irq_event_percpu) from [<c0147804>] (handle_irq_event+0x28/0x3c)
[<c0147804>] (handle_irq_event) from [<c014b2bc>] (handle_level_irq+0x9c/0x114)  
[<c014b2bc>] (handle_level_irq) from [<c0146f34>] (generic_handle_irq+0x30/0x44) 
[<c0146f34>] (generic_handle_irq) from [<c0146f90>] (__handle_domain_irq+0x48/0xa8)
[<c0146f90>] (__handle_domain_irq) from [<c030cedc>] (vic_handle_irq+0x58/0x9c)  
[<c030cedc>] (vic_handle_irq) from [<c0100b4c>] (__irq_svc+0x6c/0x90)
对于ohci linux 来说,
重要中断分为几种
	1. OHCI_INTR_UE(不可恢复的错误)
	2. OHCI_INTR_RHSC(root hub 状态发生改变) 或者 OHCI_INTR_RD(唤醒)
	3. OHCI_INTR_WDH(数据传输)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值