【问题标题】:Device tree issue for Hardware GPIO Watchdog in LinuxLinux 中硬件 GPIO 看门狗的设备树问题
【发布时间】: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 看门狗驱动程序。

到目前为止我做了什么:

  1. printk("============================\n");添加到gpio-watchdog驱动的gpio_wdt_probe()功能。
  2. 使用 CONFIG_GPIO_WATCHDOG=yCONFIG_GPIO_WATCHDOG_ARCH_INITCALL=y 的交叉编译内核。
  3. 反编译板设备树使用dtcdtb文件中获取设备树源代码。
  4. 修改我的设备树源码如下(根据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";
    };
};

在源代码中... 描述了一些我没有修改的其他节点。

  1. 使用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


【解决方案1】:

最终,我找到了解决方案。

gpio1gpio_wdt 的定义都没有用。我删除了这些定义并修改了watchdog-gpio节点中的gpios属性如下:

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>;       
    };

其中:0x0apinctrl@1c20800节点的phandle,0对应PortA(对于PortC插入2,对于PortD插入3等等),19是pin数字和 1 对应 GPIO 标志 GPIO_ACTIVE_LOW(标志,确定高电平有效或低电平有效,上拉/下拉电阻连接等,描述here)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多