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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/arch-mx1ads/time.h
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License as published by
  6.  * the Free Software Foundation; either version 2 of the License, or
  7.  * (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  * Copyright (C) 2002 Shane Nay (shane@minirl.com)
  19.  */
  20. #include <asm/system.h>
  21. /*
  22.  * Where is the timer (VA)?
  23.  */
  24. #define TIMER0_VA_BASE (IO_ADDRESS(MX1ADS_TIM1_BASE)+0x00000000)
  25. #define TIMER1_VA_BASE (IO_ADDRESS(MX1ADS_TIM2_BASE)+0x00000000)
  26. /*
  27.  * How long is the timer interval?
  28.  *
  29.  * Note-
  30.  * Clocking is not accurate enough.  Need to change the input
  31.  * to CLKOUT, and fix what those values are.  However,
  32.  * first need to evaluate what a reasonable value is
  33.  * as several other things depend upon that clock.
  34.  *
  35.  */
  36. #define TIMER_RELOAD (328)
  37. #define TICKS2USECS(x) ((x) * 30)
  38. #define TIM_32KHZ       0x08
  39. #define TIM_INTEN       0x10
  40. #define TIM_ENAB        0x01
  41. /*
  42.  * What does it look like?
  43.  */
  44. typedef struct TimerStruct {
  45. unsigned long TimerControl;
  46. unsigned long TimerPrescaler;
  47. unsigned long TimerCompare;
  48. unsigned long TimerCapture;
  49. unsigned long TimerCounter;
  50. unsigned long TimerClear; /* Clear Status */
  51. } TimerStruct_t;
  52. extern unsigned long (*gettimeoffset) (void);
  53. /*
  54.  * Returns number of ms since last clock interrupt.  Note that interrupts
  55.  * will have been disabled by do_gettimeoffset()
  56.  */
  57. static unsigned long
  58. mx1ads_gettimeoffset(void)
  59. {
  60. volatile TimerStruct_t *timer1 = (TimerStruct_t *) TIMER1_VA_BASE;
  61. unsigned long ticks, status;
  62. /*
  63.  * Get the current number of ticks.  Note that there is a race
  64.  * condition between us reading the timer and checking for
  65.  * an interrupt.  We get around this by ensuring that the
  66.  * counter has not reloaded between our two reads.
  67.  */
  68. ticks = timer1->TimerCounter;
  69. /*
  70.  * Interrupt pending?  If so, we've reloaded once already.
  71.  */
  72. if (timer1->TimerClear & 1)
  73. ticks += TIMER_RELOAD;
  74. /*
  75.  * Convert the ticks to usecs
  76.  */
  77. return TICKS2USECS(ticks);
  78. }
  79. /*
  80.  * IRQ handler for the timer
  81.  */
  82. static void
  83. mx1ads_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  84. {
  85. volatile TimerStruct_t *timer1 =
  86.     (volatile TimerStruct_t *) TIMER1_VA_BASE;
  87. // ...clear the interrupt
  88. if (timer1->TimerClear) {
  89. timer1->TimerClear = 0x0;
  90. }
  91. do_timer(regs);
  92. do_profile(regs);
  93. }
  94. /*
  95.  * Set up timer interrupt, and return the current time in seconds.
  96.  */
  97. static inline void
  98. setup_timer(void)
  99. {
  100. volatile TimerStruct_t *timer0 =
  101.     (volatile TimerStruct_t *) TIMER0_VA_BASE;
  102. volatile TimerStruct_t *timer1 =
  103.     (volatile TimerStruct_t *) TIMER1_VA_BASE;
  104. timer_irq.handler = mx1ads_timer_interrupt;
  105. /*
  106.  * Initialise to a known state (all timers off, and timing reset)
  107.  */
  108. timer0->TimerControl = 0;
  109. timer1->TimerControl = 0;
  110. timer0->TimerPrescaler = 0;
  111. timer1->TimerPrescaler = 0;
  112. timer1->TimerCompare = 328;
  113. timer1->TimerControl = (TIM_32KHZ | TIM_INTEN | TIM_ENAB);
  114. /*
  115.  * Make irqs happen for the system timer
  116.  */
  117. setup_arm_irq(TIM2_INT, &timer_irq);
  118. gettimeoffset = mx1ads_gettimeoffset;
  119. }