我有一个OrangePi PC +板,运行Linux (ubuntu18.04),内核为4.19.57,在Allwinner H3处理器上运行。
利用STWD100专用集成电路设计了一种硬件看门狗。这个IC有一个gpio,应该至少每秒钟切换一次,否则它会重置板。另一方面,我在谷歌上搜索了这个主题,我意识到Linux内核有一个名为GPIO看门狗的驱动程序(在driver /wdt.c狗/gpio_wdt.c文件中)。
由于项目的需要,看门狗GPIO连接到处理器的引脚PA19,一旦内核被解压缩和执行,或者板被STWD100强制重新引导,就应该开始切换。为了使问题更加复杂,我要补充一点,我们不能做任何电路修改。为了防止STWD100在内核加载之前重置我们的板,我们有一个定时器,它使STWD100暂停5~8秒,并且不能改变这个时间间隔(因为它在电路中是固定的)。因此,一旦将控制传递给内核,我们就应该在Linux内核中运行GPIO看门狗驱动程序。
到目前为止我所做的:
gpio_wdt_probe()
功能中添加了gpio_wdt_probe()
.dtc
分解板设备树,从dtb
文件中获取设备树源代码。/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):/看门狗-gpio:节点/soc/pinctrl@1c20800/gpio_wdt或坏电话中缺少的属性‘#gpio-单元’(来自gpio)
有人能帮我找到这个问题吗?
发布于 2020-12-03 13:36:26
最后,我找到了解决办法。
gpio1
和gpio_wdt
的定义都没有用。我删除了这些定义并修改了watchdog-gpio
节点中的watchdog-gpio
属性,如下所示:
watchdog-gpio {
compatible = "linux,wdt-gpio";
gpios = <0x0a 0 19 1>; /* PA19 should be toggled */
hw_algo = "toggle";
hw_margin_ms = <200>;
always-running;
phandle = <0x75>;
};
其中: 0x0a是pinctrl@1c20800节点的信标,0对应于PortA ( PortC insert 2,PortD insert 3等),19是引脚号,1对应GPIO标志GPIO_ACTIVE_LOW (确定活动高低的标志,向上/下拉电阻连接等等,描述这里)。
https://stackoverflow.com/questions/65101551
复制相似问题