一.芯片原理图
1.1 行列扫描:
行扫描:
OD0-OD7 输出高电平、PP0-PP7输出低电平。侦测OD0-OD7若有按键按下,
则所在列形成通路即有低电平产生;
列扫描:
PP0-PP7输出高电平、OD0-OD7输出低电平。侦测PP0-PP7若有按键按下,
则所在行形成通路即有低电平产生;
产生低电平的行、列 交集即对应按键;
1.2 寄存器介绍
二.控制逻辑
2.1 初始化
解析rst gpio 设置输出,拉高、拉低、拉高操作;
解析int gpio 设置输入、中断pin;声明支持的按键事件;
配置寄存器0x08:0x50
0101 0000= 0 00 1 0 0 00 :无自动清除、输入端去抖使能、去抖时间2倍、关闭长按键;
注册中断处理函数:
key_interrupt_handler()->key_read_device_info()->
key_i2c_read_register()
2.2 按键中断函数
从0x10寄存器读取编码值:
判断bit7位置是否为1:
若为1,说明有多个按键按键按下,只有fn,up,down这3个按键其中一个按下时才上报键值;
为防止过多按键同时按下导致IRQ函数无法及时Return,只支持2个按键同时按下,
按键数>2时则强行退出中断函数;
若为0,说明只有1个按键按下,无条件上报键值;
2.3 代码健壮性
代码要有异常处理分支即
输入的按键值是无效的,IRQ要正常正常return。
三.Code时使用的API接口
3.1 声明支持按键事件
set_bit(EV_KEY, button_dev.evbit)
3.2 注册输入设备函数
int input_register_device(struct input_dev *dev)
3.3 上报事件
上报按键事件
input_report_key(struct input_dev *dev, unsigned int code, int value);
上报相对坐标事件
input_report_rel(struct input_dev *dev, unsigned int code, int value);
上报绝对坐标事件
input_report_abs(struct input_dev *dev, unsigned int code, int value);
声明驱动上报哪些信息
input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code)
3.4 通知输入子系统进行同步
input_sync(struct input_dev *dev);
四.代码移植架构
4.1展锐UIS7885+A13
bsp/modules/kernel5.4/input/sn7326/
bsp/kernel/kernel5.4/arch/arm64/boot/dts/sprd/uis7863-6h10-overlay.dts
bsp/bootloader/u-boot15/include/linux/input.h //定义键值
bsp/bootloader/u-boot15/board/spreadtrum/uis7863_6h10/pinmap-uis7863_6h10.c
bsp/bootloader/u-boot15/arch/arm/include/asm/arch-qogirl6/pinmap.h
4.2 编译
cd bsp/;
源码:build/envsetup.sh;lunch uis7863_6h10_Natv-userdebug-androids
编译:make modules -m sn7326_i2c.ko
输出:bsp/out/androids/uis7863_6h10_Natv/dist/modules/archive/sn7326_i2c.ko
运行:vendor_dlkm/lib/modules/sn7326_i2c.ko