time.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:16k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: time.c,v 1.14 2002/03/05 13:31:03 johana Exp $
  2.  *
  3.  *  linux/arch/cris/kernel/time.c
  4.  *
  5.  *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
  6.  *  Copyright (C) 1999, 2000, 2001 Axis Communications AB
  7.  *
  8.  * 1994-07-02    Alan Modra
  9.  * fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime
  10.  * 1995-03-26    Markus Kuhn
  11.  *      fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887
  12.  *      precision CMOS clock update
  13.  * 1996-05-03    Ingo Molnar
  14.  *      fixed time warps in do_[slow|fast]_gettimeoffset()
  15.  * 1997-09-10 Updated NTP code according to technical memorandum Jan '96
  16.  * "A Kernel Model for Precision Timekeeping" by Dave Mills
  17.  *
  18.  * Linux/CRIS specific code:
  19.  *
  20.  * Authors:    Bjorn Wesen
  21.  *             Johan Adolfsson  
  22.  * 2002-03-04    Johan Adolfsson
  23.  *      Use prescale timer at 25000 Hz instead of the baudrate timer at 
  24.  *      19200 to get rid of the 64ppm to fast timer (and we get better 
  25.  *      resolution within a jiffie as well.
  26.  * 2002-03-05    Johan Adolfsson
  27.  *      Use prescaler in do_slow_gettimeoffset() to get 1 us resolution (40ns)
  28.  *
  29.  */
  30. #include <linux/errno.h>
  31. #include <linux/sched.h>
  32. #include <linux/init.h>
  33. #include <linux/kernel.h>
  34. #include <linux/param.h>
  35. #include <linux/string.h>
  36. #include <linux/mm.h>
  37. #include <linux/interrupt.h>
  38. #include <linux/time.h>
  39. #include <linux/delay.h>
  40. #include <asm/segment.h>
  41. #include <asm/io.h>
  42. #include <asm/irq.h>
  43. #include <asm/delay.h>
  44. #include <asm/rtc.h>
  45. #include <linux/timex.h>
  46. #include <linux/config.h>
  47. #include <asm/svinto.h>
  48. #define CRIS_TEST_TIMERS 0
  49. static int have_rtc;  /* used to remember if we have an RTC or not */
  50. /* define this if you need to use print_timestamp */
  51. /* it will make jiffies at 96 hz instead of 100 hz though */
  52. #undef USE_CASCADE_TIMERS
  53. extern int setup_etrax_irq(int, struct irqaction *);
  54. #define TICK_SIZE tick
  55. /* The timers count from their initial value down to 1 
  56.  * The R_TIMER0_DATA counts down when R_TIM_PRESC_STATUS reaches halv
  57.  * of the divider value.
  58.  */ 
  59. unsigned long get_ns_in_jiffie(void)
  60. {
  61. unsigned char timer_count, t1;
  62. unsigned short presc_count;
  63. unsigned long ns;
  64. unsigned long flags;
  65. save_flags(flags);
  66. cli();
  67. timer_count = *R_TIMER0_DATA;
  68. presc_count = *R_TIM_PRESC_STATUS;  
  69. /* presc_count might be wrapped */
  70. t1 = *R_TIMER0_DATA;
  71. if (timer_count != t1){
  72. /* it wrapped, read prescaler again...  */
  73. presc_count = *R_TIM_PRESC_STATUS;
  74. timer_count = t1;
  75. }
  76. restore_flags(flags);
  77. if (presc_count >= PRESCALE_VALUE/2 ){
  78. presc_count =  PRESCALE_VALUE - presc_count + PRESCALE_VALUE/2;
  79. } else {
  80. presc_count =  PRESCALE_VALUE - presc_count - PRESCALE_VALUE/2;
  81. }
  82. ns = ( (TIMER0_DIV - timer_count) * ((1000000000/HZ)/TIMER0_DIV )) + 
  83.      ( (presc_count) * (1000000000/PRESCALE_FREQ));
  84. return ns;
  85. }
  86. #if CRIS_TEST_TIMERS 
  87. #define NS_TEST_SIZE 4000
  88. static unsigned long ns_test[NS_TEST_SIZE];
  89. void cris_test_timers(void)
  90. {
  91. int i;
  92. #if 0
  93. for (i = 0; i < NS_TEST_SIZE; i++)
  94. {
  95. ns_test[i] = *R_TIMER0_DATA | (*R_TIM_PRESC_STATUS<<16);
  96. }
  97. for (i = 1; i < NS_TEST_SIZE; i++)
  98. {
  99. printk("%4i. %lu %lu %09lu ns n",
  100.        i, ns_test[i]&0x0FFFF, (ns_test[i]>>16), 
  101. get_ns_in_jiffie_from_data(ns_test[i]&0x0FFFF, ns_test[i]>>16));
  102. }
  103. #else
  104. for (i = 0; i < NS_TEST_SIZE; i++)
  105. {
  106. ns_test[i] = get_ns_in_jiffie();
  107. }
  108. for (i = 1; i < NS_TEST_SIZE; i++)
  109. {
  110. printk("%4i. %09lu ns diff %li nsn",
  111.        i, ns_test[i], ns_test[i]- ns_test[i-1]);
  112. }
  113. #endif
  114. }
  115. #endif
  116. static unsigned long do_slow_gettimeoffset(void)
  117. {
  118. unsigned long count, t1;
  119. unsigned long usec_count = 0;
  120. unsigned short presc_count;
  121. static unsigned long count_p = TIMER0_DIV;/* for the first call after boot */
  122. static unsigned long jiffies_p = 0;
  123. /*
  124.  * cache volatile jiffies temporarily; we have IRQs turned off. 
  125.  */
  126. unsigned long jiffies_t;
  127. /* The timer interrupt comes from Etrax timer 0. In order to get
  128.  * better precision, we check the current value. It might have
  129.  * underflowed already though.
  130.  */
  131. #ifndef CONFIG_SVINTO_SIM
  132. /* Not available in the xsim simulator. */
  133. count = *R_TIMER0_DATA;
  134. presc_count = *R_TIM_PRESC_STATUS;  
  135. /* presc_count might be wrapped */
  136. t1 = *R_TIMER0_DATA;
  137. if (count != t1){
  138. /* it wrapped, read prescaler again...  */
  139. presc_count = *R_TIM_PRESC_STATUS;
  140. count = t1;
  141. }
  142. #else
  143. count = 0;
  144. presc_count = 0;
  145. #endif
  146.   jiffies_t = jiffies;
  147. /*
  148.  * avoiding timer inconsistencies (they are rare, but they happen)...
  149.  * there are three kinds of problems that must be avoided here:
  150.  *  1. the timer counter underflows
  151.  *  2. we are after the timer interrupt, but the bottom half handler
  152.  *     hasn't executed yet.
  153.  */
  154. if( jiffies_t == jiffies_p ) {
  155. if( count > count_p ) {
  156. /* Timer wrapped, use new count and prescale 
  157.  * increase the time corresponding to one jiffie
  158.  */
  159. usec_count = 1000000/HZ;
  160. }
  161. } else
  162. jiffies_p = jiffies_t;
  163.         count_p = count;
  164. if (presc_count >= PRESCALE_VALUE/2 ){
  165. presc_count =  PRESCALE_VALUE - presc_count + PRESCALE_VALUE/2;
  166. } else {
  167. presc_count =  PRESCALE_VALUE - presc_count - PRESCALE_VALUE/2;
  168. }
  169. /* Convert timer value to usec */
  170. usec_count += ( (TIMER0_DIV - count) * (1000000/HZ)/TIMER0_DIV ) +
  171.               (( (presc_count) * (1000000000/PRESCALE_FREQ))/1000);
  172. return usec_count;
  173. }
  174. static unsigned long (*do_gettimeoffset)(void) = do_slow_gettimeoffset;
  175. /*
  176.  * This version of gettimeofday has near microsecond resolution.
  177.  */
  178. void do_gettimeofday(struct timeval *tv)
  179. {
  180. unsigned long flags;
  181. save_flags(flags);
  182. cli();
  183. *tv = xtime;
  184. tv->tv_usec += do_gettimeoffset();
  185. restore_flags(flags);
  186. while (tv->tv_usec >= 1000000) {
  187. tv->tv_usec -= 1000000;
  188. tv->tv_sec++;
  189. }
  190. }
  191. void do_settimeofday(struct timeval *tv)
  192. {
  193. cli();
  194. /* This is revolting. We need to set the xtime.tv_usec
  195.  * correctly. However, the value in this location is
  196.  * is value at the last tick.
  197.  * Discover what correction gettimeofday
  198.  * would have done, and then undo it!
  199.  */
  200. tv->tv_usec -= do_gettimeoffset();
  201. if (tv->tv_usec < 0) {
  202. tv->tv_usec += 1000000;
  203. tv->tv_sec--;
  204. }
  205. xtime = *tv;
  206. time_adjust = 0; /* stop active adjtime() */
  207. time_status |= STA_UNSYNC;
  208. time_state = TIME_ERROR; /* p. 24, (a) */
  209. time_maxerror = NTP_PHASE_LIMIT;
  210. time_esterror = NTP_PHASE_LIMIT;
  211. sti();
  212. }
  213. /*
  214.  * BUG: This routine does not handle hour overflow properly; it just
  215.  *      sets the minutes. Usually you'll only notice that after reboot!
  216.  */
  217. static int set_rtc_mmss(unsigned long nowtime)
  218. {
  219. int retval = 0;
  220. int real_seconds, real_minutes, cmos_minutes;
  221. printk("set_rtc_mmss(%lu)n", nowtime);
  222. if(!have_rtc)
  223. return 0;
  224. cmos_minutes = CMOS_READ(RTC_MINUTES);
  225. BCD_TO_BIN(cmos_minutes);
  226. /*
  227.  * since we're only adjusting minutes and seconds,
  228.  * don't interfere with hour overflow. This avoids
  229.  * messing with unknown time zones but requires your
  230.  * RTC not to be off by more than 15 minutes
  231.  */
  232. real_seconds = nowtime % 60;
  233. real_minutes = nowtime / 60;
  234. if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
  235. real_minutes += 30; /* correct for half hour time zone */
  236. real_minutes %= 60;
  237. if (abs(real_minutes - cmos_minutes) < 30) {
  238. BIN_TO_BCD(real_seconds);
  239. BIN_TO_BCD(real_minutes);
  240. CMOS_WRITE(real_seconds,RTC_SECONDS);
  241. CMOS_WRITE(real_minutes,RTC_MINUTES);
  242. } else {
  243. printk(KERN_WARNING
  244.        "set_rtc_mmss: can't update from %d to %dn",
  245.        cmos_minutes, real_minutes);
  246. retval = -1;
  247. }
  248. return retval;
  249. }
  250. /* Excerpt from the Etrax100 HSDD about the built-in watchdog:
  251.  *
  252.  * 3.10.4 Watchdog timer
  253.  * When the watchdog timer is started, it generates an NMI if the watchdog
  254.  * isn't restarted or stopped within 0.1 s. If it still isn't restarted or
  255.  * stopped after an additional 3.3 ms, the watchdog resets the chip.
  256.  * The watchdog timer is stopped after reset. The watchdog timer is controlled
  257.  * by the R_WATCHDOG register. The R_WATCHDOG register contains an enable bit
  258.  * and a 3-bit key value. The effect of writing to the R_WATCHDOG register is
  259.  * described in the table below:
  260.  * 
  261.  *   Watchdog    Value written:
  262.  *   state:      To enable:  To key:      Operation:
  263.  *   --------    ----------  -------      ----------
  264.  *   stopped         0         X          No effect.
  265.  *   stopped         1       key_val      Start watchdog with key = key_val.
  266.  *   started         0       ~key         Stop watchdog
  267.  *   started         1       ~key         Restart watchdog with key = ~key.
  268.  *   started         X       new_key_val  Change key to new_key_val.
  269.  * 
  270.  * Note: '~' is the bitwise NOT operator.
  271.  * 
  272.  */
  273. /* right now, starting the watchdog is the same as resetting it */
  274. #define start_watchdog reset_watchdog
  275. #if defined(CONFIG_ETRAX_WATCHDOG) && !defined(CONFIG_SVINTO_SIM)
  276. static int watchdog_key = 0;  /* arbitrary number */
  277. #endif
  278. /* number of pages to consider "out of memory". it is normal that the memory
  279.  * is used though, so put this really low.
  280.  */
  281. #define WATCHDOG_MIN_FREE_PAGES 8
  282. void
  283. reset_watchdog(void)
  284. {
  285. #if defined(CONFIG_ETRAX_WATCHDOG) && !defined(CONFIG_SVINTO_SIM)
  286. /* only keep watchdog happy as long as we have memory left! */
  287. if(nr_free_pages() > WATCHDOG_MIN_FREE_PAGES) {
  288. /* reset the watchdog with the inverse of the old key */
  289. watchdog_key ^= 0x7; /* invert key, which is 3 bits */
  290. *R_WATCHDOG = IO_FIELD(R_WATCHDOG, key, watchdog_key) |
  291. IO_STATE(R_WATCHDOG, enable, start);
  292. }
  293. #endif
  294. }
  295. /* stop the watchdog - we still need the correct key */
  296. void 
  297. stop_watchdog(void)
  298. {
  299. #if defined(CONFIG_ETRAX_WATCHDOG) && !defined(CONFIG_SVINTO_SIM)
  300. watchdog_key ^= 0x7; /* invert key, which is 3 bits */
  301. *R_WATCHDOG = IO_FIELD(R_WATCHDOG, key, watchdog_key) |
  302. IO_STATE(R_WATCHDOG, enable, stop);
  303. #endif
  304. }
  305. /* last time the cmos clock got updated */
  306. static long last_rtc_update = 0;
  307. /*
  308.  * timer_interrupt() needs to keep up the real-time clock,
  309.  * as well as call the "do_timer()" routine every clocktick
  310.  */
  311. //static unsigned short myjiff; /* used by our debug routine print_timestamp */
  312. static inline void
  313. timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  314. {
  315. /* acknowledge the timer irq */
  316. #ifdef USE_CASCADE_TIMERS
  317. *R_TIMER_CTRL =
  318. IO_FIELD( R_TIMER_CTRL, timerdiv1, 0) |
  319. IO_FIELD( R_TIMER_CTRL, timerdiv0, 0) |
  320. IO_STATE( R_TIMER_CTRL, i1, clr) |
  321. IO_STATE( R_TIMER_CTRL, tm1, run) |
  322. IO_STATE( R_TIMER_CTRL, clksel1, cascade0) |
  323. IO_STATE( R_TIMER_CTRL, i0, clr) |
  324. IO_STATE( R_TIMER_CTRL, tm0, run) |
  325. IO_STATE( R_TIMER_CTRL, clksel0, c6250kHz);
  326. #else
  327. *R_TIMER_CTRL = r_timer_ctrl_shadow | 
  328. IO_STATE(R_TIMER_CTRL, i0, clr);
  329. #endif
  330. /* reset watchdog otherwise it resets us! */
  331. reset_watchdog();
  332. /* call the real timer interrupt handler */
  333. do_timer(regs);
  334. /*
  335.  * If we have an externally synchronized Linux clock, then update
  336.  * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
  337.  * called as close as possible to 500 ms before the new second starts.
  338.  */
  339. if ((time_status & STA_UNSYNC) == 0 &&
  340.     xtime.tv_sec > last_rtc_update + 660 &&
  341.     xtime.tv_usec > 500000 - (tick >> 1) &&
  342.     xtime.tv_usec < 500000 + (tick >> 1)) {
  343. if (set_rtc_mmss(xtime.tv_sec) == 0)
  344. last_rtc_update = xtime.tv_sec;
  345. else
  346. last_rtc_update = xtime.tv_sec - 600;
  347. }
  348. }
  349. #if 0
  350. /* some old debug code for testing the microsecond timing of packets */
  351. static unsigned int lastjiff;
  352. void print_timestamp(const char *s)
  353. {
  354. unsigned long flags;
  355. unsigned int newjiff;
  356. save_flags(flags);
  357. cli();
  358. newjiff = (myjiff << 16) | (unsigned short)(-*R_TIMER01_DATA); 
  359. printk("%s: %x (%x)n", s, newjiff, newjiff - lastjiff);
  360. lastjiff = newjiff;
  361. restore_flags(flags);
  362. }
  363. #endif
  364. /* grab the time from the RTC chip */
  365. unsigned long
  366. get_cmos_time(void)
  367. {
  368. unsigned int year, mon, day, hour, min, sec;
  369. sec = CMOS_READ(RTC_SECONDS);
  370. min = CMOS_READ(RTC_MINUTES);
  371. hour = CMOS_READ(RTC_HOURS);
  372. day = CMOS_READ(RTC_DAY_OF_MONTH);
  373. mon = CMOS_READ(RTC_MONTH);
  374. year = CMOS_READ(RTC_YEAR);
  375. printk("rtc: sec 0x%x min 0x%x hour 0x%x day 0x%x mon 0x%x year 0x%xn", 
  376.        sec, min, hour, day, mon, year);
  377. BCD_TO_BIN(sec);
  378. BCD_TO_BIN(min);
  379. BCD_TO_BIN(hour);
  380. BCD_TO_BIN(day);
  381. BCD_TO_BIN(mon);
  382. BCD_TO_BIN(year);
  383. if ((year += 1900) < 1970)
  384. year += 100;
  385. return mktime(year, mon, day, hour, min, sec);
  386. }
  387. /* update xtime from the CMOS settings. used when /dev/rtc gets a SET_TIME.
  388.  * TODO: this doesn't reset the fancy NTP phase stuff as do_settimeofday does.
  389.  */
  390. void
  391. update_xtime_from_cmos(void)
  392. {
  393. if(have_rtc) {
  394. xtime.tv_sec = get_cmos_time();
  395. xtime.tv_usec = 0;
  396. }
  397. }
  398. /* timer is SA_SHIRQ so drivers can add stuff to the timer irq chain
  399.  * it needs to be SA_INTERRUPT to make the jiffies update work properly
  400.  */
  401. static struct irqaction irq2  = { timer_interrupt, SA_SHIRQ | SA_INTERRUPT,
  402.   0, "timer", NULL, NULL};
  403. void __init
  404. time_init(void)
  405. {
  406. /* probe for the RTC and read it if it exists */
  407. if(RTC_INIT() < 0) {
  408. /* no RTC, start at 1980 */
  409. xtime.tv_sec = 0;
  410. xtime.tv_usec = 0;
  411. have_rtc = 0;
  412. } else {
  413. /* get the current time */
  414. have_rtc = 1;
  415. update_xtime_from_cmos();
  416. }
  417. /* Setup the etrax timers
  418.  * Base frequency is 19200 hz, divider 192 -> 100 hz as Linux wants
  419.  * In normal mode, we use timer0, so timer1 is free. In cascade
  420.  * mode (which we sometimes use for debugging) both timers are used.
  421.  * Remember that linux/timex.h contains #defines that rely on the
  422.  * timer settings below (hz and divide factor) !!!
  423.  */
  424. #ifdef USE_CASCADE_TIMERS
  425. *R_TIMER_CTRL =
  426. IO_FIELD( R_TIMER_CTRL, timerdiv1, 0) |
  427. IO_FIELD( R_TIMER_CTRL, timerdiv0, 0) |
  428. IO_STATE( R_TIMER_CTRL, i1, nop) |
  429. IO_STATE( R_TIMER_CTRL, tm1, stop_ld) |
  430. IO_STATE( R_TIMER_CTRL, clksel1, cascade0) |
  431. IO_STATE( R_TIMER_CTRL, i0, nop) |
  432. IO_STATE( R_TIMER_CTRL, tm0, stop_ld) |
  433. IO_STATE( R_TIMER_CTRL, clksel0, c6250kHz);
  434. *R_TIMER_CTRL = r_timer_ctrl_shadow = 
  435. IO_FIELD( R_TIMER_CTRL, timerdiv1, 0) |
  436. IO_FIELD( R_TIMER_CTRL, timerdiv0, 0) |
  437. IO_STATE( R_TIMER_CTRL, i1, nop) |
  438. IO_STATE( R_TIMER_CTRL, tm1, run) |
  439. IO_STATE( R_TIMER_CTRL, clksel1, cascade0) |
  440. IO_STATE( R_TIMER_CTRL, i0, nop) |
  441. IO_STATE( R_TIMER_CTRL, tm0, run) |
  442. IO_STATE( R_TIMER_CTRL, clksel0, c6250kHz);
  443. #else
  444.   
  445. *R_TIMER_CTRL = 
  446. IO_FIELD(R_TIMER_CTRL, timerdiv1, 192)      | 
  447. IO_FIELD(R_TIMER_CTRL, timerdiv0, TIMER0_DIV)      |
  448. IO_STATE(R_TIMER_CTRL, i1,        nop)      | 
  449. IO_STATE(R_TIMER_CTRL, tm1,       stop_ld)  |
  450. IO_STATE(R_TIMER_CTRL, clksel1,   c19k2Hz)  |
  451. IO_STATE(R_TIMER_CTRL, i0,        nop)      |
  452. IO_STATE(R_TIMER_CTRL, tm0,       stop_ld)  |
  453. IO_STATE(R_TIMER_CTRL, clksel0,   flexible);
  454. *R_TIMER_CTRL = r_timer_ctrl_shadow =
  455. IO_FIELD(R_TIMER_CTRL, timerdiv1, 192)      | 
  456. IO_FIELD(R_TIMER_CTRL, timerdiv0, TIMER0_DIV)      |
  457. IO_STATE(R_TIMER_CTRL, i1,        nop)      |
  458. IO_STATE(R_TIMER_CTRL, tm1,       run)      |
  459. IO_STATE(R_TIMER_CTRL, clksel1,   c19k2Hz)  |
  460. IO_STATE(R_TIMER_CTRL, i0,        nop)      |
  461. IO_STATE(R_TIMER_CTRL, tm0,       run)      |
  462. IO_STATE(R_TIMER_CTRL, clksel0,   flexible);
  463. *R_TIMER_PRESCALE = PRESCALE_VALUE;
  464. #endif
  465. #if CRIS_TEST_TIMERS
  466. cris_test_timers();
  467. #endif
  468. *R_IRQ_MASK0_SET =
  469. IO_STATE(R_IRQ_MASK0_SET, timer0, set); /* unmask the timer irq */
  470. /* now actually register the timer irq handler that calls timer_interrupt() */
  471. setup_etrax_irq(2, &irq2); /* irq 2 is the timer0 irq in etrax */
  472. /* enable watchdog if we should use one */
  473. #if defined(CONFIG_ETRAX_WATCHDOG) && !defined(CONFIG_SVINTO_SIM)
  474. printk("Enabling watchdog...n");
  475. start_watchdog();
  476. /* If we use the hardware watchdog, we want to trap it as an NMI
  477.    and dump registers before it resets us.  For this to happen, we
  478.    must set the "m" NMI enable flag (which once set, is unset only
  479.    when an NMI is taken).
  480.    The same goes for the external NMI, but that doesn't have any
  481.    driver or infrastructure support yet.  */
  482. asm ("setf m");
  483. *R_IRQ_MASK0_SET =
  484. IO_STATE(R_IRQ_MASK0_SET, watchdog_nmi, set);
  485. *R_VECT_MASK_SET =
  486. IO_STATE(R_VECT_MASK_SET, nmi, set);
  487. #endif
  488. }