OpenOCD can now scan out the hacked IDCODE.
[riscv-isa-sim.git] / riscv / remote_bitbang.cc
index 13b6a3c582c0768a029dcccdc6d375f74c8246dd..7f22cd3223be06176c1229201f90eecfab226b5e 100644 (file)
 
 #include "remote_bitbang.h"
 
-#define DEBUG
-#ifdef DEBUG
-#  define D(x) x
-#else
-#  define D(x)
-#endif // DEBUG
-
 /////////// Circular buffer
 
 template <typename T>
@@ -86,6 +79,12 @@ void circular_buffer_t<T>::append(const T *src, unsigned int count)
   }
 }
 
+template <typename T>
+void circular_buffer_t<T>::append(T value)
+{
+  append(&value, 1);
+}
+
 /////////// remote_bitbang_t
 
 remote_bitbang_t::remote_bitbang_t(uint16_t port, sim_t *sim) :
@@ -204,8 +203,34 @@ void remote_bitbang_t::tick()
 {
   if (client_fd > 0) {
     this->read();
+    process_input();
     this->write();
   } else {
     this->accept();
   }
 }
+
+void remote_bitbang_t::process_input()
+{
+  for (unsigned i = 0; i < recv_buf.size(); i++) {
+    uint8_t command = recv_buf[i];
+
+    switch (command) {
+      case 'B': fprintf(stderr, "*BLINK*\n"); break;
+      case 'b': fprintf(stderr, "_______\n"); break;
+      case 'r': tap.reset(); break;
+      case '0': tap.set_pins(0, 0, 0); break;
+      case '1': tap.set_pins(0, 0, 1); break;
+      case '2': tap.set_pins(0, 1, 0); break;
+      case '3': tap.set_pins(0, 1, 1); break;
+      case '4': tap.set_pins(1, 0, 0); break;
+      case '5': tap.set_pins(1, 0, 1); break;
+      case '6': tap.set_pins(1, 1, 0); break;
+      case '7': tap.set_pins(1, 1, 1); break;
+      case 'R': send_buf.append(tap.tdo() ? '1' : '0'); break;
+      default:
+        fprintf(stderr, "remote_bitbang got unsupported command '%c'\n", command);
+    }
+  }
+  recv_buf.reset();
+}