soc_pstore.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <kernel.h>
  2. #include <device.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <soc.h>
  6. #define RTC_REMAIN2_BIT_JTAG_FLAG 0
  7. #define RTC_REMAIN2_BIT_CAP_FLAG 1
  8. #define RTC_REMAIN2_BIT_OTA_UPGRADE 2
  9. #define RTC_REMAIN2_BIT_WD_RESET_CNT 3 /*bit3-bit6*/
  10. #define RTC_REMAIN2_BIT_SLEEP_DBG_STAGE 8 /*bit8-bit15*/
  11. #define RTC_REMAIN2_BIT_RTC_RC32K_CAL 26 /*bit26*/
  12. #define RTC_REMAIN2_BIT_HR_RESET 27 /*bit27*/
  13. #define RTC_REMAIN2_BIT_SYS_PANIC 28 /*bit28*/
  14. static void soc_ps_setbit_val(mem_addr_t reg_addr, int bit, int bit_width, u32_t value)
  15. {
  16. u32_t tmp,bit_mask;
  17. bit_mask = ~(((1<<bit_width)-1) << bit);
  18. tmp = sys_read32(reg_addr) & bit_mask;
  19. tmp |= (value << bit);
  20. sys_write32(tmp, reg_addr);
  21. }
  22. int soc_pstore_set(u32_t tag, u32_t value)
  23. {
  24. switch(tag){
  25. case SOC_PSTORE_TAG_CAPACITY:
  26. sys_write32(value, RTC_REMAIN1);
  27. break;
  28. case SOC_PSTORE_TAG_FLAG_CAP:
  29. soc_ps_setbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_CAP_FLAG, 1, !!value);
  30. break;
  31. case SOC_PSTORE_TAG_OTA_UPGRADE:
  32. soc_ps_setbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_OTA_UPGRADE, 1, !!value);
  33. break;
  34. case SOC_PSTORE_TAG_FLAG_JTAG:
  35. soc_ps_setbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_JTAG_FLAG, 1, !!value);
  36. break;
  37. case SOC_PSTORE_TAG_WD_RESET_CNT:
  38. soc_ps_setbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_WD_RESET_CNT, 4, value);
  39. break;
  40. case SOC_PSTORE_TAG_SLEEP_DBG_STAGE:
  41. soc_ps_setbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_SLEEP_DBG_STAGE, 8, value);
  42. break;
  43. case SOC_PSTORE_TAG_HR_RESET:
  44. soc_ps_setbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_HR_RESET, 1, value);
  45. break;
  46. case SOC_PSTORE_TAG_SYS_PANIC:
  47. soc_ps_setbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_SYS_PANIC, 1, value);
  48. break;
  49. case SOC_PSTORE_TAG_RTC_RC32K_CAL:
  50. soc_ps_setbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_RTC_RC32K_CAL, 1, value);
  51. break;
  52. default:
  53. return -1;
  54. break;
  55. }
  56. return 0;
  57. }
  58. static void soc_ps_getbit_val(mem_addr_t reg_addr, int bit, int bit_width, u32_t *p_value)
  59. {
  60. u32_t bit_mask;
  61. bit_mask = (1<<bit_width)-1;
  62. *p_value = (sys_read32(reg_addr)>> bit) & bit_mask;
  63. }
  64. int soc_pstore_get(u32_t tag, u32_t *p_value)
  65. {
  66. switch(tag){
  67. case SOC_PSTORE_TAG_CAPACITY:
  68. *p_value = sys_read32(RTC_REMAIN1);
  69. break;
  70. case SOC_PSTORE_TAG_FLAG_CAP:
  71. soc_ps_getbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_CAP_FLAG, 1, p_value);
  72. break;
  73. case SOC_PSTORE_TAG_OTA_UPGRADE:
  74. soc_ps_getbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_OTA_UPGRADE, 1, p_value);
  75. break;
  76. case SOC_PSTORE_TAG_FLAG_JTAG:
  77. soc_ps_getbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_JTAG_FLAG, 1, p_value);
  78. break;
  79. case SOC_PSTORE_TAG_WD_RESET_CNT:
  80. soc_ps_getbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_WD_RESET_CNT, 4, p_value);
  81. break;
  82. case SOC_PSTORE_TAG_SLEEP_DBG_STAGE:
  83. soc_ps_getbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_SLEEP_DBG_STAGE, 8, p_value);
  84. break;
  85. case SOC_PSTORE_TAG_HR_RESET:
  86. soc_ps_getbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_HR_RESET, 1, p_value);
  87. break;
  88. case SOC_PSTORE_TAG_SYS_PANIC:
  89. soc_ps_getbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_SYS_PANIC, 1, p_value);
  90. break;
  91. case SOC_PSTORE_TAG_RTC_RC32K_CAL:
  92. soc_ps_getbit_val(RTC_REMAIN2, RTC_REMAIN2_BIT_RTC_RC32K_CAL, 1, p_value);
  93. break;
  94. default:
  95. return -1;
  96. break;
  97. }
  98. return 0;
  99. }
  100. int soc_pstore_reset_all(void)
  101. {
  102. int i;
  103. for(i = 0; i <6; i++ )
  104. sys_write32(0x0, RTC_REMAIN0+i*4);
  105. return 0;
  106. }