Linux中pinctrl使用
一.背景
高通平台如果IO为EGPIO,需要在添加pinctrl配置成gpio模式才能正常读写;
有些场景需要切换复用的pin脚功能,需要使用pinctrl;
二.Pinctrl接口
#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
struct pinctrl *p;
struct pinctrl_state *active_state;
devm_pinctrl_get(); //获取设备的pin contro句柄;
pinctrl_lookup_state(); //根据名称查找pin control状态;
pinctrl_select_state() ; //切换到指定状态
三. 案例代码
3.1 vendor/qcom/proprietary/devicetree-4.19/qcom/bengal-pinctrl.dtsi
pogo_gpio104_active: pogo_gpio104_active {/* gpio104*/mux {pins = "gpio104";function = "gpio";};config {pins = "gpio104";bias-disable; /* No PULL */drive-strength = <2>; /* 2 MA */};}; pogo_gpio104_suspend: pogo_gpio104_suspend {/* gpio104*/mux {pins = "gpio104";function = "gpio";};config {pins = "gpio104";bias-pull-down; /* PULL DOWN */drive-strength = <2>; /* 2 MA */};};
3.2 vendor/qcom/proprietary/devicetree-4.19/qcom/bengal-qrd.dtsi
un_gpio{compatible = "qcom,un-gpio"; pinctrl-names = "pogo_active", "pogo_suspend";pinctrl-0 = <&pogo_gpio104_active>;pinctrl-1 = <&pogo_gpio104_suspend>; qcom,gpio_5v_enable = <&tlmm 104 0x00>;}
3.3 kernel/msm-4.19/drivers/un_gpio/un_gpio.c
p=devm_pinctrl_get(&pdev->dev);default_state = pinctrl_lookup_state(p, "pogo_default");suspend_state = pinctrl_lookup_state(p, "pogo_suspend");pinctrl_select_state(p,default_state); //唤醒时配置gpio模式、No pull、驱动电流2mApinctrl_select_state(p,suspend_state); //休眠时配置gpio模式、Pull down、驱动电流2mA