This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

omap3系列芯片中DSS和DISPC的时钟问题,涉及中断

大家好:

static void _omap_dispc_set_irqs(void)

{  

    u32 mask;  u32 old_mask;  int i;  struct omap_dispc_isr_data *isr_data;

    mask = dispc.irq_error_mask;

    for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {   isr_data = &dispc.registered_isr[i];

    if (isr_data->isr == NULL)    

        continue;

        mask |= isr_data->mask;

    }

    enable_clocks(1);

 old_mask = dispc_read_reg(DISPC_IRQENABLE);  /* clear the irqstatus for newly enabled irqs */  dispc_write_reg(DISPC_IRQSTATUS, (mask ^ old_mask) & mask);

 dispc_write_reg(DISPC_IRQENABLE, mask);

 enable_clocks(0);

}

这里我能理解为:设置中断相关寄存器,使能clock然后在关闭clock。但是问题是这个函数调用者omap_dispc_wait_for_irq_interruptible_timeout,是等待DISPC的中断,如果enable_clock(0)把dispc相关的clock给关闭了,dispc怎么还会再产生中断?那这个wait函数岂不是要timeout了?

谢谢

  • 你好,

    代码里面有函数_omap_dispc_register_isr,还有一个函数omap_dispc_register_isr,两者是不同的。omap_dispc_wait_for_irq_interruptible_timeout调用的是后者吧。

  • 你好 chris:

        谢谢你的回复。

        首先代码中确实是只有omap_dispc_register_isr函数,我提问的那个函数是笔误,可能复制黏贴的时候出错了。

        另外,我呢只要要是想看看isr这个函数真的是响应了硬件的中断处理还是timeout返回。

        我自己在用户层调用过WAIT_FOR_VSYNC发现注册上的中断类型得到了响应而没有timeout,我就很好奇。应为在dispc的代码的同时我发现了很多设置函数最后都是以enable_clocks(0) 来完成函数。那么这样以来我发现clock都没有的情况下,硬件怎么完成诸如 FRAME_DONE VSYNC VFP等由硬件产生的中断?

        ti的datasheet里面介绍了:

        EN_DSS1 Display Sub-System functional clock 1 control RW 0x0

            0x0: DSS1_ALWON_FCLK is disabled

            0x1: DSS1_ALWON_FCLK is enabled

    这个DSS1 clock同时还支持着pixel clock。如果连pix clk都没有了怎么有dispc完成硬件上的动作。

    调试过程:

        (1)我在static inline void enable_clocks(bool enable)这个函数中加了打印printk(“enabled or not %d \n”,enable);发现内核启动后最后的打印为 0,disabled的状态。随后运行了psp提供的video-demo :saFbdevDisplay可以正常运行。

        (2)我吧enable_clocks函数中的代码注释掉,重新编译,再次运行video-demo :saFbdevDisplay可以正常运行。

    我的个人理解不知道对不对:

    fclock所谓的disable可能就是组织了clock的发生,但是dispc内部的pll已近在稳定工作了。不受输入的时钟源的影响,除非你改变power的状态,或者分频系数重新写入等操作。

    不知道我的理解正确吗?

    不知道我的理解正确吗?


  • 你好 chris:

        谢谢你的回复。

        首先代码中确实是只有omap_dispc_register_isr函数,我提问的那个函数是笔误,可能复制黏贴的时候出错了。

        另外,我呢只要要是想看看isr这个函数真的是响应了硬件的中断处理还是timeout返回。

        我自己在用户层调用过WAIT_FOR_VSYNC发现注册上的中断类型得到了响应而没有timeout,我就很好奇。应为在dispc的代码的同时我发现了很多设置函数最后都是以enable_clocks(0) 来完成函数。那么这样以来我发现clock都没有的情况下,硬件怎么完成诸如 FRAME_DONE VSYNC VFP等由硬件产生的中断?

        ti的datasheet里面介绍了:

        EN_DSS1 Display Sub-System functional clock 1 control RW 0x0

            0x0: DSS1_ALWON_FCLK is disabled

            0x1: DSS1_ALWON_FCLK is enabled

    这个DSS1 clock同时还支持着pixel clock。如果连pix clk都没有了怎么有dispc完成硬件上的动作。

    调试过程:

        (1)我在static inline void enable_clocks(bool enable)这个函数中加了打印printk(“enabled or not %d \n”,enable);发现内核启动后最后的打印为 0,disabled的状态。随后运行了psp提供的video-demo :saFbdevDisplay可以正常运行。

        (2)我吧enable_clocks函数中的代码注释掉,重新编译,再次运行video-demo :saFbdevDisplay可以正常运行。

    我的个人理解不知道对不对:

    fclock所谓的disable可能就是组织了clock的发生,但是dispc内部的pll已近在稳定工作了。不受输入的时钟源的影响,除非你改变power的状态,或者分频系数重新写入等操作。

    不知道我的理解正确吗?

    不知道我的理解正确吗?