Linux 内核时钟架构之时钟事件设备注册

 
void clockevents_register_device(struct clock_event_device *dev);
void clockevents_config_and_register(struct clock_event_device *dev,
         u32 freq, unsigned long min_delta,
         unsigned long max_delta);
 
 
相关的一个是配置函数
void clockevents_config(struct clock_event_device *dev, u32 freq);
 
 
 

/**  * clockevents_register_device - register a clock event device  * @dev: device to register  */ void clockevents_register_device(struct clock_event_device *dev) {  unsigned long flags;

 /* Initialize state to DETACHED */  clockevent_set_state(dev, CLOCK_EVT_STATE_DETACHED);

 if (!dev->cpumask) {   WARN_ON(num_possible_cpus() > 1);   dev->cpumask = cpumask_of(smp_processor_id());  }

 raw_spin_lock_irqsave(&clockevents_lock, flags);

 list_add(&dev->list, &clockevent_devices);  tick_check_new_device(dev);  clockevents_notify_released();

 raw_spin_unlock_irqrestore(&clockevents_lock, flags); } EXPORT_SYMBOL_GPL(clockevents_register_device);

 
 
/**
 * clockevents_config_and_register - Configure and register a clock event device
 * @dev: device to register
 * @freq: The clock frequency
 * @min_delta: The minimum clock ticks to program in oneshot mode
 * @max_delta: The maximum clock ticks to program in oneshot mode
 *
 * min/max_delta can be 0 for devices which do not support oneshot mode.
 */
void clockevents_config_and_register(struct clock_event_device *dev,
         u32 freq, unsigned long min_delta,
         unsigned long max_delta)
{
 dev->min_delta_ticks = min_delta;
 dev->max_delta_ticks = max_delta;
 clockevents_config(dev, freq);
 clockevents_register_device(dev);
}
EXPORT_SYMBOL_GPL(clockevents_config_and_register);
 
 
 
 

void clockevents_config(struct clock_event_device *dev, u32 freq) {  u64 sec;

 if (!(dev->features & CLOCK_EVT_FEAT_ONESHOT))   return;

 /*   * Calculate the maximum number of seconds we can sleep. Limit   * to 10 minutes for hardware which can program more than   * 32bit ticks so we still get reasonable conversion values.   */  sec = dev->max_delta_ticks;  do_div(sec, freq);  if (!sec)   sec = 1;  else if (sec > 600 && dev->max_delta_ticks > UINT_MAX)   sec = 600;

 clockevents_calc_mult_shift(dev, freq, sec);  dev->min_delta_ns = cev_delta2ns(dev->min_delta_ticks, dev, false);  dev->max_delta_ns = cev_delta2ns(dev->max_delta_ticks, dev, true); }

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值