📄 s3c2410-int.c
字号:
#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/miscdevice.h>#include <linux/sched.h>#include <linux/delay.h>#include <linux/poll.h>#include <linux/spinlock.h>#include <linux/delay.h>#include <asm/hardware.h>//#include <asm/arch/spi.h>#include <asm/arch/S3C2410.h>#include <asm/arch/irqs.h>/* debug macros *///#undef DEBUG#define DEBUG#ifdef DEBUG#define DPRINTK( x... ) printk("s3c2410-int: " ##x)#else#define DPRINTK( x... )#endif#define DEVICE_NAME "s3c2410 int"#define s3c2410_IRQ3 IRQ_EINT3 //IRQ_EINT3#define s3c2410_IRQ5 IRQ_EINT5 //IRQ_EINT4#define s3c2410_IRQ9 IRQ_EINT9 //IRQ_EINT5#define GPIO_key_int01 (GPIO_MODE_IN | GPIO_PULLUP_DIS | GPIO_F3)#define GPIO_key_int02 (GPIO_MODE_IN | GPIO_PULLUP_DIS | GPIO_F5)#define GPIO_key_int03 (GPIO_MODE_IN | GPIO_PULLUP_DIS | GPIO_G1)#define led01_enable() \ ({ GPCCON &=~ 0xc00; \ GPCCON |= 0x400; \ GPCDAT&=~ 0x20; \ GPCDAT |= 0x0; \})#define led01_disable() \ ({ GPCDAT&=~ 0x20; \ GPCDAT |= 0x20; \})#define led02_enable() \ ({ GPCCON &=~ 0x3000; \ GPCCON |= 0x1000; \ GPCDAT&=~ 0x40; \ GPCDAT |= 0x0; \ })#define led02_disable() \ ({ GPCDAT&=~ 0x40; \ GPCDAT |= 0x40; \ })#define led03_enable() \ ({ GPCCON &=~ 0xc000; \ GPCCON |= 0x4000; \ GPCDAT&=~ 0x80; \ GPCDAT |= 0x0; \ })#define led03_disable() \ ({ GPCDAT&=~ 0x80; \ GPCDAT |= 0x80; \ })static void s3c2410_IRQ3_fun(int irq, void *dev_id, struct pt_regs *reg){ unsigned char byte; int i =0 ; DPRINTK("enter interrupt 3 !\n"); for (i=0;i<2;i++) { led01_enable(); mdelay(800); led01_disable(); mdelay(800); led02_enable(); mdelay(800); led02_disable(); mdelay(800); led03_enable(); mdelay(800); led03_disable(); }}static void s3c2410_IRQ5_fun(int irq, void *dev_id, struct pt_regs *reg){ unsigned char byte; int i =0 ; DPRINTK("enter interrupt 5 ! \n"); for (i=0;i<2;i++) { led01_enable(); mdelay(1000); led01_disable(); mdelay(1000); led02_enable(); mdelay(1000); led02_disable(); mdelay(1000); led03_enable(); mdelay(1000); led03_disable(); }}static void s3c2410_IRQ9_fun(int irq, void *dev_id, struct pt_regs *reg){ unsigned char byte; int i =0 ; DPRINTK("enter interrupt 9 !\n"); for (i=0;i<2;i++) { led01_enable(); mdelay(400); led01_disable(); mdelay(400); led02_enable(); mdelay(400); led02_disable(); mdelay(400); led03_enable(); mdelay(400); led03_disable(); }}static int __init s3c2410_interrupt_init(void){ int i, ret; int flags; //set_gpio_ctrl(GPIO_MCP2510_CS); //printGPE(); //printSPI(); //printRegisters(); set_gpio_ctrl(GPIO_key_int01); set_gpio_ctrl(GPIO_key_int02); set_gpio_ctrl(GPIO_key_int03); led01_disable(); led02_disable(); led03_disable(); for (i=0;i<2;i++) { led01_enable(); led02_enable(); led03_enable(); // printk(DEVICE_NAME"GPCCON:%x\t GPCDAT:%x\t\n", GPCCON, GPCDAT ); mdelay(500); led01_disable(); led02_disable(); led03_disable(); // printk (DEVICE_NAME"GPCCON:%x\t GPCDAT:%x\t\n",GPCCON, GPCDAT ); mdelay(500); } local_irq_save(flags); //init_MCP2510(BandRate_250kbps); /* Register IRQ handlers */ ret = set_external_irq(s3c2410_IRQ3, EXT_RISING_EDGE, GPIO_PULLUP_DIS); if (ret){ printk("s3c2410_IRQ3 set_external_irq failure\n"); return ret; } local_irq_restore(flags); local_irq_save(flags); ret = set_external_irq(s3c2410_IRQ5, EXT_RISING_EDGE, GPIO_PULLUP_DIS); if (ret){ printk("s3c2410_IRQ5 set_external_irq failure\n"); return ret; } local_irq_restore(flags); local_irq_save(flags); ret = set_external_irq(s3c2410_IRQ9, EXT_RISING_EDGE, GPIO_PULLUP_DIS); if (ret){ printk("s3c2410_IRQ9 set_external_irq failure\n"); return ret; } local_irq_restore(flags); //ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops); //if (ret < 0) { // printk(DEVICE_NAME " can't get major number\n"); // return ret; //} //Major = ret; /* Enable touch interrupt */ ret = request_irq(s3c2410_IRQ3, s3c2410_IRQ3_fun, SA_INTERRUPT, "s3c2410_IRQ3", s3c2410_IRQ3_fun); if (ret) { printk("s3c2410_IRQ3 request_irq failure\n"); return ret; }//* ret = request_irq(s3c2410_IRQ5, s3c2410_IRQ5_fun, SA_INTERRUPT, "s3c2410_IRQ5", s3c2410_IRQ5_fun); if (ret) { printk("s3c2410_IRQ5 request_irq failure\n" ); return ret; } ret = request_irq(s3c2410_IRQ9, s3c2410_IRQ9_fun, SA_INTERRUPT,"s3c2410_IRQ9", s3c2410_IRQ9_fun); if (ret) { printk("s3c2410_IRQ9 request_irq failure\n"); return ret; }//*/ /* MCP2510_CLOSE_INT();#ifdef CONFIG_DEVFS_FS devfs_spi_dir = devfs_mk_dir(NULL, "can", NULL); devfs_spiraw = devfs_register(devfs_spi_dir, "0", DEVFS_FL_DEFAULT, Major, SPIRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR, &s3c2410_fops, NULL);#endif*/ printk(DEVICE_NAME " harrr initialized\n"); return 0;}static void __exit s3c2410_interrupt_exit(void){ printk(DEVICE_NAME " unloaded\n");}module_init(s3c2410_interrupt_init);module_exit(s3c2410_interrupt_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -