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_probe;C67X00_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_irq → c67x00_ll_irq → 按 SIEMSGFlg 取 SIE message,分发 sie->irq |
c67x00-ll-hpi.c |
底层寄存器/HPI 读写:**COMM_*** 信箱协议、执行芯片 BIOS 软件中断(如 HUSB_SIE_INIT_INT)、读写 TD 列表指针/EOT、清除状态位 |
c67x00-hcd.c |
hc_driver:root hub 描述符与 hub_control(双端口 C67X00_PORTS=2)、urb_enqueue/dequeue、c67x00_hcd_irq(TDListDone / SOF-EOP → c67x00_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 分层模型
- USB core 只看到
usb_hcd+c67x00_hc_driver。 struct c67x00_hcd(置于hcd->hcd_priv)绑定单个c67x00_sie(主机实例),维护urb列表与 片内 TD/缓冲区游标(td_base_addr…next_buf_addr)。c67x00_ll_*通过 HPI 把 TD 链表 写入芯片 RAM(基址CY_HCD_BUF_ADDR起),并 ARM 主机传输(HOST_CTL_REG的ARM_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 主机 HCD:sched 负责把 urb 切成 c67x00_td 并填入芯片存储器,ll-hpi 负责与固件协助的 低速总线协议,hcd 对接 usbcore 与 双端口 root hub。
正在加载留言…