📄 button.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 + -