`
hyshucom
  • 浏览: 802849 次
文章分类
社区版块
存档分类
最新评论

6410修改键盘驱动 自定义6*5矩阵键盘

 
阅读更多

根据需要,需要搞一个6*5的矩阵键盘,6行5列。行接的是GPIOK8~GPIOK13,列接的是GPIOL0~GPIOL4

研究了一下6410的键盘驱动后,修改如下:

一、 添加按键定义

添加“扫描”按键的定义。

1、在C:\WINCE600\OSDesigns\S3C6410_DEMO\S3C6410_DEMO\SDKs\SDK1\obj\TE6410Board\Include\ARMV4I\winuser.h文件中添加如下定义:(橙色字体部分)

#define VK_CLEAR          0x0C
#define VK_RETURN         0x0D
// *** [SOF] you add ***
#define VK_SCAN           0x0E
// *** [EOF] you add ***

2、在C:\WINCE600\PUBLIC\COMMON\SDK\INC\winuserm.h文件中同样添加如下定义:(橙色字体部分)

// ***
// *** [SOF] you disable ***
//#define VK_TSTAR    VK_F8               // *           
//#define VK_TPOUND   VK_F9               // #   
// *** [EOF] you disable ***
// ***

// ***
// *** [SOF] you add ***
#define VK_TSTAR    L'*'               // *           
#define VK_TPOUND   L'#'               // #   
// *** [EOF] you add ***
// ***

// App keys
#define VK_APP1     0xC1 
#define VK_APP2     0xC2 
#define VK_APP3     0xC3
#define VK_APP4     0xC4
#define VK_APP5     0xC5
#define VK_APP6     0xC6

// *** [SOF] you add ***
// Scan key
#define VK_SCAN           0x0E
// *** [EOF] you add ***

3、添加按键类型定义:

在C:\WINCE600\PLATFORM\SMDK6410\SRC\INC\bsp_cfg.h文件中添加定义:(具体可参考驱动目录下的bsp_cfg.h文件)

#define LAYOUT3                (3)        // Self Define Key	// *** you add ***
//#define MATRIX_LAYOUT        (LAYOUT1)	// *** you disable ***
#define MATRIX_LAYOUT        (LAYOUT3)		// *** you add ***

二、 添加虚拟按键映射

主要操作C:\WINCE600\PLATFORM\SMDK6410\src\drivers\Keybd\Matrix_0409\.\s3c6410_layout.cpp文件。具体可参考驱动目录下相应的文件。

1、扫描键值映射虚拟按键定义:(如下)

// *** [SOF] you add ***
#elif (MATRIX_LAYOUT == LAYOUT3)
#define ScanCodeTableFirst  0x00
#define ScanCodeTableLast   0x1d

UINT8 ScanCodeToVKeyTable[] =
{
	VK_RETURN,			// scan code 0		// 确定、回车
	VK_SCAN,			// scan code 1		// 扫描
	VK_ESCAPE,			// scan code 2		// 取消
	VK_DELETE,			// scan code 3		// 删除
	VK_BACK,			// scan code 4		// 退格
	VK_UP,				// scan code 5		// 上
	VK_RIGHT,			// scan code 6		// 右
	VK_DOWN,			// scan code 7		// 下
	VK_LEFT,			// scan code 8		// 左
	VK_TEND,			// scan code 9		// 结束通话
	VK_TTALK,			// scan code 10		// 通话
	VK_T3,				// scan code 11		// 3
	VK_T2,				// scan code 12		// 2
	VK_T1,				// scan code 13		// 1
	VK_T6,				// scan code 14		// 6
	VK_T5,				// scan code 15		// 5
	VK_T4,				// scan code 16		// 4
	VK_T9,				// scan code 17		// 9
	VK_T8,				// scan code 18		// 8
	VK_T7,				// scan code 19		// 7
	VK_TPOUND,			// scan code 20		// #
	VK_T0,				// scan code 21		// 0
	VK_TSTAR,			// scan code 22		// *
	VK_SPACE,			// scan code 23		// 空格
	VK_F1,				// scan code 24		// F1
	0,					// scan code 25
	0,					// scan code 26
	0,					// scan code 27
	0,					// scan code 28
	0,					// scan code 29
};
// *** [EOF] you add ***

2、添加ScanCodeToVKeyExtTable定义:(如下)

// *** [SOF] you add ***
#elif (MATRIX_LAYOUT == LAYOUT3)
#define ScanCodeTableExtFirst  0xE000
#define ScanCodeTableExtLast   0xE01d

UINT8 ScanCodeToVKeyExtTable[] =
{ 
	VK_RETURN,			// scan code 0		// 确定、回车
	VK_SCAN,			// scan code 1		// 扫描
	VK_ESCAPE,			// scan code 2		// 取消
	VK_DELETE,			// scan code 3		// 删除
	VK_BACK,			// scan code 4		// 退格
	VK_UP,				// scan code 5		// 上
	VK_RIGHT,			// scan code 6		// 右
	VK_DOWN,			// scan code 7		// 下
	VK_LEFT,			// scan code 8		// 左
	VK_TEND,			// scan code 9		// 结束通话
	VK_TTALK,			// scan code 10		// 通话
	VK_T3,				// scan code 11		// 3
	VK_T2,				// scan code 12		// 2
	VK_T1,				// scan code 13		// 1
	VK_T6,				// scan code 14		// 6
	VK_T5,				// scan code 15		// 5
	VK_T4,				// scan code 16		// 4
	VK_T9,				// scan code 17		// 9
	VK_T8,				// scan code 18		// 8
	VK_T7,				// scan code 19		// 7
	VK_TPOUND,			// scan code 20		// #
	VK_T0,				// scan code 21		// 0
	VK_TSTAR,			// scan code 22		// *
	VK_SPACE,			// scan code 23		// 空格
	VK_F1,				// scan code 24		// F1
	0,					// scan code 25
	0,					// scan code 26
	0,					// scan code 27
	0,					// scan code 28
	0,					// scan code 29
};
// *** [EOF] you add ***

三、 添加扫描按键相关处理

主要操作C:\WINCE600\PLATFORM\SMDK6410\src\drivers\Keybd\keypad\.\keymatrix.cpp文件。(具体参考驱动下面相应的文件)

1、添加不同类型键盘的行列定义:(橙色字体部分为需要添加或修改的)

#if ((MATRIX_LAYOUT == LAYOUT0)||(MATRIX_LAYOUT == LAYOUT2))   //***********************  modify by alexlee	// *** you enable ***
//#if 1		// *** you disable ***
#define SIZE_BITS   8
#define SIZE_COLS   8
#define SIZE_ROWS   8
#elif (MATRIX_LAYOUT == LAYOUT1)
#define SIZE_BITS   2
#define SIZE_COLS   5
#define SIZE_ROWS   2
// *** [SOF] you add ***
#elif (MATRIX_LAYOUT == LAYOUT3)
#define SIZE_BITS   6
#define SIZE_COLS   5
#define SIZE_ROWS   6
// *** [EOF] you add ***
#endif


2、添加扫描键值定义:(橙色字体部分为需要添加或修改的)

#if (MATRIX_LAYOUT == LAYOUT0) //*************  modify by alexlee	// *** you enable ***
//#if (1)	// *** you disable *** 
struct KSTATE KeyChange[SIZE_KEY];
struct KCODE KeyCode[SIZE_KEY] =
{
    {KCODE_TYPE_NORMAL , 0x0000 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0001 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0002 , 0, 0},
…省略N多,具体请看相应的文件

// *** [SOF] you add ***
#elif (MATRIX_LAYOUT == LAYOUT3)
struct KSTATE KeyChange[SIZE_KEY];
struct KCODE KeyCode[SIZE_KEY] =
{
    {KCODE_TYPE_NORMAL , 0x0000 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0001 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0002 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0003 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0004 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0005 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0006 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0007 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0008 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0009 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x000a , 0, 0},
    {KCODE_TYPE_NORMAL , 0x000b , 0, 0},
    {KCODE_TYPE_NORMAL , 0x000c , 0, 0},
    {KCODE_TYPE_NORMAL , 0x000d , 0, 0},
    {KCODE_TYPE_NORMAL , 0x000e , 0, 0},
    {KCODE_TYPE_NORMAL , 0x000f , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0010 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0011 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0012 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0013 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0014 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0015 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0016 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0017 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0018 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x0019 , 0, 0},
    {KCODE_TYPE_NORMAL , 0x001a , 0, 0},
    {KCODE_TYPE_NORMAL , 0x001b , 0, 0},
    {KCODE_TYPE_NORMAL , 0x001c , 0, 0},
    {KCODE_TYPE_NORMAL , 0x001d , 0, 0}
};
// *** [EOF] you add ***
#endif

3、添加上电初始化处理:

在BOOL KeyMatrix::KeybdPowerOn()函数中,添加修改如下:(橙色字体部分为修改或添加部分)

#if ((MATRIX_LAYOUT == LAYOUT0)||(MATRIX_LAYOUT == LAYOUT2))   //***********   modify by AlexLee 	// *** you enable ***
//#if 1		// *** you disable ***
    pKeyPadReg->KEYIFCOL = (0x00<<8);
#elif (MATRIX_LAYOUT == LAYOUT1)
    pKeyPadReg->KEYIFCOL = (0x7<<8);
// *** [SOF] you add ***
#elif (MATRIX_LAYOUT == LAYOUT3)
	pKeyPadReg->KEYIFCOL = (0x00<<8);	// *** *** not make sure *** ***
// *** [EOF] you add ***
#endif

4、修改GPIO_CtrlHandler函数中的处理:

修改static void GPIO_CtrlHandler(ENUM_COL_ROWiClass, ENUM_GPIO_FUNC iLevel)函数。(橙色字体部分为修改或添加部分)

#if ((MATRIX_LAYOUT == LAYOUT0)||(MATRIX_LAYOUT == LAYOUT2))  //***********   modify by AlexLee		// *** you enable ***
//#if 1	// *** you disable ***

中间部分省略。。。
// *** [SOF] you add ***
#elif (MATRIX_LAYOUT == LAYOUT3)
    if(iClass == ENUM_COL)    // Column setting
    {
        switch(iLevel)
        {
        case ENUM_INPUT :
            pGPIOReg->GPLCON0=
                (pGPIOReg->GPLCON0 & ~(0xfffff<<0)) | (0x00000<<0);    //KBC_0(GPL0)~ KBC_4(GPL4)
            break;
        case ENUM_OUTPUT :
            pGPIOReg->GPLCON0=
                (pGPIOReg->GPLCON0 & ~(0xfffff<<0)) | (0x11111<<0);    //KBC_0(GPL0)~ KBC_4(GPL4)
            break;
        case ENUM_AUXFUNC :
            pGPIOReg->GPLCON0=
                (pGPIOReg->GPLCON0 & ~(0xfffff<<0)) | (0x33333<<0);    //KBC_0(GPL0)~ KBC_4(GPL4)
            break;
        default :    //ENUM_RESERVED
            pGPIOReg->GPLCON0=
                (pGPIOReg->GPLCON0 & ~(0xfffff<<0)) | (0x44444<<0);    //KBC_0(GPL0)~ KBC_4(GPL4)
            break;
        }
    }
    else if(iClass == ENUM_ROW)        // Row Setting
    {
        switch(iLevel)
        {
        case ENUM_INPUT :
            pGPIOReg->GPKCON1=
                (pGPIOReg->GPKCON1 & ~(0xffffff<<0)) | (0x000000<<0);    //KBR_0(GPK8)~ KBR_5(GPK13)
            break;
        case ENUM_OUTPUT :
            pGPIOReg->GPKCON1=
                (pGPIOReg->GPKCON1 & ~(0xffffff<<0)) | (0x111111<<0);    //KBR_0(GPK8)~ KBR_5(GPK13)
            break;
        case ENUM_AUXFUNC :
            pGPIOReg->GPKCON1=
                (pGPIOReg->GPKCON1 & ~(0xffffff<<0)) | (0x333333<<0);    //KBR_0(GPK8)~ KBR_5(GPK13)
            break;
        default :    //ENUM_RESERVED
            pGPIOReg->GPKCON1=
                (pGPIOReg->GPKCON1 & ~(0xffffff<<0)) | (0x444444<<0);    //KBR_0(GPK8)~ KBR_5(GPK13)
            break;
        }
    }
    else
    {
        DEBUGMSG(1,(TEXT("Invalid Parameter\r\n")));
    }
// *** [EOF] you add ***
#endif
}

5、修改KEYIF_Column_Bitset函数中的处理:

修改tatic void KEYIF_Column_Bitset(bool bVal, int cIdx)函数中的处理:(橙色字体部分为修改或添加部分)

static void KEYIF_Column_Bitset(bool bVal, int cIdx)
{
#if ((MATRIX_LAYOUT == LAYOUT0)||(MATRIX_LAYOUT == LAYOUT2)) //***********   modify by AlexLee	// *** you enable ***
//#if 1		// *** you disable ***
    if(bVal)
    {
        pKeyPadReg->KEYIFCOL = pKeyPadReg->KEYIFCOL | (0x1 << cIdx);
    }
    else
    {
        pKeyPadReg->KEYIFCOL = pKeyPadReg->KEYIFCOL | (0xff & ~(0x1 << cIdx));
    }
#elif (MATRIX_LAYOUT == LAYOUT1)
    if(bVal)
    {
        pKeyPadReg->KEYIFCOL = pKeyPadReg->KEYIFCOL | (0x1 << (cIdx+3));
    }
    else
    {
        pKeyPadReg->KEYIFCOL = pKeyPadReg->KEYIFCOL | (0xff & ~(0x1 << (cIdx+3)));
    }
// *** [SOF] you add ***
#elif (MATRIX_LAYOUT == LAYOUT3)
    if(bVal)
    {
        pKeyPadReg->KEYIFCOL = pKeyPadReg->KEYIFCOL | (0x1 << cIdx);	// *** not make sure ***
    }
    else
    {
        pKeyPadReg->KEYIFCOL = pKeyPadReg->KEYIFCOL | (0xff & ~(0x1 << cIdx));	// *** not make sure ***
    }
// *** [EOF] you add ***
#endif
}

6、修改为自定义按键键码映射:修改_KScan_ProcState函数

把以下这几句:

keybd_event(0x30+idx ,0x30+idx, 0, 0);
Sleep(1);
keybd_event(0x30 + idx ,0x30 + idx, KEYEVENTF_KEYUP, 0);
修改成:
if(ScanCodeToVKeyTable[idx] == VK_TPOUND){// #
	// 模拟 key down
	keybd_event(VK_SHIFT, 0, 0, 0);
	keybd_event(VK_T3, 0, 0, 0);
	Sleep(1);
	// 模拟 key up
	keybd_event(VK_T3, 0, KEYEVENTF_KEYUP, 0);
	keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
}
else if(ScanCodeToVKeyTable[idx] == VK_TSTAR){// *
	// 模拟 key down
	keybd_event(VK_SHIFT, 0, 0, 0);
	keybd_event(VK_T8, 0, 0, 0);
	Sleep(1);
	// 模拟 key up
	keybd_event(VK_T8, 0, KEYEVENTF_KEYUP, 0);
	keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
}
else{
	keybd_event(ScanCodeToVKeyTable[idx] ,idx, 0, 0);
	Sleep(1);
	keybd_event(ScanCodeToVKeyTable[idx] ,idx, KEYEVENTF_KEYUP, 0);
}

当然,在该函数前头要添加引用外部变量:(由于该处引用到了按键键值,所以需要添加头文件:#include"winuserm.h"

extern UINT8 ScanCodeToVKeyTable[];

注意:应用层再使用到*和#这两个按键的时候,需要对应到VK_TSTAR和VK_TPOUND键值



到这里基本结束了,编译一下这个键盘驱动就OK。


上述已经测试通过,在此备忘一下。

分享到:
评论

相关推荐

    驱动max7360驱动linux驱动max7360例子demo亲测可用

    一个用c语言写的驱动max7360...我的max7360器件地址是0x70,通过7360连接了矩阵键盘,此程序读取max7360的按键准确无误,寄存器配置可以自定义和修改,c语言编写,linux下编译,单片机驱动max7360也可以参考非常接近,

    基于NIOSⅡ的矩阵键盘和液晶显示外设组件的设计

    本文提出了一种针对LCD控制器和矩阵键盘的IP核的设计方法。该方法利用SOPC Builder中元件编辑器Create New Component,通过自定义逻辑方法在SOPC设计中添加自己开发的液晶显示模块和键盘IP核。该控制器具有Avalon...

    Mini 身材 Arduino 机器键盘设计(原理图、主要代码)-电路方案

    同时兼容Arduino硬件和市面上的客制化机械键盘驱动,GH60布局。Arduino带来高度的可玩性,入门难度低,全部按键随心自定义,宏也是信手拈来。更可贵的是带有特色波轮,能进行各种快捷操作,同时特别的背光设计也能...

    易语言程序免安装版下载

    6) 修改MYSQL支持库跨静态编译的EXE和DLL传递连接句柄和记录集句柄无效的BUG(改动较大,可能会产生兼容性问题,我们已经仔细测试,也请使用到此库的用户帮助我们多多测试,以便及早发现问题,谢谢) 7) 其它修改 ...

    uchroma:Linux中Razer Chroma硬件的高级驱动程序

    带有LED矩阵的设备包括几个自定义效果,更多 丰富的动画/帧缓冲API,用于创建自定义效果 针对低功耗进行了优化 简单的安装和设置 强大的命令行界面 D-Bus API 100%异步供电的Python,100%开源(LGPL) 安装 的...

    CVAVR教程---实习教学指导书

    十四4×4矩阵键盘的使用(M34- M37) 十五 异步通信(M38) 十六 模拟比较器(M39) 十七 常数设置(M40) 十八 教学演示综合测试程序(M41- M42) 十九 AVR毕业论文参考课题 二十 AVR毕业论文参考框架 附图1:实习...

    AVR单片机实习教学指导书.doc

    十四4×4矩阵键盘的使用(M34- M37) 十五 异步通信(M38) 十六 模拟比较器(M39) 十七 常数设置(M40) 十八 教学演示综合测试程序(M41- M42) 十九 AVR毕业论文参考课题 二十 AVR毕业论文参考框架 附图1:实习...

    AVR单片机 实习教学指导书

    十四4×4矩阵键盘的使用(M34- M37) 十五 异步通信(M38) 十六 模拟比较器(M39) 十七 常数设置(M40) 十八 教学演示综合测试程序(M41- M42) 十九 AVR毕业论文参考课题 二十 AVR毕业论文参考框架 附图1:实习...

    citect7.0 用户指南

    使用设备驱动程序、使用 Citect.ini 参数自定义通讯、使用磁盘 I/O 设备. 调试 I/O 设备和协议、高级驱动程序信息.、使用远程设备通过调制解调器通讯 Chapter: 16 标签过程变量 标签命名、配置本地变量、配置变量...

    LY-51S 开发板函数集使用手册

    四、 矩阵按键扫描函数 1、KeyScan-------键盘扫描函数,使用行列反转扫描法 2、KeyPro--------------按键值处理函数,返回扫键值 五、 独立按键检测函数 1、KeyCheck---------------------独立按键扫描函数 六、 I2...

    VC与Labview、Matlab编程论文资料[2].rar

    VC_6_0和Matlab编程矩阵电路程序.pdf VC_6_0实现客户端与服务器端通讯.pdf VC_6_0实现计算方法中的曲线拟合.pdf VC_6_0读写Access数据库中图像字段的方法研究.pdf VC_6_0通过ADO连接数据库的通用方法研究.pdf VC_SQL...

    VC与Labview、Matlab编程论文资料

    VC_6_0和Matlab编程矩阵电路程序.pdf VC_6_0实现客户端与服务器端通讯.pdf VC_6_0实现计算方法中的曲线拟合.pdf VC_6_0读写Access数据库中图像字段的方法研究.pdf VC_6_0通过ADO连接数据库的通用方法研究.pdf VC_SQL...

    VC与Labview、Matlab编程论文资料[4].rar

    VC_6_0和Matlab编程矩阵电路程序.pdf VC_6_0实现客户端与服务器端通讯.pdf VC_6_0实现计算方法中的曲线拟合.pdf VC_6_0读写Access数据库中图像字段的方法研究.pdf VC_6_0通过ADO连接数据库的通用方法研究.pdf VC_SQL...

    JAVA上百实例源码以及开源项目源代码

    发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器  Tcp服务端与客户端的JAVA实例源代码,一个简单...

    Delphi 6集成开发环境

    1.2.4 CPU 观察窗口.................................6 1.2.5 对象浏览器......................................7 1.3.1 编程环境设置..................................7 1.3.2 自定义工具栏......................

    Java范例开发大全 (源程序)

     实例126 将由键盘中录入的信息保存到文件中 176  实例127 一个文件变成多个小文件 178  实例128 多个小文件合成一个文件 181  实例129 统计指定文件中的字符个数 183  实例130 对象的序列化与反序列化 185...

    java范例开发大全(pdf&源码)

    实例126 将由键盘中录入的信息保存到文件中 176 实例127 一个文件变成多个小文件 178 实例128 多个小文件合成一个文件 181 实例129 统计指定文件中的字符个数 183 实例130 对象的序列化与反序列化 185 实例131 同时...

    java范例开发大全源代码

     实例126 将由键盘中录入的信息保存到文件中 176  实例127 一个文件变成多个小文件 178  实例128 多个小文件合成一个文件 181  实例129 统计指定文件中的字符个数 183  实例130 对象的序列化与反序列化...

    java范例开发大全

    实例126 将由键盘中录入的信息保存到文件中 176 实例127 一个文件变成多个小文件 178 实例128 多个小文件合成一个文件 181 实例129 统计指定文件中的字符个数 183 实例130 对象的序列化与反序列化 185 实例131 同时...

    Java范例开发大全(全书源程序)

    实例126 将由键盘中录入的信息保存到文件中 176 实例127 一个文件变成多个小文件 178 实例128 多个小文件合成一个文件 181 实例129 统计指定文件中的字符个数 183 实例130 对象的序列化与反序列化 185 实例131...

Global site tag (gtag.js) - Google Analytics