ChassisTimerTask.c 4.0 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. #include "hal_interface_api.h"
  26. int gFd_ChassisPwrHndlrQue;
  27. void *ChassisTimerTask(void* pArg)
  28. {
  29. MsgPkt_T MsgPkt;
  30. uint32_t preChassisSeconds;
  31. uint32_t preFanSeconds;
  32. uint32_t preIdentifySeconds = 0;
  33. uint8_t IdentifyTickCnt = 0;
  34. prctl(PR_SET_NAME,__FUNCTION__,0,0,0);
  35. printf("ChassisTimerTask Started... \n");
  36. //create
  37. if(-1 != access(CHASSIS_PWR_HNDLR_Q, F_OK))
  38. {
  39. remove(CHASSIS_PWR_HNDLR_Q);
  40. }
  41. if(0 != mkfifo (CHASSIS_PWR_HNDLR_Q, 0777))
  42. {
  43. printf("%s: Create %s fifo failed! %s\n", __FUNCTION__, CHASSIS_PWR_HNDLR_Q, strerror(errno));
  44. return (void*)-1;
  45. }
  46. gFd_ChassisPwrHndlrQue = open (CHASSIS_PWR_HNDLR_Q, O_RDWR);
  47. if(-1 == gFd_ChassisPwrHndlrQue)
  48. {
  49. printf("%s: Open %s fifo failed! %s\n", __FUNCTION__, CHASSIS_PWR_HNDLR_Q, strerror(errno));
  50. return (void*)-1;
  51. }
  52. preChassisSeconds = g_BMCInfo.CurTimerSecond;
  53. preFanSeconds = g_BMCInfo.CurTimerSecond;
  54. while(1)
  55. {
  56. if(GetMsg(gFd_ChassisPwrHndlrQue, &MsgPkt, 0) == 0)
  57. {
  58. if(MsgPkt.Param == PARAM_CHASSIS)
  59. {
  60. //Chassis power control
  61. if((NET_FN(MsgPkt.NetFnLUN) == NETFN_CHASSIS) && (MsgPkt.Cmd == CMD_CHASSIS_CONTROL))
  62. {
  63. switch(MsgPkt.Data[0])
  64. {
  65. case CHASSIS_POWER_DOWN:
  66. PDK_PowerOffChassis();
  67. break;
  68. case CHASSIS_POWER_UP:
  69. PDK_PowerOnChassis();
  70. break;
  71. case CHASSIS_POWER_CYCLE:
  72. PDK_PowerCycleChassis();
  73. break;
  74. case CHASSIS_HARD_RESET:
  75. PDK_ResetChassis();
  76. break;
  77. case CHASSIS_PULSE_DIAGNOSTIC_INTERRUPT:
  78. PDK_DiagInterruptChassis();
  79. break;
  80. case CHASSIS_SOFT_SHUTDOWN:
  81. PDK_SoftOffChassis();
  82. break;
  83. default:
  84. printf("Invalid power control cmd\r\n");
  85. break;
  86. }
  87. }
  88. }
  89. else if(MsgPkt.Param == PARAM_MC)
  90. {
  91. if(((MsgPkt.NetFnLUN>>2) == NETFN_APP) && ((MsgPkt.Cmd == CMD_COLD_RESET) || (MsgPkt.Cmd == CMD_WARM_RESET)))
  92. {
  93. sleep(1); //wait ipmi request response finish.
  94. stm32_reset_mcu();
  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) //新开个线程实现,默认灯闪烁10s,参考IPMI协议
  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. }