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 ); 
 
}