【发布时间】:2021-03-14 00:38:38
【问题描述】:
我有一块 OrangePi PC Plus 板,它在 Allwinner H3 处理器上运行带有内核 4.19.57 的 Linux (ubuntu 18.04)。
我们使用 STWD100 ASIC 设计了一个硬件看门狗。这个 IC 有一个 gpio,应该至少每秒切换一次,否则它会重置电路板。另一方面,我在谷歌上搜索过这个主题,我意识到 Linux 内核有一个名为 GPIO 看门狗的驱动程序(在 drivers/watchdog/gpio_wdt.c 文件中)。
由于项目要求,看门狗GPIO连接到处理器的引脚PA19应该在内核解压并执行后立即开始切换,或者板被STWD100强制重启。为了使问题更加复杂,我应该补充一点,我们不能对电路进行任何修改。为了防止 STWD100 在内核加载之前重置我们的板,我们有一个定时器,它禁用 STWD100 大约 5~8 秒,我们不能改变这个时间间隔(因为它在电路中是固定的)。因此,一旦控制权传递给内核,我们就应该在 Linux 内核中运行我们的 GPIO 看门狗驱动程序。
到目前为止我做了什么:
- 将
printk("============================\n");添加到gpio-watchdog驱动的gpio_wdt_probe()功能。 - 使用 CONFIG_GPIO_WATCHDOG=y、CONFIG_GPIO_WATCHDOG_ARCH_INITCALL=y 的交叉编译内核。
- 反编译板设备树使用
dtc从dtb文件中获取设备树源代码。 - 修改我的设备树源码如下(根据this链接):
/dts-v1/;
/ {
...
soc {
...
pinctrl@1c20800 {
...
phandle = <0x0a>;
/* Node added by me */
gpio_wdt: gpio_wdt {
pins = "PA19";
function = "gpio_out";
phandle = <0x74>;
};
/* Node added by me */
gpio1: gpio1 {
gpio-controller;
#gpio-cells = <2>;
};
};
...
/* This node is part of original dts file which triggers internal processor watchdog*/
watchdog@1c20ca0 {
compatible = "allwinner,sun6i-a31-wdt";
reg = <0x1c20ca0 0x20>;
interrupts = <0x00 0x19 0x04>;
phandle = <0x57>;
};
...
};
...
/* Node added by me */
watchdog-gpio {
compatible = "linux,wdt-gpio";
gpios = <&gpio1 19 1>; /* PA19 should be toggled */
hw_algo = "toggle";
hw_margin_ms = <200>;
always-running;
phandle = <0x75>;
};
...
__symbols__ {
...
/* Symbol added by me */
gpiowdt = "/watchdog-gpio";
};
};
在源代码中... 描述了一些我没有修改的其他节点。
- 使用
dtc命令编译修改后的设备树。
内核运行时,我可以在UART端口的内核日志中多次看到============================。这表明正在探测我的内置 GPIO 看门狗驱动程序,但我的 PA19 引脚没有切换。
在上述情况下,我没有从dtc 编译器收到任何警告,但是如果我在watchdog-gpio 节点中替换gpio_wdt 而不是gpio1,则在编译设备树时我会从dtc 编译器收到以下警告:
警告 (gpios_property):/watchdog-gpio:在节点 /soc/pinctrl@1c20800/gpio_wdt 或错误的 phandle 中缺少属性“#gpio-cells”(来自 gpios[0])
谁能帮我找到问题?
【问题讨论】:
-
在 DTS 中看到
gpio1节点让我很困惑。如果它是生产就绪的设备树,它应该定义了 GPIO 控制器。 -
@0andriy 没有定义 gpio1,我从 dc 编译器收到此错误:ERROR (phandle_references): /watchdog-gpio: Reference to non-existent node or label "gpio1"。我不知道是什么问题。我在我的 PC ubuntu (amd64) 上编译设备树。我应该交叉编译它吗?我认为设备树不需要交叉编译。
-
我的意思是平台的原始设备树必须已经定义了GPIO控制器!
-
@0andriy,谢谢。现在问题已经解决了。
标签: linux-kernel linux-device-driver device-tree