首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux下硬件GPIO看门狗的设备树问题

Linux下硬件GPIO看门狗的设备树问题
EN

Stack Overflow用户
提问于 2020-12-02 02:55:43
回答 1查看 979关注 1票数 0

我有一个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看门狗驱动程序。

到目前为止我所做的:

  1. 在gpio-看门狗驱动程序的gpio_wdt_probe()功能中添加了gpio_wdt_probe().
  2. 与CONFIG_GPIO_WATCHDOG=y,CONFIG_GPIO_WATCHDOG_ARCH_INITCALL=y交叉编译的内核.
  3. 使用dtc分解板设备树,从dtb文件中获取设备树源代码。
  4. 修改我的设备树源代码如下(根据链接):
代码语言:javascript
运行
复制
/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):/看门狗-gpio:节点/soc/pinctrl@1c20800/gpio_wdt或坏电话中缺少的属性‘#gpio-单元’(来自gpio)

有人能帮我找到这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2020-12-03 13:36:26

最后,我找到了解决办法。

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

代码语言:javascript
运行
复制
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 (确定活动高低的标志,向上/下拉电阻连接等等,描述这里)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65101551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档