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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-arm/arch-pxa/time.h
  3.  *
  4.  * Author: Nicolas Pitre
  5.  * Created: Jun 15, 2001
  6.  * Copyright: MontaVista Software Inc.
  7.  * 
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License version 2 as
  10.  * published by the Free Software Foundation.
  11.  */
  12. static inline unsigned long pxa_get_rtc_time(void)
  13. {
  14. return RCNR;
  15. }
  16. static int pxa_set_rtc(void)
  17. {
  18. unsigned long current_time = xtime.tv_sec;
  19. if (RTSR & RTSR_ALE) {
  20. /* make sure not to forward the clock over an alarm */
  21. unsigned long alarm = RTAR;
  22. if (current_time >= alarm && alarm >= RCNR)
  23. return -ERESTARTSYS;
  24. }
  25. RCNR = current_time;
  26. return 0;
  27. }
  28. /* IRQs are disabled before entering here from do_gettimeofday() */
  29. static unsigned long pxa_gettimeoffset (void)
  30. {
  31. unsigned long ticks_to_match, elapsed, usec;
  32. /* Get ticks before next timer match */
  33. ticks_to_match = OSMR0 - OSCR;
  34. /* We need elapsed ticks since last match */
  35. elapsed = LATCH - ticks_to_match;
  36. /* Now convert them to usec */
  37. usec = (unsigned long)(elapsed*tick)/LATCH;
  38. return usec;
  39. }
  40. static void pxa_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  41. {
  42. long flags;
  43. int next_match;
  44. /* Loop until we get ahead of the free running timer.
  45.  * This ensures an exact clock tick count and time acuracy.
  46.  * IRQs are disabled inside the loop to ensure coherence between
  47.  * lost_ticks (updated in do_timer()) and the match reg value, so we
  48.  * can use do_gettimeofday() from interrupt handlers.
  49.  */
  50. do {
  51. do_leds();
  52. do_set_rtc();
  53. save_flags_cli( flags );
  54. do_timer(regs);
  55. OSSR = OSSR_M0;  /* Clear match on timer 0 */
  56. next_match = (OSMR0 += LATCH);
  57. restore_flags( flags );
  58. } while( (signed long)(next_match - OSCR) <= 0 );
  59. }
  60. extern inline void setup_timer (void)
  61. {
  62. gettimeoffset = pxa_gettimeoffset;
  63. set_rtc = pxa_set_rtc;
  64. xtime.tv_sec = pxa_get_rtc_time();
  65. timer_irq.handler = pxa_timer_interrupt;
  66. OSMR0 = 0; /* set initial match at 0 */
  67. OSSR = 0xf; /* clear status on all timers */
  68. setup_arm_irq(IRQ_OST0, &timer_irq);
  69. OIER |= OIER_E0; /* enable match on timer 0 to cause interrupts */
  70. OSCR = 0; /* initialize free-running timer, force first match */
  71. }