sim_jtag_socket_c.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <poll.h>
  7. #include <signal.h>
  8. #include <fcntl.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include "sim_vhpi_c.h"
  13. /* XXX Make that some parameter */
  14. #define TCP_PORT 13245
  15. #define MAX_PACKET 32
  16. static int fd = -1;
  17. static int cfd = -1;
  18. static void open_socket(void)
  19. {
  20. struct sockaddr_in addr;
  21. int opt, rc, flags;
  22. if (fd >= 0 || fd < -1)
  23. return;
  24. signal(SIGPIPE, SIG_IGN);
  25. fd = socket(AF_INET, SOCK_STREAM, 0);
  26. if (fd < 0) {
  27. fprintf(stderr, "Failed to open debug socket !\r\n");
  28. goto fail;
  29. }
  30. rc = 0;
  31. flags = fcntl(fd, F_GETFL);
  32. if (flags >= 0)
  33. rc = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
  34. if (flags < 0 || rc < 0) {
  35. fprintf(stderr, "Failed to configure debug socket !\r\n");
  36. }
  37. memset(&addr, 0, sizeof(addr));
  38. addr.sin_family = AF_INET;
  39. addr.sin_port = htons(TCP_PORT);
  40. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  41. opt = 1;
  42. setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  43. rc = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
  44. if (rc < 0) {
  45. fprintf(stderr, "Failed to bind debug socket !\r\n");
  46. goto fail;
  47. }
  48. rc = listen(fd,1);
  49. if (rc < 0) {
  50. fprintf(stderr, "Failed to listen to debug socket !\r\n");
  51. goto fail;
  52. }
  53. fprintf(stdout, "Debug socket ready\r\n");
  54. return;
  55. fail:
  56. if (fd >= 0)
  57. close(fd);
  58. fd = -2;
  59. }
  60. static void check_connection(void)
  61. {
  62. struct sockaddr_in addr;
  63. socklen_t addr_len = sizeof(addr);
  64. cfd = accept(fd, (struct sockaddr *)&addr, &addr_len);
  65. if (cfd < 0)
  66. return;
  67. fprintf(stdout, "Debug client connected !\r\n");
  68. }
  69. void sim_jtag_read_msg(unsigned char *out_msg, unsigned char *out_size)
  70. {
  71. unsigned char data[MAX_PACKET];
  72. unsigned char size = 0;
  73. struct pollfd fdset[1];
  74. int rc, i;
  75. if (fd == -1)
  76. open_socket();
  77. if (fd < 0)
  78. goto finish;
  79. if (cfd < 0)
  80. check_connection();
  81. if (cfd < 0)
  82. goto finish;
  83. memset(fdset, 0, sizeof(fdset));
  84. fdset[0].fd = cfd;
  85. fdset[0].events = POLLIN;
  86. rc = poll(fdset, 1, 0);
  87. if (rc <= 0)
  88. goto finish;
  89. rc = read(cfd, data, MAX_PACKET);
  90. if (rc < 0)
  91. fprintf(stderr, "Debug read error, assuming client disconnected !\r\n");
  92. if (rc == 0)
  93. fprintf(stdout, "Debug client disconnected !\r\n");
  94. if (rc <= 0) {
  95. close(cfd);
  96. cfd = -1;
  97. goto finish;
  98. }
  99. #if 0
  100. fprintf(stderr, "Got message:\n\r");
  101. {
  102. for (i=0; i<rc; i++)
  103. fprintf(stderr, "%02x ", data[i]);
  104. fprintf(stderr, "\n\r");
  105. }
  106. #endif
  107. size = data[0]; /* Size in bits */
  108. /* Special sizes */
  109. if (size == 255) {
  110. /* JTAG reset, message to translate */
  111. goto finish;
  112. }
  113. if (((rc - 1) * 8) < size) {
  114. fprintf(stderr, "Debug short read: %d bytes for %d bits, truncating\r\n",
  115. rc - 1, size);
  116. size = (rc - 1) * 8;
  117. }
  118. for (i = 0; i < size; i++) {
  119. int byte = i >> 3;
  120. int bit = 1 << (i & 7);
  121. out_msg[i] = (data[byte+1] & bit) ? vhpi1 : vhpi0;
  122. }
  123. finish:
  124. to_std_logic_vector(size, out_size, 8);
  125. }
  126. void sim_jtag_write_msg(unsigned char *in_msg, unsigned char *in_size)
  127. {
  128. unsigned char data[MAX_PACKET];
  129. unsigned char size;
  130. int rc, i;
  131. size = from_std_logic_vector(in_size, 8);
  132. data[0] = size;
  133. for (i = 0; i < size; i++) {
  134. int byte = i >> 3;
  135. int bit = 1 << (i & 7);
  136. if (in_msg[i] == vhpi1)
  137. data[byte+1] |= bit;
  138. else
  139. data[byte+1] &= ~bit;
  140. }
  141. rc = (size + 7) / 8;
  142. #if 0
  143. fprintf(stderr, "Sending response:\n\r");
  144. {
  145. for (i=0; i<rc; i++)
  146. fprintf(stderr, "%02x ", data[i]);
  147. fprintf(stderr, "\n\r");
  148. }
  149. #endif
  150. rc = write(cfd, data, rc);
  151. if (rc < 0)
  152. fprintf(stderr, "Debug write error, ignoring\r\n");
  153. }