PrimaryMCU_Test.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /*
  2. * PrimaryMCU_Test.c
  3. *
  4. * Created on: 2020¦~4¤ë21¤é
  5. * Author: Wendell
  6. */
  7. #include "PrimaryMCU_Test.h"
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <stdint.h>
  11. #include <unistd.h> //write, close, usleep, read
  12. #include <sys/ioctl.h>
  13. #include <fcntl.h> //uart
  14. #include <termios.h> //uart
  15. int PrimaryMcuPort;
  16. char *PrimaryPortName = "/dev/ttyS1";
  17. //================================================
  18. // Open Primary MCU Port
  19. //================================================
  20. int OpenPrimaryMcuPort()
  21. {
  22. int fd;
  23. struct termios tios;
  24. fd = open(PrimaryPortName, O_RDWR);
  25. if(fd<=0)
  26. {
  27. #ifdef SystemLogMessage
  28. DEBUG_ERROR("open 407 Communication port NG \n");
  29. #endif
  30. return -1;
  31. }
  32. ioctl (fd, TCGETS, &tios);
  33. tios.c_cflag = B115200| CS8 | CLOCAL | CREAD;
  34. tios.c_lflag = 0;
  35. tios.c_iflag = 0;
  36. tios.c_oflag = 0;
  37. tios.c_cc[VMIN]=0;
  38. tios.c_cc[VTIME]=(unsigned char)1;
  39. tios.c_lflag=0;
  40. tcflush(fd, TCIFLUSH);
  41. ioctl (fd, TCSETS, &tios);
  42. return fd;
  43. }
  44. void ClosePrimaryPort()
  45. {
  46. close(PrimaryMcuPort);
  47. }
  48. unsigned char Query_FW_Ver(void)
  49. {
  50. int i = 0;
  51. unsigned char result = 0;
  52. unsigned char tx[7] = {0xaa, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00};
  53. unsigned char rx[512];
  54. unsigned char chksum = 0x00;
  55. unsigned char len;
  56. tcflush(PrimaryMcuPort, TCIOFLUSH);
  57. write(PrimaryMcuPort, tx, 7);
  58. usleep(50000);
  59. len = read(PrimaryMcuPort, rx, 512);
  60. if(len > 0)
  61. {
  62. for(i = 0; i < (rx[4] | rx[5]<<8); i++)
  63. {
  64. chksum ^= rx[6 + i];
  65. }
  66. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  67. (rx[2] == tx[1]) &&
  68. (rx[1] == tx[2]) &&
  69. (rx[3] == tx[3]))
  70. {
  71. //printf("\r\nPrimary Rx:");
  72. //for(i = 0; i < len; i++)
  73. //{
  74. // printf(" %02X", rx[i]);
  75. //}
  76. printf("\r\nPrimary FW: %s", &rx[6]);
  77. result = 1;
  78. }
  79. }
  80. return result;
  81. }
  82. unsigned char Run_Self_Test_Item(uint8_t *accept)
  83. {
  84. int i = 0;
  85. unsigned char result = 0;
  86. unsigned char tx[8] = {0xaa, 0x00, 0x04, 0x92, 0x01, 0x00, 0x01, 0x01};
  87. unsigned char rx[512];
  88. unsigned char chksum = 0x00;
  89. unsigned char len;
  90. tcflush(PrimaryMcuPort, TCIOFLUSH);
  91. write(PrimaryMcuPort, tx, 8);
  92. usleep(50000);
  93. len = read(PrimaryMcuPort, rx, 512);
  94. *accept = 0;
  95. if(len > 0)
  96. {
  97. for(i = 0; i < (rx[4] | rx[5]<<8); i++)
  98. {
  99. chksum ^= rx[6 + i];
  100. }
  101. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  102. (rx[2] == tx[1]) &&
  103. (rx[1] == tx[2]) &&
  104. (rx[3] == tx[3]))
  105. {
  106. *accept = rx[6];
  107. //printf("\r\nSelf Test Rx:");
  108. //for(i = 0; i < len; i++)
  109. //{
  110. // printf(" %02X", rx[i]);
  111. //}
  112. result = 1;
  113. }
  114. }
  115. return result;
  116. }
  117. unsigned char Get_Self_Test_Result(uint8_t *status, uint16_t *fail)
  118. {
  119. int i = 0;
  120. unsigned char result = 0;
  121. unsigned char tx[7] = {0xaa, 0x00, 0x04, 0x32, 0x00, 0x00, 0x00};
  122. unsigned char rx[512];
  123. unsigned char chksum = 0x00;
  124. unsigned char len;
  125. tcflush(PrimaryMcuPort, TCIOFLUSH);
  126. write(PrimaryMcuPort, tx, 7);
  127. usleep(50000);
  128. len = read(PrimaryMcuPort, rx, 512);
  129. if(len > 0)
  130. {
  131. for(i = 0; i < (rx[4] | rx[5]<<8); i++)
  132. {
  133. chksum ^= rx[6 + i];
  134. }
  135. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  136. (rx[2] == tx[1]) &&
  137. (rx[1] == tx[2]) &&
  138. (rx[3] == tx[3]))
  139. {
  140. *status = rx[6];
  141. *fail = rx[7] + (rx[8] << 8);
  142. //printf("\r\nTest Result Rx:");
  143. //for(i = 0; i < len; i++)
  144. //{
  145. // printf(" %02X", rx[i]);
  146. //}
  147. result = 1;
  148. }
  149. }
  150. return result;
  151. }
  152. void DoPrimaryMCUTest(void)
  153. {
  154. int i = 0;
  155. uint8_t accept = 0, status = 0;
  156. uint16_t fail_item = 0;
  157. PrimaryMcuPort = OpenPrimaryMcuPort();
  158. if(Run_Self_Test_Item(&accept) == 0)
  159. {
  160. usleep(100000);
  161. if(Run_Self_Test_Item(&accept) == 0)
  162. {
  163. ClosePrimaryPort();
  164. printf("\r\nPrimary Run Self Test Fail");
  165. return;
  166. }
  167. }
  168. if(accept == 0)
  169. {
  170. printf("\r\nSelf Test Reject, Test Fail");
  171. ClosePrimaryPort();
  172. return;
  173. }
  174. for(i = 0; i < 100; i++)
  175. {
  176. status = 0;
  177. fail_item = 0;
  178. Get_Self_Test_Result(&status, &fail_item);
  179. if(status == 2)
  180. {
  181. usleep(100000);
  182. }
  183. else
  184. {
  185. break;
  186. }
  187. }
  188. ClosePrimaryPort();
  189. if(status == 0)
  190. {
  191. printf("\r\nSelf Test Fail, Fail Item: 0x%04X", fail_item);
  192. return;
  193. }
  194. else if(status != 1)
  195. {
  196. printf("\r\nSelf Test Fail, Timeout");
  197. return;
  198. }
  199. printf("\r\nPrimary MCU Self Test OK");
  200. printf("\r\nPrimary Test Done!");
  201. printf("\r\nSuccess!\r\n");
  202. }