注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学习笔记

正确的方法如同学习书法,开始的时候要临摹,临摹好了然后创造自己的风格。

 
 
 

日志

 
 

[DM814x笔记]DM814x平台上timer2无法申请原因分析  

2013-03-21 21:54:41|  分类: TI_8148 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

问题:

使用定时器timer2时,无法申请资源。出错信息如下:

BUG: warning at arch/arm/plat-omap/dmtimer.c:446/omap_dm_timer_request_specific(): unable to get timer 2

改为申请其他的定时器,345678均可正常申请。

1DM8148的定时器资源

arch/arm/plat-omap/dmtimer.c中定义了DM8148的定时器资源,有8个。

static struct omap_dm_timer ti81xx_dm_timers[] = {

       { .phys_base = 0x4802E000, .irq = TI81XX_IRQ_GPT1 },

       { .phys_base = 0x48040000, .irq = TI81XX_IRQ_GPT2 },

       { .phys_base = 0x48042000, .irq = TI81XX_IRQ_GPT3 },

       { .phys_base = 0x48044000, .irq = TI81XX_IRQ_GPT4 },

       { .phys_base = 0x48046000, .irq = TI81XX_IRQ_GPT5 },

       { .phys_base = 0x48048000, .irq = TI81XX_IRQ_GPT6 },

       { .phys_base = 0x4804A000, .irq = TI81XX_IRQ_GPT7 },

       { .phys_base = 0x481C1000, .irq = TI814X_IRQ_GPT8 },

};

在定时器的初始化函数中,判断CPU的类型时赋值给了dm_timers

int __init omap_dm_timer_init(void)

{

。。。

       } else if (cpu_is_ti81xx()) {

              dm_timers = ti81xx_dm_timers;

。。。

}

2、能申请定时器的函数

struct omap_dm_timer *omap_dm_timer_request_specific(int id) //用来申请指定的定时器,其取值为1~8

struct omap_dm_timer *omap_dm_timer_request(void) //从低到高轮询定时器数组ti81xx_dm_timers,申请一个未使用的定时器

struct omap_dm_timer *omap_dm_timer_request(void)

{

。。。

       for (i = 0; i < dm_timer_count; i++) {

              if (dm_timers[i].reserved)

                     continue;

 

              timer = &dm_timers[i];

              timer->reserved = 1;

              break;

       }

。。。

       return timer;

}

3、查找原因过程

在内核源码中查找使用到了omap_dm_timer_request_specificomap_dm_timer_request的地方。有如下两处:

①位于arch/arm/mach-omap2/timer-gp.c

static void __init omap2_gp_clocksource_init(void)

{

。。。

       omap_dm_timer_request();

。。。

}

②位于arch/arm/mach-omap2/timer-gp.c,申请了定时器1

static u8 __initdata gptimer_id = 1;

static void __init omap2_gp_clockevent_init(void)

{

。。。

       gptimer = omap_dm_timer_request_specific(gptimer_id);

。。。

}

对于这两个函数的调用都是在函数同一文件下的:

static void __init omap2_gp_timer_init(void)

{

。。。

       omap2_gp_clockevent_init(); //先申请定时器1

       omap2_gp_clocksource_init();//轮询申请到定时器2

。。。

}

struct sys_timer omap_timer = {

       .init = omap2_gp_timer_init,

};

对该结构体的调用则是在文件arch/arm/mach-omap2

MACHINE_START(TI8148EVM, "ti8148evm")

       /* Maintainer: Texas Instruments */

       .boot_params  = 0x80000100,

       .map_io          = ti8148_evm_map_io,

       .reserve         = ti81xx_reserve,

       .init_irq   = ti8148_evm_init_irq,

       .init_machine  = ti8148_evm_init,

       .timer             = &omap_timer,

MACHINE_END

4、验证

现在可以猜想是因为上面的两个函数分别申请了定时器12,导致后续在驱动里申请定时器2出错。为了对上面的猜想进行进一步验证,对函数omap_dm_timer_request的代码进行如下修改。将for (i = 0; i < dm_timer_count; i++) 修改为for (i = dm_timer_count-1; i >=0 ; i--) ,即轮询是从高到低进行。

编译,重新载入内核,发现timer2已能正常申请,而timer8不能申请。

5、结论

。。。


另外,通过omap_dm_timer_request_specific()申请的定时器资源,释放时需要使用函数:

pwm_timer = omap_dm_timer_request_specific(2); //使用Timer2

。。。

omap_dm_timer_stop(pwm_timer);

omap_dm_timer_free(pwm_timer);

 

  评论这张
 
阅读(1196)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017