
系统底层与硬件嵌入式【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载USB4 高速信号对 PCB 走线长度与信号完整性提出了严苛要求drivers/intel/usb4/retimer驱动的出现正是为了应对这一挑战它在 coreboot 固件中为 USB4 Retimer重定时器生成 ACPI AML 代码通过 GPIO 控制 Retimer 上下电使操作系统能够安全更新其固件。本文以 Documentation/drivers/retimer.md 为骨架结合src/drivers/intel/usb4/retimer/源码与真实主板配置深入剖析其工作原理、设备树配置与_DSM实现细节。读完你将掌握在 coreboot 中启用该驱动、配置 GPIO 电源引脚、理解端口映射以及如何在 SoC 层扩展 EC 命令与端口转换逻辑的完整方法。Retimer 与 Redriver信号完整性方案的两条路线高速信号时代的走线难题随着 USB 规范演进速率从 5GbpsUSB 3.0提升到 10GbpsUSB 3.1/3.2 Gen2并在 USB4 中达到 20Gbps 甚至更高。高频信号通过 PCB 走线、连接器、CPU 封装等电路组件时会受到严重的衰减attenuation与失真长走线尤其明显。这直接推动了信号中继器件的普及。Redriver无协议感知的模拟放大Redriver重驱动器是无协议感知的模拟器件它放大信号中的高频成分以补偿衰减。因为不解析数据协议它结构简单、成本低但存在明显局限无法区分信号与噪声对噪声同样放大无法恢复时钟或重建数据只能做波形补偿在部分场景下效果有限甚至完全失效如信号已严重劣化时。Retimer协议感知的数字中继Retimer重定时器则通过CDRClock and Data Recovery时钟数据恢复恢复时钟与数据再重新发送一份全新副本的信号即它是协议感知的数字器件。由于内部是数字逻辑Retimer 往往带有自己的固件这也解释了为何它需要电源控制与固件更新能力——这正是本驱动的核心使命。驱动定位与编译条件Kconfig 开关与代码归属驱动源码位于 src/drivers/intel/usb4/retimer/Kconfig 定义DRIVERS_INTEL_USB4_RETIMER开关depends on HAVE_ACPI_TABLES说明它只在支持 ACPI 表的平台上可用Makefile.mk 在CONFIG_DRIVERS_INTEL_USB4_RETIMER使能后于ramstage编译retimer.cramstage-$(CONFIG_DRIVERS_INTEL_USB4_RETIMER) retimer.c。从源码结构看ramstage 阶段生成 SSDT 是 coreboot ACPI 驱动的标准做法device_operations中的.acpi_fill_ssdt回调即由此接入retimer.c。设备树配置把 Retimer 挂到 PCI 设备下最小配置示例文档给出的典型写法是在 USB4 相关 PCI 设备如 TCSS DMA/主机路由器下挂载一个 generic 设备device pci 0.0 on chip drivers/intel/usb4/retimer register power_gpio ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_A0) device generic 0 on end end end关键点power_gpio用于给 Retimer 供电的 GPIO其有效电平active state必须是通电的那一档即ACTIVE_HIGH表示高电平通电、ACTIVE_LOW表示低电平通电需按实际电路选择驱动会生成 ACPI AML 代码在操作系统通过_DSM方法请求时翻转该 GPIO。完整参数模型chip.hchip.h 定义的配置结构比文档示例更丰富参数类型说明num_dfpsuint8_t下游端口DFP数量上限DFP_NUM_MAX4未配置时源码默认设为 2dfp[i].power_gpiostruct acpi_gpio控制该 DFP 上 Retimer 供电的 GPIOdfp[i].typec_portstruct device *与该 Retimer 关联的 Type-C 端口dfp[i].ec_portenum ec_typec_port与 Retimer 关联的 EC Type-C 端口号当 CPU Type-C 端口到 EC 端口映射非连续时必须正确配置其中ec_port枚举在 chip.h 中定义为UNDEFINED0、EC_TYPEC_PORT_0EC_TYPEC_PORT_3。真实主板配置对照仓库中多块主板已实际启用该驱动可作参考模板Google Volteervoxeloverridetree.cb 中两个 DFP 共用GPP_H10并通过use tcss_usb3_port1 as dfp[0].typec_port将 TCSS USB3 端口关联进来Intel MTL RVPmtlrvp_pdevicetree.cb 在tcss_dma1下为四个 DFP 分别注册每个 DFP 绑定各自的 Type-C 端口其他启用者还包括src/mainboard/system76/adl/、src/mainboard/system76/tgl-u/、src/mainboard/framework/marigold/、src/mainboard/intel/ptlrvp/等变体。这些实例展示了use语法与dfp[i].typec_port的配合方式typec_port必须是 devicetree 中已定义的 USB 端口设备驱动通过usb_device-path.usb.port_id读取端口号再映射到 EC 端口。ACPI 生成流程从 devicetree 到 SSDT入口usb4_retimer_fill_ssdtretimer.c 的usb4_retimer_fill_ssdt是核心生成函数流程如下取设备 ACPI scope无 scope 或无配置则直接返回num_dfps缺省时置为 2源码注释说明所有现有主板都是 2 个 DFP写入Scope与 Host Router 设备HR_ADR为 0、_STA为全开对每个 DFP若未配置power_gpio则打印BIOS_WARNING并跳过用_ADR dfp_port*2 1表示 lane adapter若使能DRIVERS_USB_ACPI通过usb_acpi_get_pld()为 Type-C 连接器填充_PLD物理位置描述失败时打印BIOS_ERR写入电源引用计数器PWR初值 0随后生成Method (_DSM, 4, Serialized)_DSM内先做 UUID 匹配检查不匹配返回Buffer(One){0x0}匹配后按 Arg2Function Index分发到三个回调。_DSM接口UUID 与函数索引驱动使用的 UUID 定义于 retimer.cE0053122-795B-4122-8A5E-57BE1D26ACB3_DSM的 ACPI 调用约定Arg0Arg3参数含义Arg0UUIDArg1Revision ID本驱动为 1Arg2Function Index0/1/2Arg3参数包set_power_state取Arg3[0]三个回调注册于 retimer.cFunction Index回调行为0usb4_retimer_cb_standard_query返回支持的功能位图Revision 1 返回0x7支持 0/1/2 三个函数其他 Revision 返回0x11usb4_retimer_cb_get_power_state读取HR.DFPx.PWR引用计数0 返回 1否则返回 02usb4_retimer_cb_set_power_state依据Arg3[0]0 关/1 开增减PWR并执行对应的在线状态切换电源状态机引用计数与在线状态切换PWR引用计数语义set_power_state的核心是引用计数PWRretimer.cArg3[0] 0且PWR 0PWR--当PWR降到 0 时调用disable_retimer_online_stateArg3[0] 1且PWR 0调用enable_retimer_online_state后PWR其余情况返回 0结束时PWR 1返回 1否则返回 0。引用计数保证多次上电请求下只有最后一个请求释放时才真正断电避免固件更新中途被意外切断电源。使能在线状态enable_retimer_online_stateretimer.c 的注释列出了 NDA 约束下的六步流程Force power onacpigen_enable_tx_gpio将power_gpio置为有效电平供电检查是否有设备连接执行GET_MUX命令期望USB_PD_MUX_NONE0Suspend PDSUSPEND_PD命令期望返回值 0Set Mux to USB modeSET_USB命令期望USB_PD_MUX_USB_ENABLEDSet Mux to Safe modeSET_SAFE命令期望USB_PD_MUX_SAFE_MODESet Mux to TBT modeSET_TBT命令期望USB_PD_MUX_USB4_ENABLED或USB_PD_MUX_TBT_COMPAT_ENABLED。禁用在线状态disable_retimer_online_stateretimer.c 执行三步逆操作Set Mux to disconnectDISCONNECT命令期望 0Resume PDRESUME_PD命令期望 1Force power offacpigen_disable_tx_gpio将 GPIO 置为非有效电平。EC 命令轮询usb4_retimer_execute_ec_cmd每个 EC 命令的执行由 retimer.c 的usb4_retimer_execute_ec_cmd生成 AML 轮询逻辑命令字节 cmd USB_RETIMER_FW_UPDATE_OP_SHIFT(4) | port通过ec_retimer_fw_update(data)下发最多轮询USB4_RETIMER_ITERATION_NUM12次每轮USB4_RETIMER_POLL_CYCLE_MS25ms睡眠即单命令最长约 300msRFWU返回0xfeUSB_RETIMER_FW_UPDATE_ERROR时立即返回 -1GET_MUX返回0xffUSB_RETIMER_FW_UPDATE_INVALID_MUX则视为无效 MUX 状态继续轮询超时轮询次数耗尽或 MUX 掩码校验失败时关闭 GPIO 并返回 -1。相关常量集中在 retimer.hMUX 状态标志USB_PD_MUX_NONE0、USB_PD_MUX_USB_ENABLEDBIT(0)、USB_PD_MUX_DP_ENABLEDBIT(1)、USB_PD_MUX_SAFE_MODEBIT(5)、USB_PD_MUX_TBT_COMPAT_ENABLEDBIT(6)、USB_PD_MUX_USB4_ENABLEDBIT(7)、USB_RETIMER_FW_UPDATE_MUX_MASK掩码以及 17 号固件更新操作码。SoC 层扩展点弱符号与端口映射弱符号 EC 钩子驱动通过两个__weak函数与平台 EC 解耦retimer.cec_retimer_fw_update_path()返回 EC Retimer 固件更新命令返回寄存器RFWU的 ACPI 路径默认 NULL此时轮询逻辑退化为仅按超时判断ec_retimer_fw_update(uint8_t data)向 EC 下发命令字节默认空实现。SoC/板级代码需提供强实现才能驱动真实 EC。从源码注释可推断RFWU路径通常形如\\_SB.PCI0.TDMx.ARG见 retimer.c 的路径拼接逻辑。物理端口到 EC 端口的映射retimer_get_index_for_typec()是另一个__weak函数retimer.c负责将 CPU 物理 Type-C 端口号转换为抽象的 EC 端口号默认返回原值。源码注释给出了需要覆盖的典型场景主板可能仅使能物理 TCSS 端口 1 和 3EC 会将其编号为端口 0 和 1若 coreboot 仍以物理号 3 下发命令EC 将因索引错误而报错。因此每个使用该驱动的 SoC 代码都应实现此函数。此外若设备树显式配置了dfp[i].ec_port非UNDEFINED则优先使用该显式值config-dfp[dfp_port].ec_port - EC_TYPEC_PORT_0否则调用retimer_get_index_for_typec()推导。启用驱动的完整步骤清单综合以上分析在自定义主板上启用 USB4 Retimer 驱动的步骤如下确认硬件主板上存在 USB4 Retimer通常靠近 USB4 端口且平台支持 ACPI 表HAVE_ACPI_TABLES配置 Kconfig在板级或 SoC 配置中使能DRIVERS_INTEL_USB4_RETIMER编写 devicetree在 USB4 主机路由器如tcss_dma类 PCI 设备下挂载chip drivers/intel/usb4/retimer为每个 DFP 配置power_gpio、typec_port用use引用已定义的 USB 端口必要时配置ec_port与num_dfps实现 EC 钩子在 SoC 或板级代码中提供ec_retimer_fw_update_path()、ec_retimer_fw_update()的强实现让生成的 AML 能真正与 EC 交互实现端口映射实现retimer_get_index_for_typec()处理物理端口到 EC 端口的非连续映射验证编译后检查 SSDT 中是否生成HR/DFPx设备与_DSM方法确认PWR引用计数、GPIO 翻转与 EC 轮询逻辑符合预期ramstage 日志中的USB Type-C %d mapped to EC port %d可辅助调试。总结coreboot 的drivers/intel/usb4/retimer是一个典型的固件驱动 ACPI 生成二合一组件它在 ramstage 阶段把 devicetree 中的 GPIO 与端口配置翻译为宿主操作系统可调用的_DSM接口配合引用计数与 EC 命令轮询在确保 MUX 状态正确、PD 挂起的前提下安全切换 Retimer 电源为固件更新创造条件。理解其chip.h参数模型、_DSM回调分发与弱符号扩展点即可在任意支持 USB4 的 coreboot 平台上快速集成并排查问题。赞分享系统底层与硬件嵌入式【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载相关推荐coreboot 平台无关设备驱动框架全解析从 Devicetree 绑定到 ACPI 生成coreboot 平台无关设备驱动框架全解析从 Devicetree 绑定到 ACPI 生成 导读 coreboot 将大量板载与外插设备I2C 触摸板、风系统底层与硬件嵌入式Coreboot重定义固件世界的开源先锋Coreboot重定义固件世界的开源先锋 项目基础介绍与编程语言 Coreboot一个致力于替换传统BIOS/UEFI固件的自由软件项目以其源代码的形式存系统底层与硬件嵌入式grepWinWindows平台上最强大的正则表达式搜索替换工具终极指南grepWinWindows平台上最强大的正则表达式搜索替换工具终极指南 还在为Windows系统中海量文件的文本查找和替换而烦恼吗grepWin正则表达式上一篇彻底卸载 SoundflowerMac 音频驱动残留清理与验证指南下一篇CMake 生成器全解析使用 Visual Studio 16 2019 生成 VS2019 工程并配置平台与工具集创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考