linux驱动 GPIO设备树例程

/dts-v1/;
 
/ {
    model = "MyDevice";
    compatible = "mycompany, mydevice-1.0";

    gpio-controller;
    #gpio-cells = <2>;

    leds {
        compatible = "gpio-leds";
 
        led1 {
            label = "My LED 1";
            gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
        };

        led2 {
            label = "My LED 2";
            gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
        };
    };
 
    gpio-keys {
        #address-cells = <1>;
        #size-cells = <0>;
        compatible = "gpio-keys";
 
        button1 {
            label = "My Button 1";
            gpios = <&gpio2 3 GPIO_ACTIVE_LOW>;
            debounce-interval = <20>;
        };

        button2 {
            label = "My Button 2";
            gpios = <&gpio3 4 GPIO_ACTIVE_LOW>;
            debounce-interval = <20>;
        };
    };
};

这个设备树描述了一个包含 2 个 LED 和 2 个按钮的设备,其中每个 LED 和按钮都使用一个 GPIO 引脚。在这个设备树中,我们定义了两个节点:ledsgpio-keys。在leds节点中,我们定义了两个LED节点:led1led2,它们分别连接到GPIO0.0和GPIO1.1引脚。在gpio-keys节点中,我们定义了两个按钮节点:button1button2,它们分别连接到GPIO2.3和GPIO3.4引脚,并设置了消抖时间为20毫秒。

注意,在这个设备树中,我们通过 gpio-controller 标记来告诉Linux内核这是一个GPIO控制器节点,并通过#gpio-cells属性告诉内核每个GPIO的描述需要2个整数值(一个用于标识GPIO控制器,另一个用于标识GPIO编号)。

在Linux设备树中,GPIO节点通常包含以下信息:

  • compatible:指定GPIO控制器的兼容性字符串,用于匹配驱动程序。
  • gpio-controller:指定该节点为GPIO控制器。
  • #gpio-cells:指定GPIO单元的数量。通常是2个或3个。如果有3个,则第一个单元表示GPIO的偏移量,第二个单元表示标志(如输入、输出、上拉等),第三个单元表示中断处理程序所需的GPIO号码。
  • reg:指定GPIO控制器的地址范围。
    gpio: gpio@e000a000 {
        compatible = "xlnx,xps-gpio-1.00.a";
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
        reg = <0xe000a000 0x1000>;
    
        gpio-leds {
            compatible = "gpio-leds";
            led0 {
                gpios = <&gpio 0 0>;
                label = "led0";
            };
            led1 {
                gpios = <&gpio 0 1>;
                label = "led1";
            };
        };
    
        button {
            compatible = "gpio-keys";
            #address-cells = <1>;
            #size-cells = <0>;
            button@0 {
                label = "button0";
                gpios = <&gpio 0 4 GPIO_ACTIVE_LOW>;
                linux,code = <64>;
            };
        };
    };
    

    在这个例子中,gpio节点定义了一个GPIO控制器,具有 xlnx,xps-gpio-1.00.a 的兼容性字符串。该节点还指定了2个GPIO单元,用于表示GPIO的偏移量和标志。此外,这个GPIO控制器还被设置为中断控制器,并指定了2个中断单元。

    在该节点下,还定义了两个子节点:gpio-ledsbutton。其中,gpio-leds 节点使用 “gpio-leds” 驱动来支持LED灯输出控制,它定义了两个子节点(led0和led1),每个子节点都连接到特定的GPIO引脚上。另一个子节点 button 使用“gpio-keys”驱动程序来支持按钮输入,并定义了一个名为 button0 的子节点,连接到特定的GPIO引脚上。此外,linux,code 属性指定了当按下此按钮时应发送到用户空间的键码值。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全职编程-叶秋然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值