RK3588 kernel-6.1:drivers/usb/c67x00 功能与实现要点

RK3588 kernel-6.1:drivers/usb/c67x00 功能与实现要点

源码基准:rk3588/kernel-6.1/drivers/usb/c67x00/。配置入口:CONFIG_USB_C67X00_HCD(定义于 drivers/usb/host/Kconfig),模块名 c67x00

1. 硬件与驱动定位

Cypress C67x00(如 EZ-Host/EZ-OTG 一类芯片族)是带有 两个 SIE(Serial Interface Engine) 的 USB 控制器,每个 SIE 可配置为 主机 / 外设 / 空闲。芯片通过 HPI(主机并行接口) 等与 MPU 相连(寄存器 include/linux/usb/c67x00.h 中的 hpi_regstep)。

本 Linux 驱动仅实现主机模式c67x00_probe_sie 里对 C67X00_SIE_HOST 调用 c67x00_hcd_probeC67X00_SIE_PERIPHERAL_* 会落入 unsupported 分支(设备侧需依赖芯片内部固件/其它栈,不在此目录)。

hc_driver 标志 HCD_USB11 | HCD_MEMORY:面向 USB 1.1 全速 主机场景(调度里以 12000 bit/ms 一类参数描述帧带宽)。

与 RK3588:RK3588 不使用该系列桥片;目录适用于 遗留嵌入式主板外挂 Cypress USB 或学习 非 OHCI/UHCI/EHCI 的专有 TD 主机实现


2. 源码文件分工

文件 职责
c67x00-drv.c platform probe:映射 HPI MMIO、注册 IRQ;struct c67x00_device 内含 sie[2]c67x00_irqc67x00_ll_irq → 按 SIEMSGFlgSIE message,分发 sie->irq
c67x00-ll-hpi.c 底层寄存器/HPI 读写**COMM_*** 信箱协议、执行芯片 BIOS 软件中断(如 HUSB_SIE_INIT_INT)、读写 TD 列表指针/EOT、清除状态位
c67x00-hcd.c hc_driverroot hub 描述符与 hub_control双端口 C67X00_PORTS=2)、urb_enqueue/dequeuec67x00_hcd_irqTDListDone / SOF-EOPc67x00_sched_kick
c67x00-sched.c TD 调度struct c67x00_td(12 字节硬件格式 + 软件链表)、四类 URB 队列(iso/int/ctrl/bulk)、片内 TD/BUFFER 基址分配、带宽MAX_FRAME_BW_STD vs ISO**)、**work** 推进 **giveback`
c67x00.h 寄存器位域、CY_HCD_BUF_ADDR/SIE_TD_* 偏移、struct c67x00_sie

3. 实现原理概要

3.1 分层模型

  1. USB core 只看到 usb_hcd + c67x00_hc_driver
  2. struct c67x00_hcd(置于 hcd->hcd_priv)绑定单个 c67x00_sie(主机实例),维护 urb 列表与 片内 TD/缓冲区游标td_base_addrnext_buf_addr)。
  3. c67x00_ll_* 通过 HPITD 链表 写入芯片 RAM(基址 CY_HCD_BUF_ADDR 起),并 ARM 主机传输(HOST_CTL_REGARM_EN 等)。

3.2 中断与调度

  • HPI 状态 中出现 DONE_FLG/SIEMSG_FLG/SOFEOP_FLG 等 → c67x00_hcd_irq
  • HUSB_TDListDone一轮 TD 处理完毕,唤醒 c67x00_sched_kick,在 workqueue 路径解析 c67x00_td 状态位(ACK/NAK/STALL/SEQ…),完成 urb 或重试。
  • SOF:用于 周期性调度 与帧对齐。

3.3 Root Hub

软件实现 2 端口 hub(无外部 hub IC):GetPortStatus 组合 USB_STAT_REG/USB_CTL_REG连接/低速/使能 位;USB_PORT_FEAT_RESET 调用 c67x00_ll_husb_reset + husb_reset_port

3.4 平台数据

struct c67x00_platform_data

  • sie_config:4 bit × 2,指定每个 SIE HOST / UNUSED / PERIPHERAL(仅 HOST 路径可用)。
  • hpi_regstep:HPI 寄存器间距。

4. 限制与设计备注

  • 仅 HPI:注释写明 SPI/HSS不能在 IRQ 上下文安全访问 而未支持。
  • Gadget/OTG 主机协商:芯片虽标 OTG,Linux 侧未实现 peripheral SIE 驱动
  • 调度ISO 与 BULK 帧带宽 通过 max_frame_bw 等切换策略折中(见 c67x00-hcd.h 头部注释)。

5. 小结

c67x00 是一套 专有序列引擎 + 片内 TD RAM + HPI 信箱USB1.1 主机 HCDsched 负责把 urb 切成 c67x00_td 并填入芯片存储器,ll-hpi 负责与固件协助的 低速总线协议hcd 对接 usbcore双端口 root hub

文章互动

阅读 --

留言

0 条留言

正在加载留言…