记一次gpio按键驱动调试经历

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

硬件去抖部分在该平台不适配,可以按如下修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值