|
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/platform_device.h>
#include <linux/errno.h>
#include <asm/uaccess.h>
#include <linux/delay.h>
#include <linux/miscdevice.h>
#include <asm/io.h>
#include <asm/arch/regs-irq.h>
#include <asm/arch/regs-mem.h>
#include <asm/arch/regs-gpio.h>
#include <linux/poll.h>
#include <linux/wait.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <asm/arch/irqs.h>
#include <linux/ioctl.h>
#include <linux/spinlock.h>
#include <asm/system.h>
#include <linux/cdev.h>
#include <linux/mm.h>
#define DEVICE_NAME "test"
#define TEST_IRQ IRQ_EINT15
typedef struct {
int channel;
int prescale;
}TEST_DEV;
static TEST_DEV testdev;
static irqreturn_t adcdone_int_handler(int irq, void *dev_id)
{
printk(KERN_ALERT "%s:%s,%s\r\n", __FUNCTION__,__DATE__,__TIME__);
return IRQ_HANDLED;
}
static ssize_t test_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
return 0;
}
static int test_open(struct inode *inode, struct file *filp)
{
printk( "test opened\n");
return 0;
}
static int test_release(struct inode *inode, struct file *filp)
{
printk( "test closed\n");
return 0;
}
static struct file_operations dev_fops = {
owner: THIS_MODULE,
open: test_open,
read: test_read,
release: test_release,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
printk(KERN_ALERT "%s:%s,%s\r\n", __FUNCTION__,__DATE__,__TIME__);
writel((readl(S3C_GPNCON) & ~(0x3 <<30)) | (0x2 << 30), S3C_GPNCON); /* GPN15 to EINT */
writel((readl(S3C_GPNPU) & ~(0x3<<30)) | (0x2 << 30),S3C_GPNPU);
writel((readl(S3C_EINT0CON0) & ~(0x7 <<28)) | (0x2 << 28), S3C_EINT0CON0); /* EINT15 to both edge triggered */
writel((readl(S3C_EINTFLTCON1)& ~(0x3 <<30)) | (0x1 << 31), S3C_EINTFLTCON1);
writel((readl(S3C_EINTPEND)&~(0x1<<15)),S3C_EINTPEND);
writel(readl(S3C_EINT0MASK) & ~(0x1 << 15), S3C_EINT0MASK); /* EINT15 unmask */
writel(readl(S3C_VIC1INTENABLE) | (0x1 << 15), S3C_VIC1INTENABLE); /* EINT15 enable */
ret = request_irq(TEST_IRQ, adcdone_int_handler, IRQF_SHARED, DEVICE_NAME, &testdev);
if (ret) {
return ret;
}
ret = misc_register(&misc);
return ret;
}
static void __exit dev_exit(void)
{
free_irq(TEST_IRQ, &testdev);
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("xxx");
这个是我的程序,我采用动态加载的方式加载驱动,但是我加载中断,程序能正常运行,但是我将驱动卸载后,如果还有中断产生,就会出现opps错误,就是因为中断资源没有清除干净产生的!
请问,我应该怎么样清除干净中断资源呢》谢谢! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|