工具/软件:Linux
平台- AM335x 入门套件
Target -使用一个具有 IRQ 的精确定时器来每100ms 切换一次 GPIO。(IRQ 的延迟不应超过一个周期。)
参考- DMTIMER: e2e.ti.com/.../415079
--------------------------
您好!
问题是、我无法使用来请求计时器指针
1. omap_dm_timer_request_specific (7)->请我使用 omap_dm_timer_request_by_cap/node、我认为这是因为我使用的是 DTS (?)
注释。 我正在使用默认的 AM335x-evmsk.dts + am33xx.dtsi
2.omap_dm_timer_request_by _cap ()->获取空指针
我想请求一个特定的计时器、并将其配置为每100ms 中断一次。
我完全不熟悉 TI 平台、请指导我实现目标。
谢谢!
将我的工作发布在下面。
静态 irqreturn_t timer_IRQ_handler (int IRQ、void * dev_id)
{
INT STATUS = 0;
/*读取当前状态*/
STATUS = OMA_dm_timer_read_status (pTimer);
/*清除计时器中断*/
如果(status =OMAP-TIMER_INT_MATCH)
{
omap_dm_timer_write_status (pTimer、omap_timer_int_match);
}
/*表示中断已处理*/
返回 IRQ_Handled;
}
静态 int dmtimer_init (void)
{
内部转台= 1;
struct clk *pTimerClk;
/*需要请求计时器7 */
pTimer = OMAP-dm_timer_request_specific (7);
if (pTimer=NULL){
/*没有可用的计时器*/
printk (Kern_info "DM 计时器7不可用!!!\n"\};
返回-1;
}
/*将时钟源设置为系统时钟*/
RET = OMAP_dm_timer_set_source (pTimer、OMAP_timer_SRC_SYS_CLK);
/*确定计时器触发的 IRQ */
timerIrq = OMA_dm_timer_get_IRQ (pTimer);
/*设置 IRQ 处理程序*/
RET = REQUEST_IRQ (timerIrq、timer_IRQ_handler、IRQF_timer、"ext_WDT"、NULL);
/*设置计时器以在匹配事件上触发 IRQ */
omap_dm_timer_set_int_enable (pTimer、omap_timer_int_match);
/*获取以 Hz 为单位的时钟速率*/
pTimerClk = OMAP-dm_timer_get_fclk (pTimer);
timerRate = clk_get_rate (pTimerClk);
/*启用计时器*/
/*需要在我们可以写入计数器之前完成*/
omap_dm_timer_enable (pTimer);
/*设置初始计数*/
/*根据第20.1.3.5节的脉宽调制,当发生比较情况时,使用溢出或匹配来切换*/
/*因此,我们将几乎立即触发溢出事件,以确保快速生成切换*/
omap_dm_timer_write_counter (pTimer、(0xFFFFFFFF - 5));
/*设置加载寄存器*/
/*设置为自动载入,以便在溢出时将计数器设置回0 */
omap_dm_timer_set_load (pTimer、1、0);
/*将比较寄存器设置为100ms 秒*/
/*这将确保溢出事件发生后100ms 的信号切换*/
omap_dm_timer_set_match (pTimer、1、timerRate/10);
/*启动计时器*/
RET = OMAP-dm_timer_start (pTimer);
printk (Kern_info "定时器启动寄存器%d\n"、ret);
/*
*非0返回意味着对 init_modules 的调用失败;无法加载模块
*
返回0;
}
arch_initcall (dmtimer_init)
