summaryrefslogtreecommitdiff
path: root/code/fe310/eos/ecp.c
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2018-01-16 23:43:07 +0100
committerUros Majstorovic <majstor@majstor.org>2018-01-16 23:43:07 +0100
commit01c3e3af2394f863323b846fa304ff7e0a30e9df (patch)
tree84b499e6ece88e637ed86bbdd87333613e2433c5 /code/fe310/eos/ecp.c
parent0d0e9facfcea3cf96da3b63285865182fdd5477e (diff)
eos support
Diffstat (limited to 'code/fe310/eos/ecp.c')
-rw-r--r--code/fe310/eos/ecp.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/code/fe310/eos/ecp.c b/code/fe310/eos/ecp.c
new file mode 100644
index 0000000..433e693
--- /dev/null
+++ b/code/fe310/eos/ecp.c
@@ -0,0 +1,66 @@
+#include <stddef.h>
+#include <string.h>
+
+#include "encoding.h"
+#include "platform.h"
+
+#include "event.h"
+#include "timer.h"
+#include "net.h"
+
+#include "ecp.h"
+
+static ECPSocket *_sock = NULL;
+
+static unsigned char net_buf_reserved = 0;
+static void timer_handler(unsigned char cmd, unsigned char *buffer, uint16_t len) {
+ int ok = eos_net_acquire(net_buf_reserved);
+ if (ok) {
+ ecp_cts_t next = ecp_timer_exe(_sock);
+ if (next) {
+ uint32_t tick = next * (uint64_t)RTC_FREQ / 1000;
+ eos_timer_set(tick, 1);
+ }
+ eos_net_release(1);
+ net_buf_reserved = 0;
+ } else {
+ net_buf_reserved = 1;
+ eos_evtq_push(EOS_EVT_TIMER, NULL, 0);
+ }
+}
+
+static void packet_handler(unsigned char cmd, unsigned char *buffer, uint16_t len) {
+ ECPNetAddr addr;
+ size_t addr_len = sizeof(addr.host) + sizeof(addr.port);
+
+ ECP2Buffer bufs;
+ ECPBuffer packet;
+ ECPBuffer payload;
+ unsigned char pld_buf[ECP_MAX_PLD];
+
+ bufs.packet = &packet;
+ bufs.payload = &payload;
+
+ packet.buffer = buffer+addr_len;
+ packet.size = ECP_MAX_PKT;
+ payload.buffer = pld_buf;
+ payload.size = ECP_MAX_PLD;
+
+ memcpy(addr.host, buffer, sizeof(addr.host));
+ memcpy(&addr.port, buffer+sizeof(addr.host), sizeof(addr.port));
+ ssize_t rv = ecp_pkt_handle(_sock, &addr, NULL, &bufs, len-addr_len);
+ if (bufs.packet->buffer) eos_net_free(buffer, 0);
+ eos_net_release(0);
+}
+
+int ecp_init(ECPContext *ctx) {
+ int rv;
+
+ rv = ecp_ctx_create(ctx);
+ if (rv) return rv;
+
+ eos_evtq_set_handler(EOS_EVT_TIMER, timer_handler);
+ eos_evtq_set_handler(EOS_EVT_MASK_NET | EOS_NET_CMD_PKT, packet_handler);
+
+ return ECP_OK;
+} \ No newline at end of file