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

📄 driverb-a.c

📁 这是一个基于S3C2410的8位按键的驱动程序源代码
💻 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 + -