基于博创S3C6410l键盘驱动分析与更改

来源:互联网 发布:python 运维框架 编辑:程序博客网 时间:2024/05/16 17:31
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/uaccess.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <asm-arm/arch-s3c2410/regs-gpio.h>
#include <asm/io.h>
#include <asm/arch/map.h>
#include <asm-arm/plat-s3c24xx/clock.h> 
#include <asm/arch/regs-clock.h>     //头文件


#define KEYS_MAJOR 245
#define DEVICE_NAME "KEYS"


struct class *keys_class;


static int major = KEYS_MAJOR;
 
static unsigned long keys_table[]={    //设置gpio口
        S3C_GPE4,S3C_GPL11,
        S3C_GPL13,S3C_GPL12,
        S3C_GPE2,S3C_GPE0,
        S3C_GPE1,S3C_GPE3,
};
 
static unsigned int keys_cfg_table[]={
        S3C_GPE4_INP,S3C_GPL11_INP,
        S3C_GPL13_INP,S3C_GPL12_INP,
        S3C_GPE2_OUTP,S3C_GPE0_OUTP,
        S3C_GPE1_OUTP,S3C_GPE3_OUTP,
};


static ssize_t keys_open(struct inode *inode,struct file *filp)//打开
{
int i;
        for(i=0;i<8;i++)          
{
s3c_gpio_cfgpin(keys_table[i],keys_cfg_table[i]);
}
return 0;
}


