#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/gpio-bank-e.h>
#include <mach/gpio-bank-m.h>
#define DEVICE_NAME "s3c6410_keys" //定义设备名字
static int major //定义按键设备的主设备号变量
volatile unsigned long *gpncon
volatile unsigned long *gpndat
static struct class *keys_class //使用mdev机制让内核自动创建对应的设备节点文件
static struct class_device *keys_class_devs
//key驱动程序的open函数,用来初始化key设备 对应应用程序里面的open函数
static long s3c6410_keys_open(struct inode *inode, struct file *file)
{
//OK6410A的key1-6连接到gpn0-5
//gpn0-5 input mode
*gpncon &=~((0x3<<(0*2))|(0x3<<(1*2))|(0x3<<(2*2))|(0x3<<(3*2))|(0x3<<(4*2))|(0x3<<(5*2)))
return 0
}
//key驱动程序的读函数
static long s3c6410_keys_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
{
/*返回6个引脚的电平状态*/
unsigned char key_vals[6]
int regzhi,i
if(size!=sizeof(key_vals))
return -EINVAL
regzhi=*gpndat
for (i=0i<6i++)
key_vals[i]=(regzhi &(1<<i)) ? 1 : 0
copy_to_user(buf,key_vals,sizeof(key_vals)) //将内核空间的数据key_vals复制到用户空间buf指向的内存空间
return sizeof(key_vals)
}
//定义file_operations类型的结构体,当应用程序 *** 作设备文件时使用的read . write .open等系统调用,
//最终会调用该结构体中的对应函数
static struct file_operations OK6410A_keys_fops={
.owner = THIS_MODULE,
.open = s3c6410_keys_open,
.read = s3c6410_keys_read,
}
//当执行insmod 命令安装key驱动程序时会调用该函数,该函数实现将该驱动注册进内核
static int __init ok6410a_key_init(void)
{
major = register_chrdev(0, DEVICE_NAME, &OK6410A_keys_fops) //由内核自动分配key的主设备号,将key的主设备号与设备 *** 作结构体OK6410A_keys_fops关联起来
if (major <0) { //分配失败
printk(DEVICE_NAME " can't register major number\n")
return major}
keys_class = class_create(THIS_MODULE, "ok6410_keys") //创建一个类,在根文件系统的/sys/class/目录下会创建对应的类(ok6410_keys)目录
if (IS_ERR(keys_class))
return PTR_ERR(keys_class)
keys_class_devs = device_create(keys_class, NULL, MKDEV(major, 0), NULL, DEVICE_NAME)//创建该类的一个设备
if (unlikely(IS_ERR(keys_class_devs))) //创建设备节点文件/dev/DEVICE_NAME (s3c6410_keys)
return PTR_ERR(keys_class_devs)
gpncon=(volatile unsigned long *)ioremap(0x7f008830,12)
gpndat=gpncon+1
printk(DEVICE_NAME " initialized\n")
return 0
}
//执行rmmod 命令时卸载key驱动是调用的函数
static void __exit ok6410a_key_exit(void)
{
/* 卸载驱动程序 */
unregister_chrdev(major, DEVICE_NAME)
device_unregister(keys_class_devs)
iounmap(gpncon)
class_destroy(keys_class) //删除创建的类
}
//以下两行指定驱动程序的初始化函数和卸载函数
module_init(ok6410a_key_init)
module_exit(ok6410a_key_exit)
MODULE_LICENSE("GPL") //遵循的协议
测试程序:
/***********************************************************************************************************
key驱动程序的应用测试程序
命令格式: key_teston
key_testoff
************************************************************************************************************/
//包含进内核中有的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//一个应用程序有一个main函数,为该应用程序的入口处
int main(int argc, char **argv) //argc为使用key_test 命令时传入的参数个数,argv为具体的参数
{
int fd,cnt=0
unsigned char key_vals[6]
fd = open("/dev/s3c6410_keys", O_RDWR) //打开key设备对应的设备文件,前提是必须存在
if (fd <0)
{
printf("can't open /dev/key\n")
return -1
}
while
(1)
{read(fd,key_vals,sizeof(key_vals))
if(!key_vals[0] || !key_vals[1] || !key_vals[2] || !key_vals[3] || !key_vals[4] || !key_vals[5])
printf("%04d key pressed: %d %d %d %d %d %d\n",cnt++,key_vals[0],key_vals[1],key_vals[2],key_vals[3],key_vals[4],key_vals[5])
}
return 0
}
ps:这是采用查询方式设计的按键驱动程序,望采纳!
一个小巧的检测键盘的软件,有了它你可以用最快的时间来检验你键盘上的键位是否好用,这样在买键盘的时候带上它就不会被奸商给蒙混过关了,你可以根据软件测试的参数来辨别键盘的优劣,而且还可以按键个数进行计数。功能介绍
Keyboard Test Utility(键盘测试软件)可以帮助您检测每一个按键,每敲打一下虚拟键盘就会在所打的键位上高亮颜色,并显示出该键盘的vk code和scan code。软件是绿色、免费的,解压后直接打开使用即可。
你的键盘失灵过吗?键盘失灵怎么解决呢?键盘失灵有比较多种,那么,今天笔者为大家介绍一些常见的键盘失灵现象和解决办法。
一:键盘上数字小键盘失灵
这个是很多新手朋友会经常犯的最低级错误,一般是台式机大键盘,导致键盘数字小键盘(0123456789)按键失灵多数原因是大家关闭了数字小键盘,大家可以看看Numlock键是否开启,对应上面有个数字键盘灯,按Numlock键上面的灯亮了即开启了数字小键盘。
还有一些笔记本新手朋友经常会问为什么我笔记本键盘右边部分字母键打出来的确是数字而不是字母,很纠结!其实这是因为笔记本数字键与字母键存在结合,当开启了数字键盘,部分右边的字母键就被排列成数字键,主要是因为笔记本键盘比较少,厂家设置了智能切换功能。
解决办法如下:
如果只是小键盘被锁,那么请同时按住 fn+Numlk 键切换即可,反之亦然。还有一点新手朋友会经常不知所措,字母打出来的全是大写字母,这个是因为开启了大写字母键功能,取消只需要按下“Caps Lock"键即可切换正常。
二:键盘上部分键盘按键失灵,没有任何规律的按键失灵
造成键盘部分按键失灵,这种情况多数是电脑键盘内部线路板出现故障,这种现象一般都是因为在线路板或导电塑胶上有污垢,从而使得两者之间无法正常接通。其他因素也有可能,如:键盘 插头 损坏,线路有问题,主板损坏、CPU工作不正常等,但并非主要原因。前者大家可以尝试以下方法去解决,后者一般和电脑故障或键盘故障有关不在本文讨论范围。
1.拆开键盘。注意在打开键盘时,一定要按钮面(也就是我们 *** 作的一面)向下,线路板向上,否则每个按键上的导电塑胶会纷纷脱落,给您的修理带来麻烦。
2.翻开线路板,线路板一般都用软塑料制成的薄膜,上面刻有按键排线,用浓度在97%以上酒精 棉花 (75%的医用酒精棉花也可以,因为本人曾使用过,但最好是用高浓度的酒精棉花)轻轻地在线路板上擦洗二遍。对于按键失灵部分的线路要多照顾几遍。
3.查看按键失灵部分的导电塑胶,如果上面积攒了大量的污垢的话,同样使用酒精擦洗。假设导电塑胶有损坏的话,那么笔者建议您可以把不常用按键上的导电塑胶换到已损坏的部分,虽然这种“拆东墙补西墙”的举措无法让键盘发挥出所有功能,但最起码可以延长常用按键的寿命。
4.清除键盘内角落中污垢,工具可用 毛笔 、小刷子等,但要注意动作要轻柔一些。
5.查看 焊接 模块有无虚焊或脱焊,如果您会使用电烙铁的话,可以进行补焊工作。当然此步骤只适用于对会使用电烙铁的朋友,不会使用的朋友,请跳过此步骤。
6.装好键盘。这里有一点须注意,那就是一定要等酒精挥发干净后再进行。
三、以上方法还不能解决,大家可以尝试使用以下方法排查
修改键盘的驱动:通过“我的电脑”打开系统属性,选择硬件标签:打开设备管理器,我们发现中文Windows XP *** 作系统下,默认的键盘驱动是“标准101/102键或Microsoft自然PS/2键盘”。
1. 右键点击选择更新驱动程序,会出现硬件更新向导:选择“从列表或指定位置安装(高级)”,单击“下一步”,选择“不要搜索。我要自己选择要安装的驱动程序。”
单击“下一步”,进入“选择要为此硬件安装的设备驱动程序”页去掉复选框“显示兼容硬件”前的小勾。在“标准键盘型号”栏中选择“Japanese PS/2 Keyboard (106/109 Key)”,单击“下一步”,d出“更新驱动程序警告”,点“是”。“确认设备安装”窗口继续点“是”。
2. 完成硬件更新向导,重新启动计算机。
修改 注册表 :单击“开始”菜单,点“运行”,输入“regedit”,打开注册表,进入“HKEY_LOCAL_MACHINE SYSTEMControlSet001ControlKeyboard Layouts”,里面有很多子项,通过观察我发现,以“0804”结尾的都是简体中文输入法。打开“E00E0804”,可以看到右侧子项里有“Layout File”子项,双击打开该项,将“数值数据”中的“kbdus.dll”改为“kbdjpn.dll”,“确定”即可。依此类推,可以将所有的以“0804”结尾的子项中“Layout File”全部改为“kbdjpn.dll”,具体就根据自己常用的输入法进行选择了。然后重新启动计算机就好了!
如果以上方法都不可以解决,那么很可能是硬件出现故障,最常见的就是键盘硬件故障,键盘内部扳子被氧化,造成断路等,大家可以换个键盘试试,绝大多数都可以解决问题,当然也有极少数出现的由于键盘插头损坏,线路有问题,主板损坏、CPU工作不正常等,这些我们就需要拿去维修地方具体检测下。
你试试下面的方法吧,我也经常遇到,每次重装过系统后就这样了打开注册表regedit,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}删除UpperFilters项卸载设备,重新启动。然后设备管理器里变成:代码 10:该设备无法启动。定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}添加字符串UpperFilters项,内容是kbdclass卸载设备,重新启动。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)