(注:本文仅仅用于个人理顺代码流程思路)
手机物理按键驱动文件分析:
一、GPIO的DTS文件,代码段如下所示:
/*gpio口的DTS定义*/
gpio_keys {
status = "okay";
compatible = "gpio-keys";
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&key_home &key_voldown &key_volup &key_power>;
button@1 {
label = "gpio-keys: KEY_HOMEPAGE";
interrupts = <4 0 0>;
interrupt-parent = <&gpa1>;
linux,code = <172>;
gpios = <&gpa1 4 0xf>;
gpio-key,wakeup = <1>;
};
button@2 {
label = "gpio-keys: KEY_VOLUMEDOWN";
interrupts = <6 0 0>;
interrupt-parent = <&gpa1>;
linux,code = <114>;
gpios = <&gpa1 6 0xf>;
};
button@3 {
label = "gpio-keys: KEY_VOLUMEUP";
interrupts = <5 0 0>;
interrupt-parent = <&gpa1>;
linux,code = <115>;
gpios = <&gpa1 5 0xf>;
};
button@4 {
label = "gpio-keys: KEY_POWER";
interrupts = <0 0 0>;
interrupt-parent = <&gpa0>;
linux,code = <116>;
gpios = <&gpa0 0 0xf>;
gpio-key,wakeup = <1>;
};
};
二、驱动文件gpio_keys.c:
几个重要的结构体:
/*该结构体用来定义GPIO的按键功能*/
struct gpio_keys_platform_data {
struct gpio_keys_button *buttons; //指向gpio_keys_button结构体数组,用于按键的参数设置
int nbuttons; //按键数组内元素个数
unsigned int poll_interval; //轮询时间间隔
unsigned int rep:1; //自动重复使能输入子系统
int (*enable)(struct device *dev);
void (*disable)(struct device *dev);
const char *name; //输入设备名
};
/*用来关联input系统*/
struct gpio_keys_drvdata {
const struct gpio_keys_platform_data *pdata;
struct input_dev *input;
struct mutex disable_lock;
struct gpio_button_data data[0];
};
/**
* struct gpio_keys_button - configuration parameters
* @code: input event cod