MSM8909+Android5.1.1键盘驱动---sn7326介绍

1.     Sn7326概述

SN7326是一款带智能自扫描的键盘扩展芯片,支持多达8*8个按键。按下/松开按键的动作被编码成一个字节的数据存入到按键事件寄存器(key event register)中,主控制器可通过I2C串行总线读取按键事件寄存器。

SN7326具有去抖动功能,在任何按键按下时中断输出引脚会置低,为降低功耗,在没有按键动作时SN7326自动进入低功耗模式。

SN7326的主要特性

(1)   2.4V到5.5V的工作电压

(2)   400kHz的I2C串行接口

(3)   可检测多键同时按下

(4)   低至0.3uA(VDD典型值为3.3V)的待机电流

2.     原理图设计

我们设备有qwerty键盘和简易键盘通过SN7326按键扩展芯片,再经过电平转换芯片NLSX4378连接到CPU,如下图

图1

SCL---GPIO_11

SDA---GPIO_10

KEY_INT---GPIO_98

KEY_RST---GPIO_2

KEY_UP---GPIO_90

KEY_DOWN---GPIO_91

CPU通过KEY_INT引脚知道是否按下按键,然后通过I2C读取SN7326寄存器的值来判断哪个按键按下,最后上报给系统。

3.     sn7326设备从地址

图2

A0为读写标志位,A0=0指示写命令,A0=1指示读命令。我们的设计AD1和AD0连接到VDD,所以AD1=AD0=0,故设备地址为1011000+A0位

4.     sn7326寄存器介绍

有配置寄存器和按键状态寄存器。

图3

(1)  配置寄存器(0x08)

DE位可用于控制是否使能去抖动功能。

LT位可设置长按键检测延时时间

(2)  按键状态寄存器(0x10)

DN位可判断是一个还是多个按键按下

KS位可知道按键是按下还是松开状态

KM指按键位置编码位,表示多达64个按键的编码,当读取完按键状态寄存器后(DN=0),此寄存器被设置为00000000,且/INT引脚被置高。

按键映射表如下:

图4

需要重点注意,当中断产生时,一定要读取完按键状态寄存器的值,即读取按键状态寄存器的DN位=0时,停止读取按键状态寄存器的。

5.     典型应用

5.1  上电复位

SN7326包含有一个完整上电复位电路可确保在上电时所有寄存器被复位为已知的状态,当VDD>2.4V,上电电路会释放寄存器和I2C接口可正常工作。当VDD<VPOR(2.35V),SN7326复位所有寄存器的内容为默认值。

5.2  I2C复位控制

当I2C总线被锁死时,向RST管脚发送一个低电平,可使I2C总线重置得以继续通信,此复位动作不影响中断输出。

5.3  待机模式

当总线空闲时,SN7326自动进入待机模式,降低供电电流。

5.4  按键自动扫描

SN7326能支持一个8*8矩阵键盘扫描,8个列输入端口(OD端口)需要一个100kΩ,在待机状态时8个行输入端口(PP端口)被拉低。

如果检测到键盘状态变化,键盘会在反弹延时(debounce delay)时间内扫描3次。当捕获到按键按下/松开时,按键事件被编码并写入到按键状态寄存器中,然后通过/INT产生一个中断。按照从最低编码值到最高编码值的顺序读取按键状态寄存器来报告按键事件。

/INT引脚在按键事件被读完之前一直保持为低,一种情况除外,也就是当使能自动清空/INT的功能,如果在编程时间(由08h寄存器的SD位决定)没有读取完所有的按键事件数据,在编程时间到达时/INT引脚变为高电平。但是临时按键状态寄存器将保持不变和按键事件数据可继续读出,直到检测到另一个按键检测到之前。

5.5  去抖动(debounce)

当配置寄存器(08h)的SD=0/1和键盘状态改变时,键盘第1次扫描并保存数据到临时寄存器,等待6/3ms进行第2次扫描,再等待8/4ms进行第3次扫描,如果这几次扫描结果一样,按键事件数据就锁存到临时按键状态寄存器并/INT置低,否则,扫描停止和设备返回到待机模式,没有数据存入临时按键状态寄存器和/INT保持高电平。

5.6  长按键检测(Long-pressed Key Detect)

当配置寄存器(08h)的LE=1,开启长按键功能。当有按键长按时,芯片会自动重复发送中断信号和扫描按键,知道按键松开,长按键检测的时间间隔由配置寄存器(08h)的LT位决定。

5.7  按键事件中断

一旦有按键事件码锁存到临时按键状态寄存器中,向MCU输出一个中断信号,当键盘时间读取完之前,/INT保持为低,且任何键盘状态的改变都被忽略。但一种情况除外:如果使能了/INT自动清除功能,在编程时间到达时/INT引脚变为高电平。但是临时按键状态寄存器将保持不变和按键事件数据可继续读出,直到检测到另一个按键检测到之前。

5.8  自动清除INT功能

如果配置寄存器(08h)的ACI=01/10,使能此功能。在产生中断后,就算按键状态寄存器的值没有读取完成,在5/10ms自动置高/INT。当/INT为低电平时,按键状态寄存器的数据不会改变,不管/INT为高还是低,都可以读取阿年状态寄存器的值。但如果有新的按键事件会产生新中断,新数据会写入按键状态寄出去你,旧数据将会丢失,只有新的数据才可被读取。

5.9  输入端口滤波器

配置寄出去你的DE=1,使能输入端口滤波功能。当DE=0,输入端口滤波功能关闭,芯片会对输入端口的任何变化应答。当DE=1,任何小于100ns的脉冲都会被过滤掉,如果输入脉冲宽度大于100ns,芯片将会对信号产生应答。

