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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/m68k/sun3x/time.c
  3.  *
  4.  *  Sun3x-specific time handling
  5.  */
  6. #include <linux/types.h>
  7. #include <linux/kd.h>
  8. #include <linux/init.h>
  9. #include <linux/sched.h>
  10. #include <linux/kernel_stat.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/rtc.h>
  13. #include <asm/irq.h>
  14. #include <asm/io.h>
  15. #include <asm/system.h>
  16. #include <asm/traps.h>
  17. #include <asm/sun3x.h>
  18. #include <asm/sun3ints.h>
  19. #include <asm/rtc.h>
  20. #include "time.h"
  21. #define M_CONTROL 0xf8
  22. #define M_SEC     0xf9
  23. #define M_MIN     0xfa
  24. #define M_HOUR    0xfb
  25. #define M_DAY     0xfc
  26. #define M_DATE    0xfd
  27. #define M_MONTH   0xfe
  28. #define M_YEAR    0xff
  29. #define C_WRITE   0x80
  30. #define C_READ    0x40
  31. #define C_SIGN    0x20
  32. #define C_CALIB   0x1f
  33. #define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10)
  34. #define BIN_TO_BCD(val) (((val/10) << 4) | (val % 10))
  35. /* Read the Mostek */
  36. void sun3x_gettod (int *yearp, int *monp, int *dayp,
  37.                    int *hourp, int *minp, int *secp)
  38. {
  39.     volatile unsigned char *eeprom = (unsigned char *)SUN3X_EEPROM;
  40.     /* Stop updates */
  41.     *(eeprom + M_CONTROL) |= C_READ;
  42.     /* Read values */
  43.     *yearp = BCD_TO_BIN(*(eeprom + M_YEAR));
  44.     *monp  = BCD_TO_BIN(*(eeprom + M_MONTH)) +1;
  45.     *dayp  = BCD_TO_BIN(*(eeprom + M_DATE));
  46.     *hourp = BCD_TO_BIN(*(eeprom + M_HOUR));
  47.     *minp  = BCD_TO_BIN(*(eeprom + M_MIN));
  48.     *secp  = BCD_TO_BIN(*(eeprom + M_SEC));
  49.     /* Restart updates */
  50.     *(eeprom + M_CONTROL) &= ~C_READ;
  51. }
  52. int sun3x_hwclk(int set, struct rtc_time *t)
  53. {
  54. volatile struct mostek_dt *h =
  55. (struct mostek_dt *)(SUN3X_EEPROM+M_CONTROL);
  56. unsigned long flags;
  57. save_and_cli(flags);
  58. if(set) {
  59. h->csr |= C_WRITE;
  60. h->sec = BIN_TO_BCD(t->tm_sec);
  61. h->min = BIN_TO_BCD(t->tm_min);
  62. h->hour = BIN_TO_BCD(t->tm_hour);
  63. h->wday = BIN_TO_BCD(t->tm_wday);
  64. h->mday = BIN_TO_BCD(t->tm_mday);
  65. h->month = BIN_TO_BCD(t->tm_mon);
  66. h->year = BIN_TO_BCD(t->tm_year);
  67. h->csr &= ~C_WRITE;
  68. } else {
  69. h->csr |= C_READ;
  70. t->tm_sec = BCD_TO_BIN(h->sec);
  71. t->tm_min = BCD_TO_BIN(h->min);
  72. t->tm_hour = BCD_TO_BIN(h->hour);
  73. t->tm_wday = BCD_TO_BIN(h->wday);
  74. t->tm_mday = BCD_TO_BIN(h->mday);
  75. t->tm_mon = BCD_TO_BIN(h->month);
  76. t->tm_year = BCD_TO_BIN(h->year);
  77. h->csr &= ~C_READ;
  78. }
  79. restore_flags(flags);
  80. return 0;
  81. }
  82. /* Not much we can do here */
  83. unsigned long sun3x_gettimeoffset (void)
  84. {
  85.     return 0L;
  86. }
  87. #if 0
  88. static void sun3x_timer_tick(int irq, void *dev_id, struct pt_regs *regs)
  89. {
  90.     void (*vector)(int, void *, struct pt_regs *) = dev_id;
  91.     /* Clear the pending interrupt - pulse the enable line low */
  92.     disable_irq(5);
  93.     enable_irq(5);
  94.     
  95.     vector(irq, NULL, regs);
  96. }
  97. #endif
  98. void __init sun3x_sched_init(void (*vector)(int, void *, struct pt_regs *))
  99. {
  100. sun3_disable_interrupts();
  101.     /* Pulse enable low to get the clock started */
  102. sun3_disable_irq(5);
  103. sun3_enable_irq(5);
  104. sun3_enable_interrupts();
  105. }