工具/软件:
TI 团队大家好、
我的团队正在开发一个使用主机处理器 DRA76P 的定制电路板、该电路板与 Android 8 (Oreo)和 Linux 内核4.4一起运行。 目前、我们正在努力将 JodyW377 BT/WIFI 集成到 SOC 中。 主要思路是使用模块的 PCIe 接口、使用 DRA76P 作为根复合体、并使用 JodyW377作为端点。
我们决定在 DRA76P 中生成 PCIe 基准时钟、并通过引脚 ljcb_clkn 和 ljcp_clkp 输出信号。 根据我们通过阅读 TRM 所了解的内容、我们知道这意味着需要将 ACSPCIE 缓冲器设置为输出。
我们在内核中并通过分析 dt 绑定进行了搜索 ti-pci.txt 迈出了启用的第一步 pcie1_rc 中定义的节点 dra7.dtsi
&pcie1_phy{
状态="正常";
};
&pcie1_rc{
状态="正常";
};
但是、在应用此变化后、我们暂时不测量任何时钟输出。
之后、我们分析了设备驱动程序 PCI-dra7xx (它是控制 pcie1_rc 的驱动器)和 PHY-ti-pipe3 (驱动器控制着 pcie1_phy)、在我们看来、它们并不控制 DE 时钟引脚、我们也没有找到任何暗示此引脚可通过器件树属性设置为输出的信息。
我们遵循的下一个步骤是在 TRM 中进行更深入的研究、并发现了这一点 表28-56. PCIePHY 子系统底层编程序列 指明时钟引脚可设置为通过寄存器输出 CTRL_CORE_SMA_SW_6[17:16](PCIE_TX_RX_CONTROL) 指定了 PCIePHY 子系统初始化序列。 我们在上面分析的任何驱动程序或 Linux 内核源中都没有发现此寄存器是写入的、也没有发现子系统初始化的其他步骤。
因此、我们尝试在 u-boot 初始化期间执行该初始化序列、更具体地说、我们执行了以下步骤:
在 PCIe 上启动软件强制唤醒转换
时钟域 CM_PCIE_CLKSTCTRL[1:0] CLKTRCTRL 0x2
在 L3INIT 上启动软件强制唤醒转换
时钟域 CM_L3INIT_CLKSTCTRL[1:0] CLKTRCTRL 0x2
选择 ACSPCIE 缓冲器的所需方向
(连接到 ljcp_clkn/ljcp_clkp 引脚) CTRL_CORE_SMA_SW_6[17:16] PCIe_TX_RX_CONTROL
选择 APLL_PCIe 100MHz 基准时钟源 CM_CLKMODE_APLL_PCIe[7] REFSEL
应用了此更改的函数。 我们启动电路板、在 u-boot 中停止、然后我们可以测量时钟引脚中的100MHz 活动。 但是、如果我们让电路板继续引导、当内核初始化时、时钟就会停止振荡。
考虑到所有这些、我们接下来会提出有关这一点的问题:
- 是否有较新版本的 PCIe 控制器和 PCIe phy 子系统驱动程序支持 phy 子系统初始化、我们需要在 u-boot 中执行这些初始化以将时钟引脚配置为输出
- u-boot 中是否有一些必须配置但缺少的支持?
- 我们在 PCIe 协议方面效率不高、但由于控制器未发现器件、时钟是否可能停止振荡?
我们在论坛上阅读了以下帖子,但目前没有成功:
e2e.ti.com/.../how-to-make-am572x-pcie-phy-refer-clock-out
e2e.ti.com/.../linux-am5728-pcie-output-clock-configuration
谢谢、此致、
Mariano