time.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/kernel/time.c
  3.  *
  4.  *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
  5.  *  Modifications for ARM (C) 1994, 1995, 1996,1997 Russell King
  6.  *  Copyright (C) 1999 SuSE GmbH, (Philipp Rumpf, prumpf@tux.org)
  7.  *
  8.  * 1994-07-02  Alan Modra
  9.  *             fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime
  10.  * 1998-12-20  Updated NTP code according to technical memorandum Jan '96
  11.  *             "A Kernel Model for Precision Timekeeping" by Dave Mills
  12.  */
  13. #include <linux/errno.h>
  14. #include <linux/sched.h>
  15. #include <linux/kernel.h>
  16. #include <linux/param.h>
  17. #include <linux/string.h>
  18. #include <linux/mm.h>
  19. #include <linux/interrupt.h>
  20. #include <linux/time.h>
  21. #include <linux/init.h>
  22. #include <linux/smp.h>
  23. #include <asm/uaccess.h>
  24. #include <asm/io.h>
  25. #include <asm/irq.h>
  26. #include <asm/param.h>
  27. #include <asm/pdc.h>
  28. #include <asm/led.h>
  29. #include <linux/timex.h>
  30. extern rwlock_t xtime_lock;
  31. static int timer_value;
  32. static int timer_delta;
  33. static struct pdc_tod tod_data __attribute__((aligned(8)));
  34. void timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  35. {
  36. int old;
  37. int lost = 0;
  38. int cr16;
  39. old = timer_value;
  40. cr16 = mfctl(16);
  41. while((timer_value - cr16) < (timer_delta / 2)) {
  42. timer_value += timer_delta;
  43. lost++;
  44. }
  45. mtctl(timer_value ,16);
  46. do_timer(regs);
  47.     
  48. led_interrupt_func();
  49. }
  50. void do_gettimeofday(struct timeval *tv)
  51. {
  52. unsigned long flags;
  53. read_lock_irqsave(&xtime_lock, flags);
  54. tv->tv_sec = xtime.tv_sec;
  55. tv->tv_usec = xtime.tv_usec;
  56. read_unlock_irqrestore(&xtime_lock, flags);
  57. }
  58. void do_settimeofday(struct timeval *tv)
  59. {
  60. write_lock_irq(&xtime_lock);
  61. xtime.tv_sec = tv->tv_sec;
  62. xtime.tv_usec = tv->tv_usec;
  63. write_unlock_irq(&xtime_lock);
  64. }
  65. void __init time_init(void)
  66. {
  67. timer_delta = (100 * PAGE0->mem_10msec) / HZ;
  68. /* make the first timer interrupt go off in one second */
  69. timer_value = mfctl(16) + (HZ * timer_delta);
  70. mtctl(timer_value, 16);
  71. if(pdc_tod_read(&tod_data) == 0) {
  72. xtime.tv_sec = tod_data.tod_sec;
  73. xtime.tv_usec = tod_data.tod_usec;
  74. } else {
  75. printk(KERN_ERR "Error reading tod clockn");
  76.         xtime.tv_sec = 0;
  77. xtime.tv_usec = 0;
  78. }
  79. }