linux pinctrl&gpio


gpio

reference
其实就是一些函数,在程序中调用即可:

  • gpio_is_valid(PIN_NUM)
  • gpio_request(PIN_NUM,PIN_NAME);
  • gpio_set_value(PIN_NUM,bool);
  • gpio_get_value(PIN_NUM);
  • gpio_direction_output(PIN_NUM,bool);
  • gpio_direction_input(PIN_NUM);

pinctrl

设备树中

在设备树中,需要添加pinctrl节点。
1、在最终的dtsi文件中添加pinctrl节点:

a{
    a_active: a_active {
        mux {
            pins = "gpio61";
        };
        config {
            pins = "gpio61";
        };
    };
    a_suspend: a_suspend {
        mux {
            pins = "gpio61";
    };
        config {
            pins = "gpio61";
    	};
    };
};

2、在设备节点中引用,如果默认pinctrl名字是"default",则不需要在驱动中使用api初始化:

b@43200 {
    compatible = "qcom,b";
    reg = <0x43200 200>;
    pinctrl-names = "default";
    pinctrl-0 = <&a_active>;
};

3、1中的内容如果写在msm8953_pinctrl.dtsi中,则在2中的pinctrl名字无论是什么都会默认初始化
4、如果1中内容写在最终的dtsi中,2中的pinctrl名字也是自定义,则需要使用api初始化,这样做同时可以动态改变pin的状态。

驱动中调用方式

p = devm_pinctrl_get(dev);
s = pinctrl_lookup_state(p, "pinctrl-name");
ret = pinctrl_select_state(p,s);

//对于default状态下的引脚配置,不需要调用这个函数:
devm_pinctrl_get_select(dev,"pinctrl-name");
posted @ 2021-12-23 15:27  月的光景  阅读(209)  评论(0编辑  收藏  举报