工具/软件:Linux
使用具有双以太网 PHY 的 Beagle Bone Black 衍生板。 ETH_RESET 由 GPIO_0_29驱动、在 u-boot 中设置为输出。 U-boot 也会正确复位 PHY。
也有
GPIO0{&gpio0}
pinctrl-names ="default";
pinctrl-0 =<&GPIO0_PINS_DEFAULT>;
状态="正常";
ETH_RESET{
GPIO-hog;
GPIO =<29 GPIO_ACTIVE_HIGH_>;
输出低电平;
线路名称="ETH_RESET";
};
};
但是、这在 drivers/net/ti/davinci_mdio.c 之后进行处理、并且一些内核代码将所有 GPIO 引脚翻转回输入。 当前电路板在 GPIO_0_29上有上拉电阻、这会导致 PHY 在驱动器查找 PHY 时保持复位状态。 因此、尝试跟踪在内核中完成此操作的位置。 在 init/main.c 中添加了以下内容、以验证从 u-boot 到 GPIO_0_29仍处于正确状态。
void __iomem *GPIO0_BASE = NULL;
void __iomem *GPIO3_base = NULL;
GPIO0_BASE = ioremap ((unsigned int) 0x44E07000、4096);
GPIO3_base = ioremap ((unsigned int) 0x481AE000、4096);
PR_NOTICE ("START_kernel:GPIO0_Oe=%0x、GPIO3_Oe=%0x、GPIO0_dataout=%0x、GPIO3_dataout=%0x\n"、
_raW_readl (GPIO0_BASE + 0x134)、__raW_readl (GPIO3_base + 0x134)、
_raW_readl (GPIO0_BASE + 0x13C)、__raW_readl (GPIO3_base + 0x13C);
iounmap (GPIO0_BASE);
iounmap (GPIO3_base);
这可以正常工作、但当我在其他位置复制此代码时、例如 drivers/pinctrl/core.c、我将卡在
正在启动内核...
有什么想法为什么?