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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.time.h 1.17 10/23/01 08:09:35 trini
  3.  */
  4. /*
  5.  * Common time prototypes and such for all ppc machines.
  6.  *
  7.  * Written by Cort Dougan (cort@fsmlabs.com) to merge
  8.  * Paul Mackerras' version and mine for PReP and Pmac.
  9.  */
  10. #ifdef __KERNEL__
  11. #ifndef __ASM_TIME_H__
  12. #define __ASM_TIME_H__
  13. #include <linux/config.h>
  14. #include <linux/mc146818rtc.h>
  15. #include <linux/threads.h>
  16. #include <asm/processor.h>
  17. /* time.c */
  18. extern unsigned tb_ticks_per_jiffy;
  19. extern unsigned tb_to_us;
  20. extern unsigned tb_last_stamp;
  21. extern unsigned long disarm_decr[NR_CPUS];
  22. extern void to_tm(int tim, struct rtc_time * tm);
  23. extern time_t last_rtc_update;
  24. extern void set_dec_cpu6(unsigned int val);
  25. int via_calibrate_decr(void);
  26. /* Accessor functions for the decrementer register.
  27.  * The 4xx doesn't even have a decrementer.  I tried to use the
  28.  * generic timer interrupt code, which seems OK, with the 4xx PIT
  29.  * in auto-reload mode.  The problem is PIT stops counting when it
  30.  * hits zero.  If it would wrap, we could use it just like a decrementer.
  31.  */
  32. static __inline__ unsigned int get_dec(void)
  33. {
  34. #if defined(CONFIG_4xx)
  35. return (mfspr(SPRN_PIT));
  36. #else
  37. return (mfspr(SPRN_DEC));
  38. #endif
  39. }
  40. static __inline__ void set_dec(unsigned int val)
  41. {
  42. #if defined(CONFIG_4xx)
  43. return; /* Have to let it auto-reload */
  44. #elif defined(CONFIG_8xx_CPU6)
  45. set_dec_cpu6(val);
  46. #else
  47. mtspr(SPRN_DEC, val);
  48. #endif
  49. }
  50. /* Accessor functions for the timebase (RTC on 601) registers. */
  51. /* If one day CONFIG_POWER is added just define __USE_RTC as 1 */
  52. #ifdef CONFIG_6xx
  53. extern __inline__ int const __USE_RTC(void) {
  54. return (mfspr(SPRN_PVR)>>16) == 1;
  55. }
  56. #else
  57. #define __USE_RTC() 0
  58. #endif
  59. extern __inline__ unsigned long get_tbl(void) {
  60. unsigned long tbl;
  61. asm volatile("mftb %0" : "=r" (tbl));
  62. return tbl;
  63. }
  64. extern __inline__ unsigned long get_tbu(void) {
  65. unsigned long tbl;
  66. asm volatile("mftbu %0" : "=r" (tbl));
  67. return tbl;
  68. }
  69. extern __inline__ void set_tb(unsigned int upper, unsigned int lower)
  70. {
  71. mtspr(SPRN_TBWL, 0);
  72. mtspr(SPRN_TBWU, upper);
  73. mtspr(SPRN_TBWL, lower);
  74. }
  75. extern __inline__ unsigned long get_rtcl(void) {
  76. unsigned long rtcl;
  77. asm volatile("mfrtcl %0" : "=r" (rtcl));
  78. return rtcl;
  79. }
  80. extern __inline__ unsigned get_native_tbl(void) {
  81. if (__USE_RTC())
  82. return get_rtcl();
  83. else
  84.    return get_tbl();
  85. }
  86. /* On machines with RTC, this function can only be used safely
  87.  * after the timestamp and for 1 second. It is only used by gettimeofday
  88.  * however so it should not matter.
  89.  */
  90. extern __inline__ unsigned tb_ticks_since(unsigned tstamp) {
  91. if (__USE_RTC()) {
  92. int delta = get_rtcl() - tstamp;
  93. return delta<0 ? delta + 1000000000 : delta;
  94. } else {
  95.          return get_tbl() - tstamp;
  96. }
  97. }
  98. #if 0
  99. extern __inline__ unsigned long get_bin_rtcl(void) {
  100.       unsigned long rtcl, rtcu1, rtcu2;
  101.       asm volatile("
  102. 1:    mfrtcu  %0n
  103.       mfrtcl  %1n
  104.       mfrtcu  %2n
  105.       cmpw    %0,%2n
  106.       bne-    1bn"
  107.       : "=r" (rtcu1), "=r" (rtcl), "=r" (rtcu2)
  108.       : : "cr0");
  109.       return rtcu2*1000000000+rtcl;
  110. }
  111. extern __inline__ unsigned binary_tbl(void) {
  112.       if (__USE_RTC())
  113.               return get_bin_rtcl();
  114.       else
  115.               return get_tbl();
  116. }
  117. #endif
  118. /* Use mulhwu to scale processor timebase to timeval */
  119. #define mulhwu(x,y) 
  120. ({unsigned z; asm ("mulhwu %0,%1,%2" : "=r" (z) : "r" (x), "r" (y)); z;})
  121. unsigned mulhwu_scale_factor(unsigned, unsigned);
  122. #endif /* __ASM_TIME_H__ */
  123. #endif /* __KERNEL__ */