加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux芯片级移植与底层驱动(基于3.7.4内核) 内核节拍

发布时间:2016-01-19 13:49:20 所属栏目:Linux 来源:网络整理
导读:1.SoC Linux底层驱动的组成和现状 为了让Linux在一个全新的ARM SoC上运行,需要提供大量的底层支撑,如定时器节拍、中断控制器、SMP启动、CPU hotplug以及底层

94        now = readl_relaxed(xxx_timer_base + XXX_TIMER_LATCHED_LO);

95        next = now + delta;
  
 96        writel_relaxed(next, xxx_timer_base + SIRFSOC_TIMER_MATCH_0);
  
 97        writel_relaxed(XXX_TIMER_LATCH_BIT, xxx_timer_base + XXX_TIMER_LATCH);
  
 98        now = readl_relaxed(xxx_timer_base + XXX_TIMER_LATCHED_LO);
  
 99
  
100        return next - now > delta ? -ETIME : 0;
  
101}
  
102
  
103static void xxx_timer_set_mode(enum clock_event_mode mode,
  
104        struct clock_event_device *ce)
  
105{
  
107        switch (mode) {
  
108        case CLOCK_EVT_MODE_PERIODIC:
  
109                …
  
111        case CLOCK_EVT_MODE_ONESHOT:
  
112                …
  
114        case CLOCK_EVT_MODE_SHUTDOWN:
  
115                …
  
117        case CLOCK_EVT_MODE_UNUSED:
  
118        case CLOCK_EVT_MODE_RESUME:
  
119                break;
  
120        }
  
121}
  
144static struct clock_event_device xxx_clockevent = {
  
145        .name = "xxx_clockevent",
  
146        .rating = 200,
  
147        .features = CLOCK_EVT_FEAT_ONESHOT,
  
148        .set_mode = xxx_timer_set_mode,
  
149        .set_next_event = xxx_timer_set_next_event,
  
150};
  
151
  
152static struct clocksource xxx_clocksource = {
  
153        .name = "xxx_clocksource",
  
154        .rating = 200,
  
155        .mask = CLOCKSOURCE_MASK(64),
  
156        .flags = CLOCK_SOURCE_IS_CONTINUOUS,
  
157        .read = xxx_timer_read,
  
158        .suspend = xxx_clocksource_suspend,
  
159        .resume = xxx_clocksource_resume,
  
160};
  
161
  
162static struct irqaction xxx_timer_irq = {
  
163        .name = "xxx_tick",
  
164        .flags = IRQF_TIMER,
  
165        .irq = 0,
  
166        .handler = xxx_timer_interrupt,
  
167        .dev_id = &xxx_clockevent,
  
168};
  
169
  
176static void __init xxx_clockevent_init(void)
  
177{
  
178        clockevents_calc_mult_shift(&xxx_clockevent, CLOCK_TICK_RATE, 60);
  
179
  
180        xxx_clockevent.max_delta_ns =
  
181                clockevent_delta2ns(-2, &xxx_clockevent);
  
182        xxx_clockevent.min_delta_ns =
  
183                clockevent_delta2ns(2, &xxx_clockevent);
  
184
  
185        xxx_clockevent.cpumask = cpumask_of(0);
  
186        clockevents_register_device(&xxx_clockevent);
  
187}
  
188
  
189/* initialize the kernel jiffy timer source */
  
190static void __init xxx_timer_init(void)
  
191{
  
192        …
  
214
  
215        BUG_ON(clocksource_register_hz(&xxx_clocksource, CLOCK_TICK_RATE));
  
218
  
219        BUG_ON(setup_irq(xxx_timer_irq.irq, &xxx_timer_irq));
  
220
  
221        xxx_clockevent_init();
  
222}
  
249struct sys_timer xxx_timer = {
  
250        .init = xxx_timer_init,
  
251};

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读