From: Martin Mares Date: Sat, 22 Jul 2023 16:35:45 +0000 (+0200) Subject: test-shutters: USB interface via control requests X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=6ab21d8a64d6a6094752fe43c9288504d8899447;p=home-hw.git test-shutters: USB interface via control requests --- diff --git a/test-shutters/config.h b/test-shutters/config.h index fe39e28..312c7be 100644 --- a/test-shutters/config.h +++ b/test-shutters/config.h @@ -12,7 +12,3 @@ #define DEBUG_USART USART1 #define DEBUG_LED_BLUEPILL - -// Testing of IR receiver - -#undef IR_TEST diff --git a/test-shutters/host/Makefile b/test-shutters/host/Makefile new file mode 100644 index 0000000..5e6e00c --- /dev/null +++ b/test-shutters/host/Makefile @@ -0,0 +1,12 @@ +UCWCF:=$(shell PKG_CONFIG_PATH=$(LIBUCW)/lib/pkgconfig pkg-config --cflags libucw) +UCWLF:=$(shell PKG_CONFIG_PATH=$(LIBUCW)/lib/pkgconfig pkg-config --libs libucw) + +CFLAGS=-std=gnu99 -O2 -Wall -Wextra -Wno-parentheses $(UCWCF) +LDLIBS=-lusb-1.0 $(UCWLF) + +all: test + +test: test.c + +clean: + rm -f test diff --git a/test-shutters/host/test.c b/test-shutters/host/test.c new file mode 100644 index 0000000..5462fe5 --- /dev/null +++ b/test-shutters/host/test.c @@ -0,0 +1,75 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +struct libusb_context *usb_ctxt; +struct libusb_device_handle *devh; + +static libusb_device *find_device(void) +{ + libusb_device **devlist; + ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist); + if (devn < 0) + { + fprintf(stderr, "Cannot enumerate USB devices: error %d\n", (int) devn); + exit(1); + } + + for (ssize_t i=0; iwIndex; + uint value = req->wValue; + + if (req->bmRequestType == (USB_REQ_TYPE_IN | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_DEVICE)) { + debug_printf("Control request IN %02x (index=%d, len=%d)\n", req->bRequest, index, *len); + + const byte *reply = NULL; + uint reply_len = 0; + + switch (req->bRequest) { + case 0: + reply = (const byte *) &csense_counters; + reply_len = sizeof(csense_counters); + break; + default: + return USBD_REQ_NOTSUPP; + } + + uint n = MIN(*len, reply_len); + memcpy(*buf, reply, n); + *len = n; + return USBD_REQ_HANDLED; + } else if (req->bmRequestType == (USB_REQ_TYPE_OUT | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_DEVICE)) { + debug_printf("Control request OUT %02x (index=%d, val=%d, len=%d)\n", req->bRequest, index, value, *len); + + switch (req->bRequest) { + case 1: + if (*len != 0) + return USBD_REQ_NOTSUPP; + if (value & 1) + gpio_clear(GPIOB, GPIO6); + else + gpio_set(GPIOB, GPIO6); + break; + default: + return USBD_REQ_NOTSUPP; + } + + return USBD_REQ_HANDLED; + } else { + return USBD_REQ_NOTSUPP; + } } static void set_config_cb(usbd_device *dev, uint16_t wValue UNUSED) { + usbd_register_control_callback( + dev, + USB_REQ_TYPE_VENDOR, + USB_REQ_TYPE_TYPE, + control_cb); usbd_register_control_callback( dev, USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT, dfu_control_cb); - usbd_ep_setup(dev, 0x01, USB_ENDPOINT_ATTR_BULK, 64, ep01_cb); usb_configured = 1; } @@ -300,17 +339,15 @@ int main(void) usb_init(); u32 last_blink = 0; - uint csense[2] = { 0, 0 }; for (;;) { if (ms_ticks - last_blink >= 1000) { debug_led_toggle(); last_blink = ms_ticks; - debug_printf("C: %u %u\n", csense[0], csense[1]); - csense[0] = csense[1] = 0; + debug_printf("C: %u %u\n", csense_counters[0], csense_counters[1]); } - csense[gpio_get(GPIOA, GPIO0)]++; + csense_counters[gpio_get(GPIOA, GPIO0)]++; if (usart_get_flag(USART1, USART_SR_RXNE)) { uint ch = usart_recv(USART1);