Linux芯片级移植与底层驱动(基于3.7.4内核) 内核节拍
发布时间:2016-09-21 05:59:16 所属栏目: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}; (编辑:滁州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读