Android系统 linux内核按键驱动开发
前言
刚入门的小白,在csdn的帮助下完成了第一个按键驱动,特写此文记录学习并分享给有需要的人。
1.修改设备树.dts
我是用的开发板是rp-rk3288,Android8.1的源码。路径是rk3288-android8.1/kernel/arch/arm/boot/dts/rp-rk3288.dts。
在dts文件里面配置要使用的gpio。具体如何配置不同开发板是不一样的,可以参考同节点下其他gpio的配置,大多数都是大同小异的。
gpio_num = <&gpio5 15 GPIO_ACTIVE_LOW> : 代 表 设 置 gpio5_B7 为 低 电 平 ,.
将GPIO_ACTIVE_LOW 改成 GPIO_ACTIVE_HIGH 就是设置为高电平
gpio_function = <0>:0 代表设置为输出模式,1代表输入模式
2.创建驱动文件
在rk3288-android8.1/kernel/drivers/目录下创建目录hby,在hby下创建驱动文件hby.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/input.h>
#include <linux/irq.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/workqueue.h>
#include <linux/interrupt.h>
#include <linux/err.h>
#include <linux/gpio.h>
#include<linux/kdev_t.h>//获取一个设备的设备编号,应当使用<linux/kdev_t.h>中定义的宏
//定义输入设备指针
struct input_dev *inputdev ;
struct rk3288_key_struct {
int key_gpio;// GPIO编号
int key_code; // 按键能产生的键值
struct work_struct work; // 按键的工作队列
};
struct rk3288_key_struct keys_list[] ={
//按键列表,有多个按键就可以在这里加上
{
.key_code = KEY_BACK, .key_gpio = 167},
//{.key_code = KEY_VOLUMEUP, .key_gpio = 166},
//{.key_code = KEY_VOLUMEDOWN, .key_gpio = 223}
};
static irqreturn_t rk3288_key_intnerrupt(int irq, void *dev_id, struct pt_regs *regs){
//中断上半部分
int i=