www.pudn.com > EXT.rar > SimpleINT.c
/* * Copyright (C) 2004 Gexin TECH ** This file just for GX-ARM9-2410EP Sat Feb 7 2004 Zhen-feng Zhao * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive * for more details. */ #include #include #include #include #include /* for in_interrupt */ #include #include #include /* for udelay */ #include #include #include #include #include #define IRQ_SimpleINT IRQ_EINT19 #define GPIO_SimpleINT_EINT19 (GPIO_MODE_ALT0 | GPIO_PULLUP_EN | GPIO_G11) //For ringing detect #define SimpleINT_MAJOR 98 devfs_handle_t dev_handle; /* register handle to store device fs */ static int SimpleINT_temp_count=0; static long ioremap_addr; static void SimpleINT_interrupt(int nr, void *devid, struct pt_regs *regs); ssize_t SimpleINT_read (struct file * file ,char * buf, size_t count, loff_t * f_ops) { printk("s3c2410: SimpleINT device file-read operation!\n"); return count; } /*=========== SimpleINT Write =======================*/ ssize_t SimpleINT_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops) { printk("s3c2410: SimpleINT device file-write operation!\n"); return count; } /*=========== SimpleINT Ioctl =======================*/ ssize_t SimpleINT_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data) { printk("s3c2410: SimpleINT device ioctl operation!\n"); return 0; } /*============ SimpleINT device open ==============*/ ssize_t SimpleINT_open (struct inode * inode ,struct file * file) { int ret; /* ret = request_irq(IRQ_SimpleINT, SimpleINT_interrupt, SA_INTERRUPT, "SimpleINT", SimpleINT_interrupt); if (ret) { printk(KERN_INFO "request SimpleINT IRQ failed (%d)\n", IRQ_SimpleINT); return ret; } */ printk("s3c2410: SimpleINT device open operation!\n"); return 0; } /*============ SimpleINT device close =============*/ ssize_t SimpleINT_release (struct inode * inode ,struct file * file) { printk("s3c2410: SimpleINT device release operation!\n"); //free_irq(IRQ_SimpleINT, NULL); //devfs_unregister_chrdev( SimpleINT_MAJOR, "SimpleINT" ); //devfs_unregister( dev_handle ); SimpleINT_temp_count=0; return 0; } struct file_operations SimpleINT_ops ={ open: SimpleINT_open, read: SimpleINT_read, write: SimpleINT_write, ioctl: SimpleINT_ioctl, release: SimpleINT_release, }; static void SimpleINT_interrupt(int nr, void *devid, struct pt_regs *regs) { SimpleINT_temp_count++; printk("Now Key interrupt %d occur!!!\n",SimpleINT_temp_count); } static int __init HW_SimpleINT_init(void) { int ret = -ENODEV; int delay ; SimpleINT_temp_count=0; set_external_irq(IRQ_SimpleINT,EXT_FALLING_EDGE, GPIO_PULLUP_EN); set_gpio_ctrl(GPIO_SimpleINT_EINT19); ret = request_irq(IRQ_SimpleINT, SimpleINT_interrupt, SA_INTERRUPT, "SimpleINT", SimpleINT_interrupt); if (ret) { printk(KERN_INFO "request SimpleINT IRQ failed (%d)\n", IRQ_SimpleINT); return ret; } // !!!!!!!!!!!!!!! ret = devfs_register_chrdev(SimpleINT_MAJOR, "SimpleINT", &SimpleINT_ops); if( ret < 0 ){ printk (" s3c2410: init_module failed with %d\n", ret); return ret; } else { printk(KERN_INFO" S3c2410 SimpleINT register success!!!\n"); } dev_handle = devfs_register( NULL, "SimpleINT", DEVFS_FL_DEFAULT, 96, 0, S_IFCHR, &SimpleINT_ops, NULL); ioremap_addr=ioremap(0x21000000,0x0f); outw(0x0024,ioremap_addr); printk("remap address = %x\n",ioremap_addr); //!!!!!!!!!!!!!! return ret; } int __init s3c2410_SimpleINT_init(void) { int ret = -ENODEV; ret = HW_SimpleINT_init(); if (ret) return ret; return 0; } int __init s3c2410_SimpleD_init(void) { int ret = -ENODEV; ret = HW_SimpleINT_init(); if (ret) return ret; return 0; } int init_module() { s3c2410_SimpleINT_init(); } void cleanup_module() { free_irq(IRQ_SimpleINT, NULL); devfs_unregister_chrdev( SimpleINT_MAJOR, "SimpleINT" ); devfs_unregister( dev_handle ); }