Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7681427
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2012-01-06 15:03:14

/**

 * 文件:i2c-lzg7290驱动

 * 摘要:

 *     使用混杂设备方法注册设备,次设备号系统自动分配,设备文件系统自动创建

 *     实现Ioclt函数实现按键键值读取,通过此函数把键值传至用户空间

 * 说明:

 *     使用环境: NW-III项目键盘驱动模块  CPU: 9G45

 * A&TLzy       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");

 


 源码: i2c-lzg7290驱动.rar   

阅读(2009) | 评论(0) | 转发(1) |
0

上一篇:ZLG7290的9G45驱动程序

下一篇:PCI总线概述

给主人留下些什么吧!~~