前置文档
数据结构
qemu中结构体大致上和 kernel中的结构体是有一个对应的
PCIDevice == ehci_hcd
EHCIState::caps == ehci_hcd::ehci_caps
EHCIState::mem_caps 响应 guest对ehci_hcd::ehci_caps的读写处理
EHCIState::opreg == ehci_hcd::ehci_regs
EHCIState::mem_opreg响应 guest对ehci_hcd::ehci_regs的读写处理
classDiagram
class PCIDevice{
pci_irq_handler()/*处理PCI设备的中断*/;
}
class PCIBus{
set_irq()*
}
Object --|> EHCIPCIState
Object --|> DeviceState
EHCIPCIState *-- EHCIState
EHCIPCIState *-- PCIDevice
classDiagram
class EHCIState{
qemu_irq irq
uint16_t capsbase
uint16_t opregbase
uint16_t portscbase
uint8_t caps[CAPA_SIZE]
uint32_t opreg[44]
usb_ehci_pci_init()/*修改opregbase*/
}
EHCIState : USBPacket ipacket
EHCIState : asynclistaddr
EHCIState : usb_ehci_init()
EHCIState : usb_ehci_finalize()
EHCIState : usb_ehci_realize()
EHCIState : usb_ehci_unrealize()
EHCIState : ehci_advance_periodic_state()
EHCIState : ehci_advance_async_state()
EHCIState : ehci_advance_state()
EHCIState : get_dwords()
EHCIState : ehci_state_fetchentry()
EHCIState <|-- DeviceState
EHCIState *-- mem_caps
EHCIState *-- mem_opreg
EHCIState *-- mem_ports
EHCIState *-- mem
EHCIState *-- caps
EHCIState *-- opreg
EHCIState *-- ports
class MemoryRegion {
write()*
read()*
memory_region_init_io()
}
MemoryRegion --|> mem_caps
MemoryRegion --|> mem_opreg
MemoryRegion --|> mem_ports
MemoryRegion --|> mem
class mem_caps{
read()=ehci_caps_read()
write()=ehci_caps_write()
}
mem_caps -- caps
class mem_opreg{
read()=ehci_opreg_read()
write()=ehci_opreg_write()
}
mem_opreg -- opreg
class mem_ports{
read()=ehci_ports_read()
write()=ehci_ports_write()
}
mem_ports -- ports
classDiagram
vmstateehci <|.. VMStateDescription
VMStateDescription *-- fields
fields <|.. VMStateField
class SysBusEHCIClass
SysBusEHCIClass : +uint64 capsbase
SysBusEHCIClass : +uint64 opregbase
SysBusEHCIClass : +uint64 portscbase
状态跳转
stateDiagram
EST_INACTIVE --> EST_ACTIVE: if USBCMD_RUNSTOP
EST_ACTIVE --> EST_WAITLISTHEAD
EST_WAITLISTHEAD --> EST_FETCHENTRY
EST_FETCHENTRY --> EST_FETCHQH: if NLPTR_TYPE_QH
EST_FETCHENTRY --> EST_FETCHITD: if NLPTR_TYPE_ITD
EST_FETCHENTRY --> EST_FETCHSITD: if NLPTR_TYPE_STITD
寄存器命令
EHCIState::opreg::usbcmd
1 | // file hw/usb/ehci-regs.h |
- 寄存器 对应kernel中 ehci_hcd::regs::command字段
- 在 EHCIState::mem_caps::read(即ehci_opreg_write) 函数中被处理
1 | static const MemoryRegionOps ehci_mmio_caps_ops = { |
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2022/07/04/it/linux/qemu/usb/ehci/ehci/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!