static ssize_t keys_read(struct file *filp,char __user *buffer,
  size_t count, loff_t *f_pos)//读,判断,亮灯
{
unsigned char n;
unsigned char sccode;
unsigned char data;
unsigned long temp4;
        unsigned int keys_value,ret;
// init key 
s3c_gpio_setpin(S3C_GPE0,0);
        s3c_gpio_setpin(S3C_GPE1,0);
        s3c_gpio_setpin(S3C_GPE2,0);
        s3c_gpio_setpin(S3C_GPE3,0);
keys_value=0;
if(!(s3c_gpio_getpin(S3C_GPE4))||!(s3c_gpio_getpin(S3C_GPL11))||!(s3c_gpio_getpin(S3C_GPL12))||!(s3c_gpio_getpin(S3C_GPL13)))// any key pressed
{
mdelay(100);
if(!(s3c_gpio_getpin(S3C_GPE4))||!(s3c_gpio_getpin(S3C_GPL11))||!(s3c_gpio_getpin(S3C_GPL12))||!(s3c_gpio_getpin(S3C_GPL13)))// fliter
{
sccode=0xfe;data=0xe;
for(n=0;n<4;n++){// for scan key value
if(n==0){
printk("n==0\n");
s3c_gpio_setpin(S3C_GPE2,0);
s3c_gpio_setpin(S3C_GPE0,1);
s3c_gpio_setpin(S3C_GPE1,1);
s3c_gpio_setpin(S3C_GPE3,1);
if(!s3c_gpio_getpin(S3C_GPE4)){//S1
temp4=0xe0;
keys_value=temp4+data;
break;
}
          else if(!s3c_gpio_getpin(S3C_GPL11)){// S2
        temp4=0xd0;
          keys_value=temp4+data;
            break;
          }
          else if(!s3c_gpio_getpin(S3C_GPL13)){// S3
          temp4=0xb0;
            keys_value=temp4+data;
            break;
          }
          else if(!s3c_gpio_getpin(S3C_GPL12)){// S4
            temp4=0x70;
            keys_value=temp4+data;
        break;
          }

}
else if(n==1){
printk("n==1\n");
s3c_gpio_setpin(S3C_GPE2,1);
        s3c_gpio_setpin(S3C_GPE0,0);
          s3c_gpio_setpin(S3C_GPE1,1);
          s3c_gpio_setpin(S3C_GPE3,1);
          if(!s3c_gpio_getpin(S3C_GPE4)){// S5
          temp4=0xe0;
            keys_value=temp4+data;
          break;
          }
else if(!s3c_gpio_getpin(S3C_GPL11)){// S6
          temp4=0xd0;
            keys_value=temp4+data;
            break;
          }
          else if(!s3c_gpio_getpin(S3C_GPL13)){// S7
          temp4=0xb0;
            keys_value=temp4+data;
            break;
          }
          else if(!s3c_gpio_getpin(S3C_GPL12)){// S8
          temp4=0x70;
          keys_value=temp4+data;
            break;
}
}
else if(n==2){
printk("n==2\n");
        s3c_gpio_setpin(S3C_GPE2,1);
          s3c_gpio_setpin(S3C_GPE0,1);
          s3c_gpio_setpin(S3C_GPE1,0);
          s3c_gpio_setpin(S3C_GPE3,1);
        if(!s3c_gpio_getpin(S3C_GPE4)){// S9
          temp4=0xe0;
            keys_value=temp4+data;
            break;
        }
          else if(!s3c_gpio_getpin(S3C_GPL11)){// S10
          temp4=0xd0;
          keys_value=temp4+data;
            break;
          }
          else if(!s3c_gpio_getpin(S3C_GPL13)){// S11
          temp4=0xb0;
            keys_value=temp4+data;
            break;
          }
          else if(!s3c_gpio_getpin(S3C_GPL12)){// S12
            temp4=0x70;
            keys_value=temp4+data;
            break;
          }
}
else if(n==3){
printk("n==3\n");
        s3c_gpio_setpin(S3C_GPE2,1);
          s3c_gpio_setpin(S3C_GPE0,1);
          s3c_gpio_setpin(S3C_GPE1,1);
        s3c_gpio_setpin(S3C_GPE3,0);
          if(!s3c_gpio_getpin(S3C_GPE4)){// S13
          temp4=0xe0;
            keys_value=temp4+data;
            break;
          }
          else if(!s3c_gpio_getpin(S3C_GPL11)){// S14
          temp4=0xd0;
            keys_value=temp4+data;
            break;
          }
          else if(!s3c_gpio_getpin(S3C_GPL13)){// S15
          temp4=0xb0;
            keys_value=temp4+data;
            break;
        }
          else if(!s3c_gpio_getpin(S3C_GPL12)){// S16
          temp4=0x70;
            keys_value=temp4+data;
            break;
          }
}
//printk("data=%x\n",data);
data=((data<<1)|0x01)&0x0f;// 0x0e
}// for loop


//printk("keys_value=0x%X\n",keys_value);
      ret=copy_to_user(buffer,&keys_value,sizeof(keys_value));

}
else
{
return 0;
}
}
return 0;
}




static struct file_operations keys_fops = {//驱动和应用操作对应表
.owner   = THIS_MODULE,
.read    = keys_read,
.open    = keys_open,
};


static int __init keys_init(void)//加载函数
{
int result;
result = register_chrdev(major,DEVICE_NAME,&keys_fops);//动态申请设备号
if(result<0)
{
printk(KERN_WARNING"KEYS:can't get major %d\n",major);
return result;
}
printk(DEVICE_NAME"keys initialized\n");
        keys_class=class_create(THIS_MODULE,"key_class");//注册设备
        if(IS_ERR(keys_class))
        {
printk("err:failed in creating class.\n");
                return -1;
        }
        class_device_create(keys_class,NULL,MKDEV(KEYS_MAJOR,0),NULL,"KEYS%d",0);
        return 0;
}


static void __exit keys_exit(void)//模块卸载函数
{
class_device_destroy(keys_class,MKDEV(KEYS_MAJOR,0));
        class_destroy(keys_class);
unregister_chrdev(major,DEVICE_NAME);
}


module_init(keys_init);//模块加载

module_exit(keys_exit);//模块卸载


简单的字符驱动,模式固定

没有主函数



0 0
原创粉丝点击