分类: 嵌入式
2012-01-06 15:03:14
/**
* 文件:i2c-lzg7290驱动
* 摘要:
* 使用混杂设备方法注册设备,次设备号系统自动分配,设备文件系统自动创建
* 实现Ioclt函数实现按键键值读取,通过此函数把键值传至用户空间
* 说明:
* 使用环境: NW-III项目键盘驱动模块 CPU: 9G45
* A&T:Lzy 2012-1-6
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "IIC.h"
#include "ZLG7290.h"
/* 定义幻数 */
#define IOC_MAGIC 'k'
/* 定义命令 */
#define GET_KEY _IOR(IOC_MAGIC, 1, int)
#define GET_NUM _IOR(IOC_MAGIC, 2, int)
#define DEV_IOC_MAXNR 2
#define DEVICE_NAME "i2c-lzg7290" /* 设备名称*/
/**
* 读键值和读连击次数值
*/
static int lzg_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
unsigned char KeyValue = 0;
unsigned char RepeatCnt = 0;
int ret = 0;
/* 检测命令的有效性 */
if (_IOC_TYPE(cmd) != IOC_MAGIC)
return -EINVAL;
if (_IOC_NR(cmd) > DEV_IOC_MAXNR)
return -EINVAL;
setscl_dir(OUT);
I2C_Init(); /* 初始化I2C引脚 */
msleep(20); /* 延时一定要,防止读键值时过快键盘没反应过来 */
/* 根据命令,执行相应的操作 */
switch(cmd)
{
case GET_KEY: /* 读键值 */
ret = ZLG7290_ReadReg(ZLG7290_Key,&KeyValue); //读取键值
if(ret)
{
printk("读键值出错 ");
ret = -EINVAL;
}
else
ret = put_user(KeyValue, (int *)arg); /* 键值传送至用户空间 */
break;
case GET_NUM: /* 读连击次数 */
msleep(100);
ret = ZLG7290_ReadReg(ZLG7290_RepeatCnt,&RepeatCnt);
if(ret)
{
printk("读连击次数出错 ");
ret = -EINVAL;
}
else
ret = put_user(RepeatCnt, (int *)arg); /* 连击次数传送至用户空间 */
break;
default:
ret = -EINVAL;
break;
}
return ret;
}
/* 文件操作结构体 */
static struct file_operations lzg_fops = {
.ioctl = lzg_ioctl,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &lzg_fops,
};
/**
* 注册混杂型字符设备驱动
*/
static int __init init_zlg7290(void)
{
int ret = 0;
ret = misc_register(&misc); /*注册混杂型字符设备驱动*/
if(ret)
printk("misc_register error\n");
return ret;
}
/**
* 注销混杂型字符设备驱动
*/
static void __exit exit_zlg7290(void)
{
misc_deregister(&misc);
}
module_init(init_zlg7290);
module_exit(exit_zlg7290);
MODULE_AUTHOR("Lzy");
MODULE_DESCRIPTION("I2C zlg7290 driver for Atmel AT91");
MODULE_LICENSE("GPL");