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");