⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my_key.c

📁 这个是Linux下的按键驱动程序
💻 C
字号:
#include <linux/kernel.h>#include <linux/module.h>                                                                                #if CONFIG_MODVERSIONS==1#define MODVERSIONS#include <linux/modversions.h>#endif#include <linux/fs.h>#include <linux/wrapper.h>#include <linux/types.h>#include <linux/init.h>#include <linux/delay.h>#include <asm/segment.h>#include <asm/hardware.h>#include <asm/arch/s3c2410.h>	#include <asm/irq.h>                                                                                #ifndef KERNEL_VERSIONS#define KERNEL_VERSIONS(a,b,c) ((a)*65536+(b)*256+(c))#endif                                                                                #if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)#include <asm/uaccess.h>#endif#define SUCCESS 0                                                                                #define DEVICE_NAME "my_key"static unsigned char  key_value;void key_init(void){#if 0	rGPCCON &= 0xfffff0c3;                  //potr c 1 2 3 4 input#else	rGPCCON &= 0xfffffc03;#endif        //0xfffffc03	//rGPCDAT = port data	//rGPCUP = pull ip	rGPGCON &= 0xffffc30f;			//port g 2 3 5 6 input	//rGPGDAT = port data	//rGPGUP = port up}static ssize_t mykey_read(struct file * file, char * buf, size_t count, loff_t *ppos ){  //ssize_t ret;  /*if((rGPCDAT & 0x0020) == 1)  {     *buf |= 0x0002;  }  else  {     *buf &= 0xfffd;  }*/  *buf = ((rGPCDAT >> 1) | (rGPGDAT << 2) | (rGPGDAT & 0x40));#if 0  if((rGPCDAT & 0x0010) == 1)  {     *buf |= 0x0002;  }  else  {     *buf &= 0xfffd;  }#endif  if(copy_to_user(&key_value,buf,sizeof(key_value)))  {      printk("key.c:write data error\n");      return -EFAULT;  }  return 0;}static int mykey_open( struct inode *inode, struct file *file ){   //module_speak();   key_init();   printk("device_open(%p,%p)\n",inode,file);   //Message_Ptr=Message;   MOD_INC_USE_COUNT;   return SUCCESS;}static int mykey_release( struct inode *inode, struct file *file ){   	//module_speak();         printk("device_release(%p,%p)\n",inode,file);         MOD_DEC_USE_COUNT;         return 0;}static int Major;struct file_operations Fops={        llseek:NULL,        read:mykey_read,        write:NULL,        readdir:NULL,        ioctl:NULL,        mmap:NULL,        open:mykey_open,        release:mykey_release,};int init_module(){        //int ret_val;        //int t;	Major=register_chrdev(0,DEVICE_NAME,&Fops);	//printk("register interrupt fig=%d\n",t);	printk("my_key.c:register OK:The major is %d\n",Major);                                                                                        return 0;}void cleanup_module(){        int ret;                                                                                        ret=unregister_chrdev(Major,DEVICE_NAME);        printk("my_key.c:unregister OK\n");                                                                                }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -