watchdog.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:2k
源码类别:

DVD

开发平台:

C/C++

  1. #include "stsys.h"
  2. #include "sti5105.h"
  3. #include "gendef.h"
  4. #include "sysserv.h"
  5. #include "SysServReg.h"
  6. #define WD_TICKS_PER_SEC  (1)
  7. #define WD_RESET_CPU_PERIOD  (1) /* 1 sec */
  8. typedef struct wd_control_s
  9. {
  10.     volatile int wd_count_0 : 16; /* [15:0]: watchdog count */
  11.     volatile int reserved_0 : 16;
  12.     volatile int wd_count_1 : 4;  /* [19:16]: watchdog count */
  13.     volatile int wd_count_en: 1;  /* watchdog counter enable */
  14. volatile int reserved_1 : 27;
  15. } wd_control_t;
  16. static wd_control_t *wd_reg = (wd_control_t*)WATCHDOG_COUNTER_CFG0;
  17. static void KD_WDPeriod(UINT32 time); /* in second */
  18. static void WatchdogResetEnable(void);
  19. static void WatchdogResetDisable(void);
  20. /* Ref the register RESET_STATUS: SysServBaseAddress + 0x140
  21. ** Bit[11] RESET_SELECT_ALT: 
  22. ** Bit[6] Mask for watchdog reset
  23. ** Bit[4] PAD_RESET_STATUS
  24. */
  25. #define WD_MASK_BITS (0x850)
  26. static UINT8 isWDResetEn = 0;
  27. static void WatchdogResetEnable(void)
  28. {
  29. UINT32 tmp;
  30. if(isWDResetEn) return;
  31. tmp = STSYS_ReadRegDev32LE(CKG_RESET_STATUS);
  32. /*Enable the watchdog reset*/
  33. tmp &= (~WD_MASK_BITS);
  34. STSYS_WriteRegDev32LE(CKG_RESET_STATUS, tmp);
  35. isWDResetEn = 1;
  36. }
  37. static void WatchdogResetDisable(void)
  38. {
  39. UINT32 tmp;
  40. if(!isWDResetEn) return;
  41. tmp = STSYS_ReadRegDev32LE(CKG_RESET_STATUS);
  42. /* Disable the watchdog reset*/
  43. tmp |= WD_MASK_BITS;
  44. STSYS_WriteRegDev32LE(CKG_RESET_STATUS, tmp);
  45. isWDResetEn = 0;
  46. }
  47. void KB_SysWDEnable(UINT32 timeout)
  48. {
  49. KB_SysWDDisable();
  50. KD_WDPeriod(timeout);
  51. wd_reg->wd_count_en = 1;
  52. WatchdogResetEnable();
  53. }
  54. void KB_SysWDDisable(void)
  55. {
  56. WatchdogResetDisable();
  57. wd_reg->wd_count_en = 0;
  58. }
  59. static void KD_WDPeriod(UINT32 time)
  60. {
  61. UINT32 ticks;
  62. ticks = WD_TICKS_PER_SEC * time;
  63. wd_reg->wd_count_1 = (int)((ticks >> 16) & 0xF);
  64. wd_reg->wd_count_0 = (int)(ticks & 0xFFFF);
  65. }
  66. void KB_SysWDReset(void)
  67. {
  68.     /* force a watchdog timeout. */
  69.     KB_SysWDEnable(WD_RESET_CPU_PERIOD);
  70.     KD_WDPeriod(0) ;
  71. while(1) ;
  72. }
  73. /* EOF */