图5

时间: 2024-10-12 16:54:59

MSM8909+Android5.1.1键盘驱动---sn7326介绍的相关文章

MSM8909+Android5.1.1键盘驱动------概述

采用SN7326带智能指扫描的键盘扩展芯片,通过I2C接口来读取其状态寄存器的值就可知道是单按键还是多按键按下,可知道具体是哪个按键按下.然后键盘驱动调用input_event()上报linux的扫描码,比如KEY_RIGHT,然后传递给android框架层,流程如下图: 图1 下面介绍要实现键盘驱动所涉及的主要方方面面 1.     Input子系统 Linux输入设备总类繁杂,常见的包括有按键.键盘.触摸屏.鼠标.摇杆等等,他们本身就是字符设备,而linux内核将这些设备的共同性抽象出来,简

MSM8909+Android5.1.1 SPI驱动开发(PSAM部分)

MSM8909+Android5.1.1SPI驱动开发(PSAM部分) 1.     PSAM部分的硬件设计 图1 CS   片选信号 SCK  时钟信号 MISO 主设备的数据输入.从设备的数据输出脚 MOSI 主设备的数据输出.从设备的数据输入脚 2.     PSAM部分软件设计 图2 (1)  PSAM应用 这部分只需要调用API函数即可. (2)  PSAM API API的主要工作就是给M0上电.设置SPI读写模式.设置SPI读写的每字节的位数.SPI的工作频率等. (3)  SPI

【驱动】USB驱动实例&#183;串口驱动&#183;键盘驱动【转】

转自:http://www.cnblogs.com/lcw/p/3159370.html Preface USB体系支持多种类型的设备. 在 Linux内核,所有的USB设备都使用 usb_driver结构描述. 对于不同类型的 USB设备,内核使用传统的设备驱动模型建立设备驱动描述,然后映射到 USB设备驱动,最终完成特定类型的 USB设备驱动 USB驱动·入门:http://infohacker.blog.51cto.com/6751239/1226257 USB串口驱动 USB串口驱动关键

删除、卸载虚拟机之后键盘驱动无效,黄色感叹号

最近,有朋友的电脑脑突然出现只要一按键盘就无反应,可电脑其他的程序还在运行,只是键盘鼠标无任何反应.而且重启以后不动键盘,鼠标可以做任何操作.使用360系统修复后没有解决问题.查看设备管理器,发现键盘驱动显示黄色叹号!后来重装驱动,显示"驱动不存在,错误代码39",卸载之后还是依然.后来终于在网上找到了解决方法,为大家附上. 键盘驱动出现黄色感叹号解决方法: 出现问题的原因可能是因为删除虚拟机的时候导致了注册表出错,解决方法修改注册表: 打开注册表regedit: 找到 :HKEY_L

Linux GPIO键盘驱动开发记录_OMAPL138

Linux GPIO键盘驱动开发记录_OMAPL138 Linux基本配置完毕了,这几天开始着手Linux驱动的开发,从一个最简单的键盘驱动开始,逐步的了解开发驱动的过程有哪些.看了一下Linux3.3内核文件下的driver目录,点开里面的C文件,感觉底层的Linux驱动机制还是很复杂的,还需要一段漫长时间的学习.现在开发的也不能说是叫做驱动,也只能说是驱动的应用,我们学习驱动也从应用逐步开始,往里面深入吧. 0.开发准备 内核源文件(当时我们编译内核时候的目录,很重要,编译驱动的时候需要依赖

进阶项目(12)PS2键盘驱动程序设计讲解

写在前面的话 我们从小就开始接触电脑,曾经多么羡慕那些在键盘上洋洋洒洒的人,手指轻柔的飞舞,刻画出一章章美丽的篇幅…那么作为工程师的我们,同样拥有着属于我们的情怀.如果曾经的向往变成我们喜欢的玩具:如果曾经的神秘变成我们夜以继日的痴迷.那么,一切又将如何?梦翼师兄携手大家一起来欣赏.来品味. 项目需求 设计一个ps2键盘的接口驱动电路. 原理分析 ps2的接口如下图所示: 其中,1是数据线DATA: 2是预留N/C: 3是GND: 4是VCC(+5V): 5是时钟信号线CLK: 6是预留N/C:

Docker存储驱动devicemapper介绍和配置

devicemapper介绍 Device Mapper是Linux系统中基于内核的高级卷管理技术框架.Docker的devicemapper存储驱动就是基于该框架的精简置备和快照功能来实现镜像和容器的管理. 注:Device Mapper是Linux的一种技术框架,而devicemapper是Docker Engine基于Device Mapper提供的一种存储驱动. 早期的Docker运行在Ubuntu和Debian Linux上并使用AUFS作为后端存储.Docker流行之后,越来越多的的

msm8909+android5.1.1--打开调试(debug)串口

1.     共同修改的地方 (1)  kernel\arch\arm\configs\msm8909-1gb-CB03_defconfig 使以下项有效 CONFIG_SERIAL_MSM_HSL=y CONFIG_SERIAL_MSM_HSL_CONSOLE=y 增加以下项 CONFIG_DEBUG_LL=y CONFIG_EARLY_PRINTK=y (2)   Root/bootable/bootloader/lk/project/msms8909.mk 确保DEFINES += WIT

Lind.DDD敏捷领域驱动框架~介绍

最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作<N_LayerAPP>这个项目,而在这几年的项目开发用,也尝到了这种职责分享框架的甜头,但在最近的开发中,也看到了其它框架的出现,如<ABP>项目,它主张简单框架,敏捷开发,在项目引用上将核心类库和持久层进行抽象分离,复用在各位领域项目之中,这在项目整个感觉上更加简单,也更容易被人们