From 05745754f1ac5fabb084088fb1489f2437453d29 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Thu, 9 Aug 2018 22:05:12 +0000 Subject: [PATCH] SSR: Control program run on Turris --- ssr/turris/Makefile | 23 ++++++ ssr/turris/ssr-control.c | 151 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 ssr/turris/Makefile create mode 100644 ssr/turris/ssr-control.c diff --git a/ssr/turris/Makefile b/ssr/turris/Makefile new file mode 100644 index 0000000..82a5498 --- /dev/null +++ b/ssr/turris/Makefile @@ -0,0 +1,23 @@ +TOPDIR=/root/turris + +include $(TOPDIR)/rules.mk +include $(TOPDIR)/include/package.mk + +PC := PATH=$(STAGING_DIR_HOST)/bin:$(PATH) PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) PKG_CONFIG_LIBDIR=$(PKG_CONFIG_PATH) STAGING_PREFIX=$(STAGING_DIR)/usr $(PKG_CONFIG) +USB_CFLAGS := $(shell $(PC) --cflags libusb-1.0) +USB_LDFLAGS := $(shell $(PC) --libs libusb-1.0) + +export PATH=$(TARGET_PATH_PKG) +CC=$(TARGET_CC_NOCACHE) +LD=$(TARGET_LD_NOCACHE) +CFLAGS=$(TARGET_CFLAGS) $(USB_CFLAGS) -std=gnu99 +LDFLAGS=$(TARGET_LDFLAGS) $(USB_LDFLAGS) + +all: ssr-control upload + +ssr-control: ssr-control.c + +upload: + rsync -av ssr-control micac: + +.PHONY: upload diff --git a/ssr/turris/ssr-control.c b/ssr/turris/ssr-control.c new file mode 100644 index 0000000..0b680a0 --- /dev/null +++ b/ssr/turris/ssr-control.c @@ -0,0 +1,151 @@ +/* + * Control utility for the Solid State Relay module + * + * (c) 2018 Martin Mares + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef uint8_t byte; +typedef uint16_t u16; +typedef uint32_t u32; + +struct libusb_context *usb_ctxt; +struct libusb_device_handle *devh; + +static void __attribute__((noreturn)) die(char *msg, ...) +{ + va_list args; + va_start(args, msg); + vfprintf(stderr, msg, args); + fputc('\n', stderr); + exit(1); +} + +static inline u32 get_u32_be(const void *p) +{ + const byte *c = (const byte *)p; + return (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3]; +} + +static inline void put_u32_be(void *p, u32 x) +{ + byte *c = (byte *)p; + c[0] = x >> 24; + c[1] = x >> 16; + c[2] = x >> 8; + c[3] = x; +} + +void open_device(void) +{ + int err; + libusb_device **devlist; + ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist); + if (devn < 0) + die("Cannot enumerate USB devices: error %d", (int) devn); + + for (ssize_t i=0; i= 4) { + uint status = get_u32_be(resp); + if (status) + die("Received error status %08x", status); + } + + return received; +} + +static void usage(void) +{ + fprintf(stderr, "Usage: ssr-control [-t] [-s ]\n"); + exit(1); +} + +int main(int argc, char **argv) +{ + int get_temp = 0; + int set_relays = -1; + + int opt; + while ((opt = getopt(argc, argv, "ts:")) >= 0) { + switch (opt) { + case 't': + get_temp = 1; + break; + case 's': + set_relays = atoi(optarg); + break; + default: + usage(); + } + } + if (optind < argc) + usage(); + + int err; + if (err = libusb_init(&usb_ctxt)) + die("Cannot initialize libusb: error %d", err); + libusb_set_debug(usb_ctxt, 3); + open_device(); + + if (get_temp) { + put_u32_be(req, 2); + transaction(8, 8); + int t = get_u32_be(resp+4); + printf("Temp: %d\n", t); + } + + if (set_relays >= 0) { + put_u32_be(req, 1); + put_u32_be(req+4, set_relays); + transaction(8, 4); + } + + return 0; +} -- 2.39.2