SN7326矩阵按键功能移植与适配(一)

一.芯片原理图

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值