LiangXinJi 发表于 2010-6-14 09:30

linux定时器0驱动进入定时器中断29次就重起!!

linux定时器0驱动进入定时器中断29次就重起!!而在这29次中其它的程序都死了,请楼主,和知道的朋友帮我看下什么原因!!下面是定时器的初始化代码》谢谢了!!

static int init_timer0(void)
{
   // printk("timer init is on!");
   
    unsigned long tcon=0;
    unsigned long tcnt;
    unsigned long tcfg1;
    unsigned long tcfg0;
//    unsigned long prescaler0;
//    unsigned long timer_mux0;

    struct clk *clk_p;
    unsigned long pclk;
       printk("timer init is on!");
   
    tcfg1= __raw_readl(S3C2410_TCFG0);//读取定时器配置寄存器1的值
    tcfg0=__raw_readl(S3C2410_TCFG0); //读取定时器配置寄存器0的值
    //prescaler = 50
    tcfg0&=~S3C2410_TCFG_PRESCALER0_MASK;
    tcfg0 |=49; //设置tcfg0的值为49
   
    //mux = 1/16
    tcfg1 &=~S3C2410_TCFG1_MUX0_MASK;
    tcfg1 |=S3C2410_TCFG1_MUX0_DIV16; //设置tcfg1的值为0x0011即:1/16
   
    __raw_writel(tcfg1,S3C2410_TCFG1);// 将值tcfg1写入定时器配置寄存器1中
    __raw_writel(tcfg0,S3C2410_TCFG0); //将值tcfg0写入定时器配置寄存器0中
   
    clk_p=clk_get(NULL,"pclk");
    pclk=clk_get_rate(clk_p); //从系统平台时钟队列中获取pclk的时钟频率,在include/linux/clk.h中定义
    tcnt=(pclk/50/16);   //计算定时器0的输出时钟频率(pclk/(prescaler0+1))/divider value
    if(tcnt&(~0xffff))
      {
         printk("tcnt setting error\n");
      // return;
      }
    printk("tcnt=%ld\n",tcnt);
   
    __raw_writel(tcnt, S3C2410_TCNTB(0));//设置定时器0的计数缓存寄存器的值
    __raw_writel(tcnt/10,S3C2410_TCMPB(0));//设置定时器0比较缓存寄存器的值

    tcon &= __raw_readl(S3C2410_TCON); //读取定时器控制寄存器的值
   tcon &=(~0x1f);
    tcon |=0x1b;
    __raw_writel(tcon, S3C2410_TCON);
      tcon &=~2; //clear manual updata bit
    tcon |=S3C2410_TCON_T0RELOAD; //设置定时器0为自动重装0x04
   //    tcon |=S3C2410_TCON_T0MANUALUPD; // 0x02设置定时器0 Updata TCNTB0&TCMPB0
   // tcon |=S3C2410_TCON_T0START;    //启动时器开始计数0x01
    __raw_writel(tcon, S3C2410_TCON);

    return 0;
}
int isp;
static irqreturn_ttimer0_irq(void)
{ isp++;
printk("into the ISR=%d\n",isp);
return IRQ_RETVAL (IRQ_HANDLED);
}      

static int analog_freq_input_open(struct inode *inode, struct file *file)
{
int err;
if(!down_trylock(&lock))
      {                  
          init_timer0();
          printk("init timer0 finish\n");
          err=request_irq(IRQ_TIMER0, (void*)&timer0_irq,IRQF_DISABLED,"S3C2410_timer0", NULL);
          if(err==0)
          printk("timeri init irq finish\n");
          return 0;
       }
   else
      return -EBUSY;
}

LiangXinJi 发表于 2010-6-14 10:06

大虾们,在那a ??

LiangXinJi 发表于 2010-6-14 11:47

问题已解决!!!

lelee007 发表于 2010-6-14 14:34

怎么解决的?贴出来分享一下哦
页: [1]
查看完整版本: linux定时器0驱动进入定时器中断29次就重起!!