按键驱动 Linux内核已提供gpio按键驱动,gpio按键驱动源码都在linux内核的/drivers/input/keyboard/ 目录下gpio_keys.c 平台文件添加对按键驱动的支持: arch/mips/loongson1/ls1c/ls1c300a_openloongson_v2.0_board.c 文件中已经添加: #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) #include static struct gpio_keys_button ls1x_gpio_keys_buttons[] = { { .code = KEY_0, .gpio = 85, .active_low = 1, .desc = "0", .wakeup = 1, .debounce_interval = 10, /* debounce ticks interval in msecs */ }, { .code = KEY_1, .gpio = 86, .active_low = 1, .desc = "1", .wakeup = 1, .debounce_interval = 10, /* debounce ticks interval in msecs */ }, { .code = KEY_2, .gpio = 92, .active_low = 1, .desc = "2", .wakeup = 1, .debounce_interval = 10, /* debounce ticks interval in msecs */ }, }; static struct gpio_keys_platform_data ls1x_gpio_keys_data = { .nbuttons = ARRAY_SIZE(ls1x_gpio_keys_buttons), .buttons = ls1x_gpio_keys_buttons, .rep = 1, /* enable input subsystem auto repeat */ }; static struct platform_device ls1x_gpio_keys = { .name = "gpio-keys", .id = -1, .dev = { .platform_data = &ls1x_gpio_keys_data, } }; #endif 其中ls1x_gpio_keys_buttons[] 声明了键盘使用的gpio号和对应的键值,例如: .code = KEY_0, .gpio = 85, .active_low = 1, .desc = "0", 这里表示gpio85对应的键值为0,可以根据实际使用情况修改。KEY_0 表示键盘的0, 按键的宏定义可以参考 include/linux/input.h头文件。 键值自定义: 修改上面说明的ls1x_gpio_keys_buttons[]数组中对应的值,然后重新编译内核。 内核配置 Device Drivers ---> Input device support ---> -*- Generic input layer (needed for keyboard, mouse, ...) <*> Support for memoryless force-feedback devices <*> Polled input device skeleton <*> Sparse keymap support library .... <*> Event interface ..... [*] Keyboards ---> --- Keyboards .... <*> GPIO Buttons .... 设备 /dev/input/event0 也有可能是event1,或其他值内核启动时自动分配,可以使用 cat /proc/bus/input/devices 命令查看event对应什么驱动, 比如: N: Name="gpio-keys" 根据名字看对应的event。 简单测试 驱动正常启动后会生成/dev/input/event0设备节点,只要按下按键lcd屏幕终端会显示按键值。 注意:串口终端不会显示按键值。 或者 cat /proc/interrupts 命令查看中断信息,按键按下时对应的中断信息有所变化,如: 149: 11 LS1X-INTC 0 150: 1 LS1X-INTC 1 156: 2 LS1X-INTC 2 上层应用编程时,当作普通键盘使用即可,可以获取到键值。