crazyboy

曾梦想仗剑走天涯
后来工作忙没去了

  • 主页
  • 人生啊~
  • 电脑?
  • 神兵利器
  • 工作嘛!
所有文章 友链 关于我 展开
  • 所有文章
  • 友链
  • 关于我
  • 展开

计算机爱好者
云计算
云存储
网络技术
非洲酋长
可爱的胖子
十年攻城狮

tag:

  • 生活
  • 才华
  • 一生所爱
  • -AI
  • 麒麟
  • 计算机技术
  • 工具
  • ssh
  • docker
  • hexo
  • git
  • net
  • ubuntu
  • kernel
  • gdb
  • nodejs
  • USB
  • -计算机技术 -SCSI
  • qemu
  • UVC
  • linux
  • testtool
  • windows
  • python
  • ftp
  • 记录
  • 码云
  • CSDN
  • live
  • test
  • AI
  • kylin
  • it

crazyboy

曾梦想仗剑走天涯<br>后来工作忙没去了

<巨人的肩膀> qemu-ehci知识分享

[busuanzi] 阅读数:3151次 2022-07-04
字数统计: 408字   |   阅读时长≈ 2分

前置文档

  • <巨人的肩膀> ehci知识分享

数据结构

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的读写处理

PCIDevice
pci_irq_handler() : *处理PCI设备的中断*/;
PCIBus
set_irq()
Object
EHCIPCIState
DeviceState
EHCIState
EHCIState
qemu_irq irq
uint16_t capsbase
uint16_t opregbase
uint16_t portscbase
uint8_t caps[CAPA_SIZE]
uint32_t opreg[44]
USBPacket ipacket
asynclistaddr
usb_ehci_pci_init() : *修改opregbase*/
usb_ehci_init()
usb_ehci_finalize()
usb_ehci_realize()
usb_ehci_unrealize()
ehci_advance_periodic_state()
ehci_advance_async_state()
ehci_advance_state()
get_dwords()
ehci_state_fetchentry()
DeviceState
mem_caps
read()=ehci_caps_read()
write()=ehci_caps_write()
mem_opreg
read()=ehci_opreg_read()
write()=ehci_opreg_write()
mem_ports
read()=ehci_ports_read()
write()=ehci_ports_write()
mem
caps
opreg
ports
MemoryRegion
write()
read()
memory_region_init_io()
vmstateehci
VMStateDescription
fields
VMStateField
SysBusEHCIClass
+uint64 capsbase
+uint64 opregbase
+uint64 portscbase

状态跳转

if USBCMD_RUNSTOP
if NLPTR_TYPE_QH
if NLPTR_TYPE_ITD
if NLPTR_TYPE_STITD
if qh.token & QTD_TOKEN_HALT
if qh.token & QTD_TOKEN_ACTIVE
if other
EST_INACTIVE
EST_ACTIVE
EST_WAITLISTHEAD
EST_FETCHENTRY
EST_FETCHQH
EST_FETCHITD
EST_FETCHSITD
EST_HORIZONTALQH
EST_FETCHQTD
EST_ADVANCEQUEUE
EST_EXECUTE
EST_EXECUTING
if
packet.status
=
USB_RET_NAK
EST_WRITEBACK

寄存器命令

EHCIState::opreg::usbcmd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// file hw/usb/ehci-regs.h
#define USBCMD 0x0000
#define USBCMD_RUNSTOP (1 << 0) //0x1 run / Stop
#define USBCMD_HCRESET (1 << 1) //0x2 HC Reset
#define USBCMD_FLS (3 << 2) //0xc Frame List Size
#define USBCMD_FLS_SH 2 // Frame List Size Shift
#define USBCMD_PSE (1 << 4) //0x10 Periodic Schedule Enable
#define USBCMD_ASE (1 << 5) //0x20 Asynch Schedule Enable
#define USBCMD_IAAD (1 << 6) //0x40 Int Asynch Advance Doorbell
#define USBCMD_LHCR (1 << 7) //0x80 Light Host Controller Reset
#define USBCMD_ASPMC (3 << 8) //0x300 Async Sched Park Mode Count
#define USBCMD_ASPME (1 << 11) //0x800 Async Sched Park Mode Enable
#define USBCMD_ITC (0x7f << 16) //0x7f0000 Int Threshold Control
#define USBCMD_ITC_SH 16 // Int Threshold Control Shift
  • 寄存器 对应kernel中 ehci_hcd::regs::command字段
  • 在 EHCIState::mem_caps::read(即ehci_opreg_write) 函数中被处理
1
2
3
4
5
6
7
8
9
static const MemoryRegionOps ehci_mmio_caps_ops = {
.read = ehci_caps_read,
.write = ehci_caps_write,
.valid.min_access_size = 1,
.valid.max_access_size = 4,
.impl.min_access_size = 1,
.impl.max_access_size = 1,
.endianness = DEVICE_LITTLE_ENDIAN,
};
  • 本文作者: crazyboy
  • 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2022/07/04/it/linux/qemu/usb/ehci/ehci/
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
  • 计算机技术
  • kernel
  • USB
<巨人的肩膀> ehci知识分享
qemu-usb-ehci 整理
  1. 1. 前置文档
  2. 2. 数据结构
  3. 3. 状态跳转
  4. 4. 寄存器命令
    1. 4.1. EHCIState::opreg::usbcmd
© 2022-2025 crazyboy
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量3465次 | 本站访客数3465人