IMX515+WINCE6.0 eboot的键盘部分
IMX515+WINCE6.0 eboot的键盘部分
备注:CPU BGA封装的Pad contact理解为BGA焊盘,port PIN理解为引脚
全键盘:40个
简易键盘:23个
1. 原理图及引脚设计
图1
2. I.MX515键盘控制器部分
The Keypad Port(KPP) is a 16-bit peripheral that can be used
as a keypad matrixinterface or as general purpose input/output (I/O).
键盘端口部分(KPP)是一个16位外设,可以用来作为键盘矩阵接口或是作为通用的GPIO端口。
图2
3. Eboot应用按键
Eboot中使用按键主要是进入刷机菜单,以及进行菜单项的选择。
3.1 键盘初始化所涉及的引脚寄存器配置
下面以KEY_ROW0和DISP2_DAT6为例来说明寄存器的配置。
(1) KEY_ROW0配置
1) IOMUXC_SW_MUX_CTL_PAD_KEY_ROW0
选择复用模式为ALT0模式,如下图:
图3
// Configure IOMUXto request KPP pins OAL_IOMUX_SET_MUX(g_pIOMUX, DDK_IOMUX_PIN_KEY_ROW0,DDK_IOMUX_PIN_MUXMODE_ALT0,DDK_IOMUX_PIN_SION_REGULAR);
2) 配置IOMUXC_SW_PAD_CTL_PAD_KEY_ROW0寄存器
OAL_IOMUX_SET_PAD(g_pIOMUX,DDK_IOMUX_PAD_KEY_ROW0, DDK_IOMUX_PAD_SLEW_FAST, DDK_IOMUX_PAD_DRIVE_HIGH, DDK_IOMUX_PAD_OPENDRAIN_DISABLE, DDK_IOMUX_PAD_PULL_UP_100K, DDK_IOMUX_PAD_HYSTERESIS_ENABLE, DDK_IOMUX_PAD_INMODE_NULL, DDK_IOMUX_PAD_OUTVOLT_NULL);
(2) DISP2_DAT6配置
1) IOMUXC_SW_MUX_CTL_PAD_DISP2_DAT6寄存器配置
选择ROW[4]接到DISP2_DAT6,也就是DISP2_DAT6引脚作为ROW[4]功能
图4
注意了DISP2_DAT6焊盘参与菊花链daisy chain的应用,而且SION位有强制选择DISP2_DAT6焊盘作为输入路径或是根据根据下面的MUX_MODE来选择输入路径。
2) IOMUXC_SW_PAD_CTL_PAD_DISP2_DAT6寄存器配置
OAL_IOMUX_SET_PAD(g_pIOMUX,DDK_IOMUX_PAD_DISP2_DAT6, // ROW4 DDK_IOMUX_PAD_SLEW_FAST, DDK_IOMUX_PAD_DRIVE_HIGH, DDK_IOMUX_PAD_OPENDRAIN_DISABLE, DDK_IOMUX_PAD_PULL_UP_100K, DDK_IOMUX_PAD_HYSTERESIS_ENABLE, DDK_IOMUX_PAD_INMODE_NULL, DDK_IOMUX_PAD_OUTVOLT_NULL);
3) IOMUXC_KPP_IPP_IND_ROW_4_SELECT_INPUT寄存器配置
根据图4可知,需要设置此寄存器才能确认是用DISP2_DAT6还是EIM_D28焊盘来作为ROW[4]端口的输入路径的。
图5
这里选择菊花链中焊盘来作为ROW[4]端口的输入路径,先给出数据手册的相关描述:
In some cases, more than one BGAcontact may drive a single module input pin.
Such cases require adding onemore level of IOMUXing: all these input signals are muxed and a dedicated SWcontrolled register controls the mux in order to select the required inputpath. This means that a BGA contact involved in such “Daisy Chain” situationmay require 2 SW configuration commands: one for selecting the mode for thiscontact and one for defining it as the input path.
如下图:
图6
为了更好去理解,看下图:
图7
IOMUXC_KPP_IPP_IND_ROW_4_SELECT_INPUT
OAL_IOMUX_SEL_IN(g_pIOMUX,DDK_IOMUX_SELECT_INPUT_KPP_IPP_IND_COL_6, 0x01);
设置为1,结合图5,可知DISP2_DAT6是选择EIM_D28焊盘来作为ROW[4]端口的输入路径的。有些信息可参考之前的博文http://blog.csdn.net/loongembedded/article/details/9986961
其他引脚做类似的配置即可。
3.2 键盘初始化涉及的KPP控制器初始化
(1) KPCR寄存器设置
KPCR:keypad control register,键盘控制寄存器,我们的设计是开机按下左键进入更新菜单,由图1可知左键在KEY_ROW5行KEY_COL2列,为了开机时能够检测到左键是否按下,需要配置KPCR[KRE5]=1。
键盘行列信号GPIO口的配置有一定的要求:列信号GPIO口需要配置为开漏输出,行信号要配置为输入方式,并且要配置为有中断检测功能的输入方式。
//set KEY_ROW5 isincluded in the keypad key press detect INSREG16(&g_pKPP->KPCR,CSP_BITFMASK(KPP_KPCR_KRE), CSP_BITFVAL(KPP_KPCR_KRE, 0x20)); //set columnstrobe output is open drain INSREG16(&g_pKPP->KPCR,CSP_BITFMASK(KPP_KPCR_KCO), CSP_BITFVAL(KPP_KPCR_KCO, 0xFF));
图8
(2) KDDR寄存器设置
KDDR:Keypad DataDirection Register寄存器,控制keypad端口引脚的方向(输入/输出),设置为1表示作为输出,设置为0表示作为输入,我们这里把行设置为输入,列设置为输出,可看图1,当然也可以把行设置为输出,列设置为输入,在扫描的时候做相应的处理就可以了。
INSREG16(&g_pKPP->KDDR,CSP_BITFMASK(KPP_KDDR_KCDD), CSP_BITFVAL(KPP_KDDR_KCDD, 0)); INSREG16(&g_pKPP->KDDR,CSP_BITFMASK(KPP_KDDR_KRDD), CSP_BITFVAL(KPP_KDDR_KRDD, KPP_ROW_MASK));
(3) KPSR寄存器设置
// Clear KPKD andKPSR_KPKR status flag (w1c) // Clearsynchronizer chain - KDSC (w1c) // Enable keypadinterrupt - Set KDIE, // clear KRIE(avoid false release events) OUTREG16(&g_pKPP->KPSR, (CSP_BITFVAL(KPP_KPSR_KPP_EN,KPP_KPSR_KPP_EN_ENABLE) | CSP_BITFVAL(KPP_KPSR_KPKD,KPP_KPSR_KPKD_CLEAR) | CSP_BITFVAL(KPP_KPSR_KPKR,KPP_KPSR_KPKR_CLEAR) | CSP_BITFVAL(KPP_KPSR_KDSC,KPP_KPSR_KDSC_CLEAR) | CSP_BITFVAL(KPP_KPSR_KDIE,KPP_KPSR_KDIE_INT_ENABLE) | CSP_BITFVAL(KPP_KPSR_KRIE,KPP_KPSR_KRIE_INT_DISABLE)));
详细看KPSR寄存器,
3.3 键盘扫描
Eboot下的键盘扫描可以简单一些,根据键盘扫描的原理:
我们采用逐行扫描法来实现按键检测,其中PD0-PD3作为列线,PD4-PD7作为行线。识别过程如下:
(1) 判断键盘中是否有键按下。设置所有行线为输出口,并输出低电平;设置列线为输入口,读取列线上的电平状态,只要有一列的电平为低,就表示有按键按下,并且被按下的键位于电平为低的列线与4跟行线相交叉的4个按键中,若所有列线都为高电平,表示没有按键按下;
(2) 判断被按下按键所在的位置。在确认有键按下后(进行按键消抖处理后),接下来就是确定具体哪个案件被按下,方法是:依次将每根行线设置为输出口,并输出低电平(同时剩余行线输出高电平),然后逐列检查每根列线的电平状态,若某列为低电平,则该列线与设置为输出低电平的行线交叉处的按键就是被按下的按键。
(3) 按键位置确定后,接下来就要给矩阵键盘中的每个按键进行编号,也就是进行按键编码,程序设计中常用计算法和查表法两种方式对按键进行编码,本实例采用计算法编码。
主要通过读取KPDR的值来判断即可,键盘配置及扫描的推荐操作如下:
图9