time_init

主要是调用clocksource_of_init 函数来实现定时器初始化
这个函数在clksrc-of.c中,通过在__clksrc_of_table 中匹配of_device_id和device_node。
最终执行of_device_id 中的data指向的函数,实现timer 的初始化
执行的查找函数
of_find_matching_node_and_match—–>__of_match_node
在设备树中查找设备节点。

先看下__clksrc_of_table
struct of_device_id __clksrc_of_table[];
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
static const struct of_device_id _clksrc_of_table##name \
__used __section(__clksrc_of_table) \
= { .compatible = compat, \
.data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }
在linux/drivers/clocksource/arm_arch_timer.c中定义了这个宏
CLOCKSOURCE_OF_DECLARE(armv7_arch_timer, “arm,armv7-timer”, arch_timer_init);
CLOCKSOURCE_OF_DECLARE(armv8_arch_timer, “arm,armv8-timer”, arch_timer_init);

再看设备树(我们以高通的msm8974处理器为例)

timer@f9020000 {
#address-cells = <1>;
#size-cells = <1>;
ranges;
compatible = “arm,armv7-timer-mem”;
reg = <0xf9020000 0x1000>;--------system counter的寄存器
clock-frequency = <19200000>;
frame@f9021000 {-----------percpu的timer的定义,目前最大支持8个frame
frame-number = <0>;
interrupts = <0 8 0x4>, -------physical timer的中断
<0 7 0x4>; ----------virtual timer的中断
reg = <0xf9021000 0x1000>,-----first view base address
<0xf9022000 0x1000>;------second view base address

};

……
};

经过查找后,正真执行的函数是:
void __init arch_timer_init(struct device_node *np)
1.获取arch_timer_rate,19200000
2.arch_timer_ppi:从设备树上解析time 的参数并将映射的结果放到这个数组
3.调用arch_timer_register 实现timer 的注册
4.arch_timer_arch_init 实现timer 的初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值