中断是 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(数据传输)