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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-arm/arch-shark/time.h
  3.  *
  4.  * by Alexander Schulz
  5.  *
  6.  * Uses the real time clock because you can't run
  7.  * the timer with level triggered interrupts and
  8.  * you can't run the shark with edge triggered
  9.  * inetrrupts (loses ints and hangs).
  10.  *
  11.  * derived from linux/drivers/char/rtc.c and:
  12.  * linux/include/asm-arm/arch-ebsa110/time.h
  13.  * Copyright (c) 1996,1997,1998 Russell King.
  14.  */
  15. #include <asm/leds.h>
  16. #include <linux/mc146818rtc.h>
  17. #define IRQ_TIMER 8
  18. extern void get_rtc_time(struct rtc_time *rtc_tm);
  19. extern void set_rtc_irq_bit(unsigned char bit);
  20. extern unsigned long epoch;
  21. static void timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  22. {
  23. CMOS_READ(RTC_INTR_FLAGS);
  24. do_leds();
  25. {
  26. #ifdef DIVISOR
  27. static unsigned int divisor;
  28. if (divisor-- == 0) {
  29. divisor = DIVISOR - 1;
  30. #else
  31. {
  32. #endif
  33. do_timer(regs);
  34. }
  35. }
  36. }
  37. /*
  38.  * Set up timer interrupt, and return the current time in seconds.
  39.  */
  40. static inline void setup_timer(void)
  41. {
  42.         struct rtc_time r_time;
  43.         unsigned long flags;
  44. int tmp = 0;
  45. unsigned char val;
  46.         /*
  47.  * Set the clock to 128 Hz, we already have a valid
  48.  * vector now:
  49.  */
  50. while (HZ > (1<<tmp))
  51.   tmp++;
  52. /*
  53.  * Check that the input was really a power of 2.
  54.  */
  55. if (HZ != (1<<tmp))
  56.   panic("Please set HZ to a power of 2!");
  57. save_flags(flags);
  58. cli();
  59. val = CMOS_READ(RTC_FREQ_SELECT) & 0xf0;
  60. val |= (16 - tmp);
  61. CMOS_WRITE(val, RTC_FREQ_SELECT);
  62. restore_flags(flags);
  63. set_rtc_irq_bit(RTC_PIE);
  64. get_rtc_time(&r_time);
  65. xtime.tv_sec = mktime(r_time.tm_year+epoch, r_time.tm_mon+1, r_time.tm_mday,
  66.       r_time.tm_hour, r_time.tm_min, r_time.tm_sec);
  67. timer_irq.handler = timer_interrupt;
  68. timer_irq.flags = SA_INTERRUPT; /* FIXME: really? */
  69. setup_arm_irq(IRQ_TIMER, &timer_irq);
  70. }