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

📄 button.c

📁 按键驱动实验 基于TEB-44B0实验平台的按键驱动 包括按键驱动程序与测试程序
💻 C
字号:
/******************************************************************* *    Hardware platform: Dragonball EZ ADS                                    * *  First version                                                             * *  (c) 2001 by Martin Kirsch                                                 * *  modified by: dw01@mails.tsinghua.edu.cn    & lij01@mails.tsinghua.edu.cn       * *  The file is freely redistributable but not forcommercial use.                    * *  Modifued by Vencent for TEB-44B0 board                                                                         * *******************************************************************/#include <linux/module.h>#include <linux/kernel.h>#include <linux/ioport.h>#include <linux/sched.h>#include <linux/signal.h>#include <linux/errno.h>#include <linux/random.h>#include <linux/miscdevice.h>#include <linux/fs.h>#include <linux/interrupt.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/system.h>#include <asm/uaccess.h>#include <asm/segment.h>//#include <asm/MC68VZ328.h> #include <asm/arch/s3c44b0x.h>int button_major=50; #define IRQ_BUTTON	S3C44B0X_INTERRUPT_EINT4567  // 21   DECLARE_WAIT_QUEUE_HEAD (wq);static char message;                               static void button_interrupt(int irq, void *dev_id, struct pt_regs *regs){        	// ISR |= (1<<18);		//outl(inl(S3C44B0X_EXTINPND)|(0x04), S3C44B0X_EXTINPND);    // Vencent 0831am	//outl((0x01)<<21, S3C44B0X_I_ISPC);                          // Vencent 0831am		//disable_irq(IRQ_BUTTON);        message='A';	printk("##########\n");        wake_up_interruptible(&wq);		outl(inl(S3C44B0X_EXTINPND)|(0x08), S3C44B0X_EXTINPND);    // Vencent 0831pm	outl((0x01)<<21, S3C44B0X_I_ISPC);                          // Vencent 0831pm	 return;}                              /*static int button_read(struct inode *inode, struct file *file, char *buffer, int size){*/static ssize_t button_read (struct file *file, char *buff, size_t len, loff_t *offset){          interruptible_sleep_on(&wq);   copy_to_user(buff,&message,1);   //enable_irq(IRQ_BUTTON);        //0831 Vencent   return 1;}static int button_open(struct inode *inode, struct file *file){      int rc;      rc=request_irq(IRQ_BUTTON, button_interrupt, 0, "button", NULL/*Userdata!!!*/);   if(rc)   {     printk("BUTTON-Driver: Error while installing IRQ_BUTTON handler\n");     return -ENODEV;   }   else    {     // printk("the BUTTON is registered successfully!\n");     // printk("rc=%d \n",rc);     }        outl(inl(S3C44B0X_PCONG)|((0x03)<<14), S3C44B0X_PCONG);    outl(inl(S3C44B0X_PUPG)&(~((0x01)<<7)), S3C44B0X_PUPG);    outl(inl(S3C44B0X_INTMOD)&(~((0x01)<<21)), S3C44B0X_INTMOD);   outl(inl(S3C44B0X_EXTINT)&(~((0x7)<<28)), S3C44B0X_EXTINT);   //outl(inl(S3C44B0X_EXTINT)|(0x04<<28), S3C44B0X_EXTINT);     outl(inl(S3C44B0X_EXTINT)|(0x02<<28), S3C44B0X_EXTINT);        outl(inl(S3C44B0X_PCONE)&(0x3cfff), S3C44B0X_PCONE);    outl(inl(S3C44B0X_PCONE)|(0x1000), S3C44B0X_PCONE);    //PE6 as output     outl(inl(S3C44B0X_PUPE)&(0x1bf), S3C44B0X_PUPE);     outl(inl(S3C44B0X_PDATE)&(0x1bf), S3C44B0X_PDATE);      //PE6->0       outl(inl(S3C44B0X_PCONF)&(~((0x03)<<4)), S3C44B0X_PCONF);    outl(inl(S3C44B0X_PCONF)|((0x01)<<4), S3C44B0X_PCONF);    //PF2 as output     outl(inl(S3C44B0X_PUPF)&(0x1fb), S3C44B0X_PUPF);     outl(inl(S3C44B0X_PDATF)|(0x04), S3C44B0X_PDATF);      //PF2->1      return 0;}struct file_operations button_fops={ read: button_read, open: button_open,};                               int insert_button(void){ int rc;   rc=register_chrdev(button_major, "button", &button_fops);   if(rc<0)   {     printk("Panic! Could not register BUTTON-Driver\n");     return rc;   }   printk("the BUTTON is registered successfully!\n");      //rc=request_irq(IRQ_BUTTON, button_interrupt, 0, "BUTTON-IRQ", NULL/*Userdata!!!*/);/*   rc=request_irq(IRQ_BUTTON, button_interrupt, 0, "button", NULL);   if(rc)   {     printk("BUTTON-Driver: Error while installing IRQ_BUTTON handler\n");     return -ENODEV;   }   else    {      printk("the BUTTON is registered successfully!\n");      printk("rc=%d \n",rc);     }*/   	//ICR = 0x0f00; //set(i)	//PDDIR = 0x00;	//PDSEL = 0x00;	//PDKBEN = 0x00;	/*  outl(inl(S3C44B0X_PCONG)|((0x03)<<12), S3C44B0X_PCONG);   outl(inl(S3C44B0X_PUPG)&(~((0x01)<<6)), S3C44B0X_PUPG);   outl(inl(S3C44B0X_INTMOD)&(~((0x01)<<21)), S3C44B0X_INTMOD);  outl(inl(S3C44B0X_EXTINT)&(~((0x7)<<24)), S3C44B0X_EXTINT);  outl(inl(S3C44B0X_EXTINT)|(0x04<<24), S3C44B0X_EXTINT);  //enable_irq(IRQ_BUTTON); */   return 0;}int button_init(void){ int rc;/*  outl(inl(S3C44B0X_PCONE)&(0x3cffc), S3C44B0X_PCONE);   outl(inl(S3C44B0X_PCONE)|(0x3003), S3C44B0X_PCONE);    //PE6,PE0 as output    outl(inl(S3C44B0X_PUPE)&(0xbe), S3C44B0X_PUPE);    outl(inl(S3C44B0X_PDATE)&(0xbe), S3C44B0X_PDATE);      //PE6->0  outl(inl(S3C44B0X_PDATE)|(0x01), S3C44B0X_PDATE);      //PE0->1*/   rc=insert_button();   if(rc)   printk("Panic! BUTTON-driver could not be loaded!\n");   return rc;}

⌨️ 快捷键说明

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