icE1usb fw: Add support for building 1 channel version

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Change-Id: I147bb90fca3cead8db776ecfd60c23b4b8bafe2d
diff --git a/firmware/ice40-riscv/icE1usb/Makefile b/firmware/ice40-riscv/icE1usb/Makefile
index ed765f6..b05a532 100644
--- a/firmware/ice40-riscv/icE1usb/Makefile
+++ b/firmware/ice40-riscv/icE1usb/Makefile
@@ -17,6 +17,10 @@
 CFLAGS=-Wall -Wextra -Wno-unused-parameter -Os -march=rv32i -mabi=ilp32 -ffreestanding -flto -nostartfiles -fomit-frame-pointer -Wl,--gc-section --specs=nano.specs -D$(BOARD_DEFINE) -I. -I../common
 CFLAGS += -DBUILD_INFO="\"$(GITVER) built $(shell date) on $(shell hostname)\""
 
+ifeq ($(SINGLE_CHANNEL),1)
+CFLAGS += -DNUM_E1_PORTS=1
+endif
+
 NO2USB_FW_VERSION=0
 include ../../../gateware/cores/no2usb/fw/fw.mk
 CFLAGS += $(INC_no2usb)
diff --git a/firmware/ice40-riscv/icE1usb/usb_desc_app.c b/firmware/ice40-riscv/icE1usb/usb_desc_app.c
index 7dfc304..63b0b5c 100644
--- a/firmware/ice40-riscv/icE1usb/usb_desc_app.c
+++ b/firmware/ice40-riscv/icE1usb/usb_desc_app.c
@@ -39,7 +39,7 @@
 			struct usb_ep_desc ep_fb;
 			struct usb_ep_desc ep_interrupt;
 		} __attribute__ ((packed)) on;
-	} __attribute__ ((packed)) e1[2];
+	} __attribute__ ((packed)) e1[NUM_E1_PORTS];
 
 	/* CDC */
 	struct {
@@ -142,6 +142,7 @@
 			},
 		},
 	},
+#if NUM_E1_PORTS >= 2
 	.e1[1] = {
 		.off = {
 			.intf = {
@@ -210,6 +211,7 @@
 			},
 		},
 	},
+#endif
 	.cdc = {
 		.intf_ctl = {
 			.bLength		= sizeof(struct usb_intf_desc),
diff --git a/firmware/ice40-riscv/icE1usb/usb_desc_ids.h b/firmware/ice40-riscv/icE1usb/usb_desc_ids.h
index 192092e..ab3d156 100644
--- a/firmware/ice40-riscv/icE1usb/usb_desc_ids.h
+++ b/firmware/ice40-riscv/icE1usb/usb_desc_ids.h
@@ -7,12 +7,16 @@
 
 #pragma once
 
+#ifndef NUM_E1_PORTS
+# define NUM_E1_PORTS 2
+#endif
+
 #define USB_INTF_E1(p)		(0 + (p))
-#define USB_INTF_GPS_CDC_CTL	2
-#define USB_INTF_GPS_CDC_DATA	3
-#define USB_INTF_GPSDO		4
-#define USB_INTF_DFU		5
-#define USB_INTF_NUM		6
+#define USB_INTF_GPS_CDC_CTL	(NUM_E1_PORTS + 0)
+#define USB_INTF_GPS_CDC_DATA	(NUM_E1_PORTS + 1)
+#define USB_INTF_GPSDO		(NUM_E1_PORTS + 2)
+#define USB_INTF_DFU		(NUM_E1_PORTS + 3)
+#define USB_INTF_NUM		(NUM_E1_PORTS + 4)
 
 #define USB_EP_E1_IN(p)		(0x82 + (3 * (p)))
 #define USB_EP_E1_OUT(p)	(0x01 + (3 * (p)))
diff --git a/firmware/ice40-riscv/icE1usb/usb_e1.c b/firmware/ice40-riscv/icE1usb/usb_e1.c
index 4e52408..328ff3f 100644
--- a/firmware/ice40-riscv/icE1usb/usb_e1.c
+++ b/firmware/ice40-riscv/icE1usb/usb_e1.c
@@ -29,7 +29,7 @@
 	struct e1_error_count last_err;
 };
 
-static struct usb_e1_state g_usb_e1[2];
+static struct usb_e1_state g_usb_e1[NUM_E1_PORTS];
 
 /* default configuration at power-up */
 static const struct ice1usb_tx_config tx_cfg_default = {
@@ -53,7 +53,7 @@
 static struct usb_e1_state *
 _get_state(int port)
 {
-	if ((port < 0) || (port > 1))
+	if ((port < 0) || (port >= NUM_E1_PORTS))
 		panic("_get_state invalid port %d", port);
 	return &g_usb_e1[port];
 }
@@ -63,7 +63,9 @@
 {
 	switch (bInterfaceNumber) {
 	case USB_INTF_E1(0): return 0;
+#if NUM_E1_PORTS >= 2
 	case USB_INTF_E1(1): return 1;
+#endif
 	default:
 		/* Don't panic since this will be handled as USB STALL */
 		return -1;
@@ -209,7 +211,7 @@
 void
 usb_e1_poll(void)
 {
-	for (int i=0; i<2; i++) {
+	for (int i=0; i<NUM_E1_PORTS; i++) {
 		e1_poll(i);
 		_usb_e1_run(i);
 	}
@@ -225,7 +227,7 @@
 	if (!conf)
 		return USB_FND_SUCCESS;
 
-	for (int port=0; port<2; port++)
+	for (int port=0; port<NUM_E1_PORTS; port++)
 	{
 		intf = usb_desc_find_intf(conf, USB_INTF_E1(port), 0, NULL);
 		if (!intf)
@@ -445,7 +447,7 @@
 	uint32_t rx_cr = _rx_config_reg(&rx_cfg_default);
 	uint32_t tx_cr = _tx_config_reg(&tx_cfg_default);
 
-	for (int i=0; i<2; i++) {
+	for (int i=0; i<NUM_E1_PORTS; i++) {
 		struct usb_e1_state *usb_e1 = _get_state(i);
 		memset(usb_e1, 0x00, sizeof(struct usb_e1_state));
 		usb_e1->tx_cfg = tx_cfg_default;