Linux有标准的gpio按键驱动
sprd平台只需配置下dts,在mt6761平台(gpio配置成gpio模式)也验证了该驱动。
gpio-keys {
key-volumedown {
label = "Volume Down Key";
linux,code = <KEY_VOLUMEDOWN>;
gpios = <&ap_gpio 124 GPIO_ACTIVE_LOW>;
debounce-interval = <2>;
wakeup-source;
}
};
在mt6580也按相同的方式配置后,dws中将gpio配置成irq模式,发现触发不了按键中断。cat pin查下gpio模式,发现gpio不是irq模式,那需要改造gpio_keys.c文件了。加入如下修改
gpio-keys {
compatible = "gpio-keys";
pinctrl-names = "up_cfg","down_cfg";
pinctrl-0 = <&up_cfg>;
pinctrl-1 = <&down_cfg>;
key-volumeup {
label = "Volume Up Key";
linux,code = <115>;
debounce-interval = <5>;
gpios = <&pio 67 1>;
};
key-volumedown {
label = "Volume Down Key";
linux,code = <114>;
debounce-interval = <5>;
gpios = <&pio 64 1>;
};
};
&pio {
down_cfg: down_cfg {
down_cfg {
pinmux = <PINMUX_GPIO64__FUNC_EINT0>;
slew-rate = <0>;
bias-pull-up =<00>;
};
};
up_cfg: up_cfg {
up_cfg {
pinmux = <PINMUX_GPIO67__FUNC_EINT3>;
slew-rate = <0>;
bias-pull-up =<00>;
};
};
};
gpio_keys.c的probe函数
struct pinctrl_state *pin_state;
static struct pinctrl *pinctrl;
pinctrl = devm_pinctrl_get(&pdev->dev);
if (IS_ERR_OR_NULL(pinctrl)) {
pr_err("%s(): Pinctrl not defined", __func__);
}else {
pr_info("%s(): Using Pinctrl", __func__);
pin_state = pinctrl_lookup_state(pinctrl,"up_cfg");
if (IS_ERR_OR_NULL(pin_state)) {
dev_err(&pdev->dev,"pinctrl lookup failed for default state");
}else{
pinctrl_select_state(pinctrl,pin_state);
}
pin_state = pinctrl_lookup_state(pinctrl,"down_cfg");
if (IS_ERR_OR_NULL(pin_state)) {
dev_err(&pdev->dev, "pinctrl lookup failed for sleep state");
}else{
pinctrl_select_state(pinctrl,pin_state);
}
}
硬件去抖部分在该平台不适配,可以按如下修改