基于博创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);//模块加载
#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
- 基于博创S3C6410l键盘驱动分析与更改
- 鼠标键盘驱动分析
- iMx键盘驱动分析
- 友善之臂210矩阵键盘驱动分析与移植
- 基于键盘过滤驱动的键盘助手
- WINCE键盘驱动流程分析
- WINCE键盘驱动流程分析
- 基于mini2440的按键驱动分析与总结
- 基于FPGA的PS2接口键盘驱动
- WinCE 5.0下鼠标键盘驱动分析
- WinCE 5.0下鼠标键盘驱动分析
- WINCE4.2键盘驱动流程分析
- WINCE键盘驱动流程不完全分析
- WinCE 5.0下鼠标键盘驱动分析
- WINCE键盘驱动流程不完全分析
- Linux键盘驱动实现分析报告
- 从键盘驱动分析wince中断机制
- 从键盘驱动分析wince中断机制
- 1、Linux kernel——获取源代码
- leetcode 62 C++. Unique Paths
- 【C#】40. 线程参数传递的三种方法
- 实现Windows数据绑定 上机练习
- Android PopupWindow使用总结
- 基于博创S3C6410l键盘驱动分析与更改
- Kubernetes 高级特性集锦
- linux的进程相关函数简单总结
- system权限创建用户权限进程
- bzoj2160 拉拉队排练
- 基本的bash shell命令(文件以及目录处理)
- 独立任务最优调度问题
- 文章标题 POJ 1426 :Find The Multiple (dfs)
- Android控件之Chronometer(定时器)