ChassisTimerTask.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Brief: Handle all chassis function in this file.
  3. Such as: Fan control, update power_good status, update chassis health status.
  4. * Author: Jimbo_Zhang@outlook.com
  5. * Date: 2019-9-18
  6. */
  7. #include <stdio.h>
  8. #include <stdint.h>
  9. #include <sys/prctl.h>
  10. #include <semaphore.h>
  11. #include <pthread.h>
  12. #include <errno.h>
  13. #include <fcntl.h>
  14. #include <stdlib.h>
  15. #include <unistd.h>
  16. #include <string.h>
  17. #include <pthread.h>
  18. #include "main.h"
  19. #include "ChassisTimerTask.h"
  20. #include "ChassisDevice.h"
  21. #include "com_IPMI_Chassis.h"
  22. #include "SensorMonitor.h"
  23. #include "time.h"
  24. #include "com_IPMI_App.h"
  25. int gFd_ChassisPwrHndlrQue;
  26. void *ChassisTimerTask(void* pArg)
  27. {
  28. MsgPkt_T MsgPkt;
  29. uint32_t preChassisSeconds;
  30. uint32_t preFanSeconds;
  31. uint32_t preIdentifySeconds = 0;
  32. uint8_t IdentifyTickCnt = 0;
  33. prctl(PR_SET_NAME,__FUNCTION__,0,0,0);
  34. printf("ChassisTimerTask Started... \n");
  35. //create
  36. if(-1 != access(CHASSIS_PWR_HNDLR_Q, F_OK))
  37. {
  38. remove(CHASSIS_PWR_HNDLR_Q);
  39. }
  40. if(0 != mkfifo (CHASSIS_PWR_HNDLR_Q, 0777))
  41. {
  42. printf("%s: Create %s fifo failed! %s\n", __FUNCTION__, CHASSIS_PWR_HNDLR_Q, strerror(errno));
  43. return (void*)-1;
  44. }
  45. gFd_ChassisPwrHndlrQue = open (CHASSIS_PWR_HNDLR_Q, O_RDWR);
  46. if(-1 == gFd_ChassisPwrHndlrQue)
  47. {
  48. printf("%s: Open %s fifo failed! %s\n", __FUNCTION__, CHASSIS_PWR_HNDLR_Q, strerror(errno));
  49. return (void*)-1;
  50. }
  51. preChassisSeconds = g_BMCInfo.CurTimerSecond;
  52. preFanSeconds = g_BMCInfo.CurTimerSecond;
  53. while(1)
  54. {
  55. if(GetMsg(gFd_ChassisPwrHndlrQue, &MsgPkt, 0) == 0)
  56. {
  57. if(MsgPkt.Param == PARAM_CHASSIS)
  58. {
  59. //Chassis power control
  60. if((NET_FN(MsgPkt.NetFnLUN) == NETFN_CHASSIS) && (MsgPkt.Cmd == CMD_CHASSIS_CONTROL))
  61. {
  62. switch(MsgPkt.Data[0])
  63. {
  64. case CHASSIS_POWER_DOWN:
  65. PDK_PowerOffChassis();
  66. break;
  67. case CHASSIS_POWER_UP:
  68. PDK_PowerOnChassis();
  69. break;
  70. case CHASSIS_POWER_CYCLE:
  71. PDK_PowerCycleChassis();
  72. break;
  73. case CHASSIS_HARD_RESET:
  74. PDK_ResetChassis();
  75. break;
  76. case CHASSIS_PULSE_DIAGNOSTIC_INTERRUPT:
  77. PDK_DiagInterruptChassis();
  78. break;
  79. case CHASSIS_SOFT_SHUTDOWN:
  80. PDK_SoftOffChassis();
  81. break;
  82. default:
  83. printf("Invalid power control cmd\r\n");
  84. break;
  85. }
  86. }
  87. }
  88. else if(MsgPkt.Param == PARAM_MC)
  89. {
  90. if(((MsgPkt.NetFnLUN>>2) == NETFN_APP) && ((MsgPkt.Cmd == CMD_COLD_RESET) || (MsgPkt.Cmd == CMD_WARM_RESET)))
  91. {
  92. sleep(1);
  93. //NVIC_SystemReset();
  94. //TODO: reset stm32
  95. }
  96. }
  97. }
  98. //Chassis timer interval
  99. if((g_BMCInfo.CurTimerSecond != preChassisSeconds)
  100. &&((g_BMCInfo.CurTimerSecond - preChassisSeconds) >= g_BMCInfo.IpmiConfig.ChassisTimerInterval))
  101. {
  102. //log("Chassis interval\r\n");
  103. preChassisSeconds = g_BMCInfo.CurTimerSecond;
  104. //TODO:
  105. g_BMCInfo.PowerGoodFlag = 1;
  106. g_BMCInfo.IpmiConfig.ChassisPowerState.PowerState = g_BMCInfo.PowerGoodFlag;
  107. }
  108. //Fan control
  109. if((g_BMCInfo.CurTimerSecond != preFanSeconds)
  110. && (g_BMCInfo.CurTimerSecond % g_BMCInfo.IpmiConfig.FanControlInterval) == 0)
  111. {
  112. preFanSeconds = g_BMCInfo.CurTimerSecond;
  113. PDK_FanControl();
  114. }
  115. //Chassis Identify
  116. if(g_BMCInfo.ChassisIdentify == TRUE)
  117. {
  118. if(IdentifyTickCnt == 5) //0.5s
  119. {
  120. IdentifyTickCnt++;
  121. printf("-> Turn on led!\r\n");
  122. }
  123. else if(IdentifyTickCnt == 10)
  124. {
  125. IdentifyTickCnt = 0;
  126. printf("-> Turn off led!\r\n");
  127. }
  128. else
  129. {
  130. IdentifyTickCnt++;
  131. }
  132. //Identify finished
  133. if(((g_BMCInfo.CurTimerSecond - preIdentifySeconds) >= g_BMCInfo.ChassisIdentifyTimeout)
  134. && (g_BMCInfo.ChassisIdentifyForce != 1))
  135. {
  136. g_BMCInfo.ChassisIdentify = FALSE;
  137. }
  138. }
  139. else
  140. {
  141. preIdentifySeconds = g_BMCInfo.CurTimerSecond;
  142. IdentifyTickCnt = 0;
  143. }
  144. sleep(1);
  145. }
  146. }