📄 driverb-a.c
字号:
/*This is a keybd char device driver.* author:Aaron*date:2007-1-16*/#include <linux/module.h>#include <linux/fs.h>#include <linux/iobuf.h>#include <linux/major.h>#include <linux/blkdev.h>#include <linux/capability.h>#include <linux/smp_lock.h>#include <asm/uaccess.h>#include <asm/hardware.h>#include <asm/arch/cpu_s3c2410.h>#include <asm/io.h>#include <linux/vmalloc.h>#include<linux/delay.h>/*#define INPUT_MAJOR 200*/unsigned int input_major=231;int result=0;#define NOKEY 0/*static char *key="";*/int key=0;#define key_rGPCCON (*(volatile unsigned long *)key_r_GPCCON)#define key_rGPCUP (*(volatile unsigned long *)key_r_GPCUP) #define key_rGPCDAT (*(volatile unsigned long *)key_r_GPCDAT)#define key_rGPDCON (*(volatile unsigned long *)key_r_GPDCON)#define key_rGPDUP (*(volatile unsigned long *)key_r_GPDUP)#define key_rGPDDAT (*(volatile unsigned long *)key_r_GPDDAT)volatile unsigned long *key_r_GPCCON;volatile unsigned long *key_r_GPCUP;volatile unsigned long *key_r_GPCDAT;volatile unsigned long *key_r_GPDCON;volatile unsigned long *key_r_GPDUP;volatile unsigned long *key_r_GPDDAT; devfs_handle_t devfs_keybd;int keybd_open(struct inode *, struct file *);int keybd_release(struct inode *, struct file *);ssize_t keybd_read(struct file *file, char *buf , size_t size,loff_t *inode );/** Open/close code for raw IO.*/int keybd_open(struct inode *inode, struct file *file){printk("open ok\n");return 0;}ssize_t keybd_read(struct file *file, char * buf,size_t size,loff_t *inode){/*int left;*/ key_rGPCCON &= 0xffc0ffff; key_rGPDCON &= 0xfff0fff0; //input mdelay(20); if ((key_rGPCDAT & 0x100) == 0) key=1; //F1 else if ((key_rGPCDAT & 0x200) == 0) key=3; //F3 else if ((key_rGPCDAT & 0x400) == 0) key=6 ; //F6 else if ((key_rGPDDAT & 0x1) == 0) key=4; //F4 else if ((key_rGPDDAT & 0x2) == 0) key=5; //F5 else if ((key_rGPDDAT & 0x100) == 0) key =7; //F7 else if ((key_rGPDDAT & 0x200) == 0) key=8; //F8 else key=0;copy_to_user(buf,&key,size); return 1;}int keybd_release(struct inode *inode, struct file *filp){printk("release ok\n");return 0;}static struct file_operations keybd_fops={open:keybd_open,read:keybd_read,release:keybd_release,};int __init keybd_init(void){printk("*********************keybd_init**************\n");//address map key_r_GPCCON=ioremap(0x56000020,4); key_r_GPCDAT=ioremap(0x56000024,4); key_r_GPCUP=ioremap(0x56000028,4); key_r_GPDCON=ioremap(0x56000030,4); key_r_GPDDAT=ioremap(0x56000034,4); key_r_GPDUP=ioremap(0x56000038,4); key_rGPCUP &= 0xf8ff; key_rGPDUP &= 0xfcfc; // key_rGPFUP &= 0xef; //key_rGPFCON &= 0x8002; //input/* devfs_keybd = devfs_register(NULL, "buttons", DEVFS_FL_DEFAULT, INPUT_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, &keybd_fops, NULL);*/ result=register_chrdev(200,"buttons",&keybd_fops); if(result<0) { printk("buttons:can't get major number\n"); } if(input_major==200) { input_major=result; return 0;}printk("*********************keybd_init**************\n"); return 0;}static void __exit keybd_exit(void){/* devfs_unregister(devfs_keybd);*/ unregister_chrdev(input_major,"buttons"); printk("rmmod ok!\n");}module_init(keybd_init);module_exit(keybd_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -