QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 812|回复: 0

at91rm9200定时中断驱动

[复制链接]
发表于 2005-4-22 11:53:54 | 显示全部楼层 |阅读模式
我使用TC0编一个定时中断的驱动,RC比较的方法产生定时.每次中断用do_gettimeofday((struct timeval *) tv_head)获取时间,用户程序read()这个时间,打印出来.insmod时系统报错segmentation fault.在/proc/modules和/proc/devices里可以看到注册的这个设备,/proc/interrupts里看不到申请的中断.用result = request_irq(17,short_tl_interrupt ,SA_INTERRUPT,"tmr0-irq", NULL)申请的中断.TC0的ID给的是17,我就直接用了.请教!谢谢!
初始化函数:

#define TC0_ID             17

#define TC_IER_CPCS        (AT91_REG)1<<4
#define TC_IDR_CPCS        (AT91_REG)1<<4
#define TC_CMR_CPCTRG      0x4000 ///////////////////RC compare trigger enable
#define TC_CMR_TCCLKS      0x4 /////////////////////SCLK=32.768kHz
#define TC_RC_VALUE        0x8000
#define TC_CCR_CLKEN       0x1 ////////////////////clock enable
#define TC_CCR_CLKDIS      0x2 ////////////////////clock disable
#define TC_CCR_SWTRG       0x4 ////////////////////software trigger
#define AIC_SMR17_PRIOR    4 //////////////////////interrupt priority
#define AIC_IDCR_DIS       (AT91_REG)1<<TC0_ID ////////////////interrupt disable
#define AIC_IECR_EN        (AT91_REG)1<<TC0_ID ////////////////interrupt enable
#define AIC_ICCR_CLR       (AT91_REG)1<<TC0_ID ////////////////clear interrupt flag


int short_init(void)
{
    int result;
    /* Set up owner pointers.*/
    SET_MODULE_OWNER(&short_fops);
    result = register_chrdev(0, "tmrint", &short_fops);
    if (result < 0) {
        printk(KERN_INFO "tmrint: can't get major number\n");
        return result;
    }
    if (major == 0) major = result; /* dynamic */
    short_buffer = __get_free_pages(GFP_KERNEL,0); /* never fails */
    short_head = short_tail = short_buffer;
    short_task.routine = (void (*)(void *)) short_do_tasklet;
    short_task.data = NULL; /* unused */
    short_irq = TC0_ID;
*(AT91C_AIC_IDCR) = AIC_IDCR_DIS;///////////////////////close interrupt
*(AT91C_TC0_CMR) = (AT91_REG)(TC_CMR_CPCTRG+TC_CMR_TCCLKS);
*(AT91C_TC0_RC) = (AT91_REG)TC_RC_VALUE;
*(AT91C_AIC_SMR17) = AIC_SMR17_PRIOR;
*(AT91C_AIC_ICCR) = AIC_ICCR_CLR;
/////////////////////////////////////////////////initialization
        result = request_irq(short_irq,short_tl_interrupt ,SA_INTERRUPT,"tmr0-irq", NULL);
        if (result) {
            printk(KERN_INFO " can't get assigned irq %i\n",short_irq);
            short_irq = -1;
        }
else
{  ///////////////////////////////////////////open interrupt
      printk(KERN_INFO " get assigned irq %i\n", short_irq);
     *(AT91C_TC0_CCR) = (AT91_REG)TC_CCR_CLKEN;
     *(AT91C_TC0_IER) = TC_IER_CPCS;
     *(AT91C_AIC_IECR) = AIC_IECR_EN;
            *(AT91C_TC0_CCR) = (AT91_REG)TC_CCR_SWTRG;
}
    return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 05:08 , Processed in 0.040120 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表