Weidong,
你好,我有一个关于WIFI/BT的问题想请教你。基于Android 11移植WIFI_BT模组AW-CM276NF至i.MX 8MQ。
1. 首先是硬件与官方开发板的区别
| 官方开发板imx8mq | 我们定制板 |
Wifi/BT模组 | AW-CM276MA-PUR | AW-CM276NF |
Android 11 PCIE接口 | Pcie2 | Pcie1 |
接口 | M2接口 | 直接焊接 |
2. 遇到的问题,在系统启动,初始化pcie的时候报如下错误:
[ 5.003183] imx6q-pcie 33800000.pcie: Phy link never came up
[ 5.009289] imx6q-pcie 33800000.pcie: failed to initialize host
[ 6.026260] imx6q-pcie 33800000.pcie: unable to add pcie port.
3. WIFI/BT部分的原理图如下
系统启动之后,GPIO的状态
CONFIG_HOST0: 1
CONFIG_HOST1: 1
CONFIG_HOST2: 0
4. 时钟发生器
PCIE1_REF_CLKP/PCIE1_REF_CLKN/WIFI_PCIE_CLKP/WIFI_PCIE_CLKN波形:
5. 软件设备树的配置:
6. 个人源码跟踪分析
我注意到日志中有报错“Phy link never came up”,而官方的开发板直接是“Link up”,日志对应的源码:"drivers/pci/controller/dwc/pcie-designware.c"
int dw_pcie_wait_for_link(struct dw_pcie *pci)
{
int retries;
/* Check if the link is up or not */
for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) {
if (dw_pcie_link_up(pci)) {
dev_info(pci->dev, "Link up\n");
return 0;
}
usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX);
}
dev_info(pci->dev, "Phy link never came up\n");
return -ETIMEDOUT;
}
EXPORT_SYMBOL_GPL(dw_pcie_wait_for_link);
int dw_pcie_link_up(struct dw_pcie *pci)
{
u32 val;
if (pci->ops && pci->ops->link_up)
{
return pci->ops->link_up(pci);
}
val = readl(pci->dbi_base + PCIE_PORT_DEBUG1);
printk("@alan dw_pcie_link_up 2 val:[%x]\n", val);
return ((val & PCIE_PORT_DEBUG1_LINK_UP) &&
(!(val & PCIE_PORT_DEBUG1_LINK_IN_TRAINING)));
}
EXPORT_SYMBOL_GPL(dw_pcie_link_up);
由于pci->ops->link_up接口没有实例化,因此判断是否Link up 主要是读取寄存器readl(pci->dbi_base + PCIE_PORT_DEBUG1)。
经调试打印读取val的结果为0x 8200000,不满足Link up的条件。至于为什么读取的寄存器值不正确,我目前没有进一步跟踪的思路。
@weidong_sun 你能帮我分析一下“Phy link never came up”,出现的原因,以及相应的解决方法吗?
解決済! 解決策の投稿を見る。
Hello @pyh0603 ,
我从头开始看了一下你的描述。
1. Hardware
--PDn脚 拉高3.3V,OK
--CONFIG脚配置为PCIE UART接口,OK
--PERSTn和WDISABE拉高对的。
所以,hardware没啥问题。
2. software
我看到你的dts中,不仅添加了&pcie0节点,还加了pcie0-ep节点(这个不应该加,这是板子测试时,2个板子PCIE直接连接,一个做RC,一个做EP,进行传输速率测试用的)所以,你把pcie0-ep节点的status配置为disabled。
这样你的276模组应该可以工作了。
weidong
Hello @pyh0603 ,
我从头开始看了一下你的描述。
1. Hardware
--PDn脚 拉高3.3V,OK
--CONFIG脚配置为PCIE UART接口,OK
--PERSTn和WDISABE拉高对的。
所以,hardware没啥问题。
2. software
我看到你的dts中,不仅添加了&pcie0节点,还加了pcie0-ep节点(这个不应该加,这是板子测试时,2个板子PCIE直接连接,一个做RC,一个做EP,进行传输速率测试用的)所以,你把pcie0-ep节点的status配置为disabled。
这样你的276模组应该可以工作了。
weidong