RK3588 kernel-6.1:drivers/usb/isp1760 功能与实现要点
源码基准:rk3588/kernel-6.1/drivers/usb/isp1760/。模块 isp1760(CONFIG_USB_ISP1760)。
1. 芯片与驱动定位
NXP ISP1760 / ISP1761 / ISP1763 为外置 USB 2.0 主机控制器(及部分型号的 设备控制器)IP,常挂在 CPU 本地总线 / FPGA / PCI 评估卡(如经 PLX9054 桥),不要求芯片自己做 DMA master:负载数据多在 控制器片内 SRAM 与 urb 缓冲区 之间由驱动搬运(配合 PTD 调度)。
Kconfig 声明的限制:
- 不支持等时(ISO)传输、不支持 OTG(代码里对 ISP1761 的 Host/Device 切换有寄存器配置,OTG 协议栈仍为 TODO)。
- 依赖
REGMAP_MMIO,寄存器访问统一走regmap/regmap_field。
与 RK3588:RK3588 片上 USB 一般为 DWC3/xHCI,很少外挂 ISP176x。本目录适用于 NXP 兼容评估板、自定义总线上的 ISP176x 等场景。
2. 源码分层(Makefile)
| 对象 | 文件 | 职责 |
|---|---|---|
| 公共核心 | isp1760-core.c |
isp1760_register/unregister、isp1760_init_core(复位、总线宽度、过流极性、中断极性、1761 的 HC/DC IRQ 共用处理)、片内存储布局、regmap 配置 |
| 总线胶水 | isp1760-if.c |
platform(OF)、可选 PCI(PLX + ISP1761);解析 nxp,usb-isp176{0,1,3}、bus-width、usb-dr-mode 等 → devflags |
| 主机 | isp1760-hcd.c |
usb_hcd + hc_driver:PTD(Philips Proprietary Transfer Descriptor)、ATL/INT/ISO 三段队列偏移(ISO 路径声明不可用)、片内 payload 与 isp1760_qh/isp1760_qtd |
| 设备 | isp1760-udc.c |
usb_gadget(ISP1761/1763 带 DC);VBUS 轮询、EP/usb_request 队列 |
| 寄存器 | isp1760-regs.h |
MMIO 偏移与宏 |
| 头文件 | isp1760-core.h、isp1760-hcd.h、isp1760-udc.h |
struct isp1760_device、devflags、导出 isp1760_set_pullup |
编译选项:USB_ISP1760_HOST_ROLE → USB_ISP1760_HCD;GADGET_ROLE → USB_ISP1761_UDC;DUAL_ROLE → 二者都选。
3. 初始化与寄存器模型(isp1760-core.c)
isp1760_register:devm_kzallocstruct isp1760_device(内含isp1760_hcd+isp1760_udc)。- 按
ISP1760_FLAG_ISP1763选用 1763 或 176x 的regmap_config与REG_FIELD表(1763 的 DC 为 8-bit 寄存器 / 16-bit 值 等不同形态)。 devm_ioremap_resource单一mem窗口;HC 与 DC 各自devm_regmap_init_mmio(基地址相同,访问特性不同)。isp1760_init_core:可选 GPIO 复位 → 软件复位所有模块 → HW Mode Control(数据线宽度、模拟/数字过流、DREQ/DACK、中断 电平/边沿)。- ISP1761:临时关闭 DC 全局中断、打开 HW_COMN_IRQ;
ISP176x_HC_OTG_CTRL按ISP1760_FLAG_PERIPHERAL_EN在 主机(VBUS 驱动) 与 外设(关闭 OTG、下拉控制) 间写死一路(注释:真正 OTG 待完成)。 - 若编译 HCD:
isp1760_hcd_register;若芯片支持且编译 UDC:isp1760_udc_register(失败则撤销 HCD)。
片内 RAM 布局:isp176x_memory_conf(约 60 KB,多块 256/1024/8192)与 isp1763_memory_conf(约 20 KB)供 HCD 做 slot/payload 管理。
4. 主机实现要点(isp1760-hcd.c)
- 对接
usbcore的标准入口:urb_enqueue、root hub、端口状态位等。 - 调度核心为硬件 PTD(
struct ptd,多 DW 编码长度、设备地址、PID、分组类型、split、数据区偏移、toggle/ping/NAK/CERR、ACTIVE/错误位等),写入芯片 ISO/INT/ATL 银行等偏移(如PTD_OFFSET、ATL_PTD_OFFSET、PAYLOAD_OFFSET)。 - 软件侧
isp1760_qh(每活跃 endpoint)挂isp1760_qtd链表,状态机QTD_ENQUEUED→QTD_PAYLOAD_ALLOC→QTD_XFER_STARTED→ complete/retire。 - 文件头注释:ISO、OTG 不可用;中断缺省 低电平有效。
5. 设备实现要点(isp1760-udc.c)
usb_gadget/usb_ep,请求isp1760_request。- 通过
regmap_field读写 DC 寄存器;必要时regmap_raw_*访问 FIFO。 isp1760_set_pullup(core 导出)控制 D+ 上拉。- VBUS:定时器周期
ISP1760_VBUS_POLL_INTERVAL轮询(非 OTG HNP 完整实现)。
6. 平台绑定(isp1760-if.c)
- OF:
nxp,usb-isp1760/isp1761/isp1763;bus-width;usb-dr-mode为 peripheral 时置ISP1760_FLAG_PERIPHERAL_EN;analog-oc、dack-polarity、dreq-polarity等。 - PCI:针对 PLX 9054 一类表项,检测 scratch、配置 PLX 中断路由,
isp1760_register使用resource[3]映射区。
7. 小结
| 维度 | 内容 |
|---|---|
| 对上接口 | Host:usb_hcd;Device(1761/1763):usb_gadget |
| 传输 | 控制/批量/中断为主;ISO 未支持 |
| 数据通路 | PTD + 片内 payload RAM;非典型 PCI DMA 形态 |
| 双角色 | 主要通过 DT + PERIPHERAL_EN 与寄存器固定 HC/DC 角色;非完整 OTG |
调试时可结合 debugfs(HCD 内可选)与 usbmon(主机 URB)观察枚举与传输;移植新板级重点核对 bus-width、中断极性、复位 GPIO、usb-dr-mode。
正在加载留言…