MYD-SAMA5D3X有4个用户按键,分别是RESET,wakeup,cs-boot,user。浏览driver/input/keyboard目录,发现gpio-keys.c其功能是实现了通用的gpio按键。再去看了下DTS,发现DTS中有对gpio-keys的引用,新的内核不需要自己编写输入子系统驱动,可以通过配置DTS直接解决按键问题。下面是实验笔记及本人的一些理解。 (1)确定GPIO管脚 通过查看MYD-SAMA5D3X的原理图可以看到,MYD-SAMA5D3X的4个按键原理图如下:
( 2)查看原有的dts配置
进行DTS文件修改之前可以阅读下内核相关文档,在Documentation/devicetree/目录下有很多关于devicetree的记载,其实,这些第一手的资料才是最具参考价值的资料。sama5d3mb.dtsi 代码片段如下: [mw_shl_code=c,true]/* Added by MYIR, gpio key on main board */
gpio_keys {
compatible = "gpio-keys";
#address-cells = <1>;
#size-cells = <0>;
pb_user1 {
label = "pb_user1";
gpios = <&pioE 29 0>;
linux,code = <158>;
gpio-key,wakeup;
};
};[/mw_shl_code] 其中,linux,code后面对应的是linux标准的键值,可以在linux系统中找到,路径是:/usr/include/linux/input.h。由于我要操作的user gpio-keys驱动将按键事件映射到了/dev/input/event1设备节点上,因此,由于linux的input_event事件定义如下: [mw_shl_code=c,true]struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};[/mw_shl_code] 对于一些通用的功能,可以不修改内核源码、不重新编译内核,仅修改dts配置就能实现所需的功能,如这里的gpio按键功能。dts方式启动内核有着巨大的优势, 例程代码在附件中可以尝试测试gpio-key功能实现。
|