summaryrefslogtreecommitdiff
path: root/openpcd/firmware/src/main_dumbreader.c
diff options
context:
space:
mode:
Diffstat (limited to 'openpcd/firmware/src/main_dumbreader.c')
-rw-r--r--openpcd/firmware/src/main_dumbreader.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/openpcd/firmware/src/main_dumbreader.c b/openpcd/firmware/src/main_dumbreader.c
new file mode 100644
index 0000000..43801f6
--- /dev/null
+++ b/openpcd/firmware/src/main_dumbreader.c
@@ -0,0 +1,94 @@
+#include <errno.h>
+#include <string.h>
+#include <include/lib_AT91SAM7.h>
+#include <include/openpcd.h>
+#include "dbgu.h"
+#include "rc632.h"
+#include "led.h"
+#include "pcd_enumerate.h"
+#include "openpcd.h"
+
+static int usb_in(struct req_ctx *rctx)
+{
+ struct openpcd_hdr *poh = (struct openpcd_hdr *) &rctx->rx.data[0];
+ struct openpcd_hdr *pih = (struct openpcd_hdr *) &rctx->tx.data[0];
+ u_int16_t len = rctx->rx.tot_len;
+
+ DEBUGP("usb_in ");
+
+ if (len < sizeof(*poh))
+ return -EINVAL;
+
+ //data_len = ntohs(poh->len);
+
+ memcpy(pih, poh, sizeof(*poh));
+ rctx->tx.tot_len = sizeof(*poh);
+
+ switch (poh->cmd) {
+ case OPENPCD_CMD_READ_REG:
+ DEBUGP("READ REG(0x%02x) ", poh->reg);
+ pih->val = rc632_reg_read(poh->reg);
+ break;
+ case OPENPCD_CMD_READ_FIFO:
+ DEBUGP("READ FIFO(len=%u) ", poh->val);
+ pih->len = rc632_fifo_read(poh->val, pih->data);
+ rctx->tx.tot_len += pih->len;
+ break;
+ case OPENPCD_CMD_WRITE_REG:
+ DEBUGP("WRITE_REG(0x%02x, 0x%02x) ", poh->reg, poh->val);
+ rc632_reg_write(poh->reg, poh->val);
+ break;
+ case OPENPCD_CMD_WRITE_FIFO:
+ DEBUGP("WRITE FIFO(len=%u) ", poh->len);
+ if (len - sizeof(*poh) < poh->len)
+ return -EINVAL;
+ rc632_fifo_write(poh->len, poh->data);
+ break;
+ case OPENPCD_CMD_READ_VFIFO:
+ DEBUGP("READ VFIFO ");
+ DEBUGP("NOT IMPLEMENTED YET ");
+ break;
+ case OPENPCD_CMD_WRITE_VFIFO:
+ DEBUGP("WRITE VFIFO ");
+ DEBUGP("NOT IMPLEMENTED YET ");
+ break;
+ case OPENPCD_CMD_REG_BITS_CLEAR:
+ DEBUGP("CLEAR BITS ");
+ pih->val = rc632_clear_bits(poh->reg, poh->val);
+ break;
+ case OPENPCD_CMD_REG_BITS_SET:
+ DEBUGP("SET BITS ");
+ pih->val = rc632_set_bits(poh->reg, poh->val);
+ break;
+ case OPENPCD_CMD_SET_LED:
+ DEBUGP("SET LED(%u,%u) ", poh->reg, poh->val);
+ led_switch(poh->reg, poh->val);
+ break;
+ default:
+ return -EINVAL;
+ }
+ DEBUGPCRF("calling UDP_Write");
+ AT91F_UDP_Write(0, &rctx->tx.data[0], rctx->tx.tot_len);
+ DEBUGPCRF("usb_in: returning to main");
+
+ return 0;
+}
+
+void _init_func(void)
+{
+ rc632_init();
+ udp_init();
+}
+
+void _main_func(void)
+{
+ struct req_ctx *rctx;
+
+ for (rctx = req_ctx_find_busy(); rctx;
+ rctx = req_ctx_find_busy()) {
+ DEBUGPCRF("found used ctx %u: len=%u",
+ req_ctx_num(rctx), rctx->rx.tot_len);
+ usb_in(rctx);
+ req_ctx_put(rctx);
+ }
+}
personal git repositories of Harald Welte. Your mileage may vary