icE1usb fw: Use the interface/endpoints #define in usb_e1.c
Avoid hardcoded ids everywhere. This also prepares a bit for
multi-port support in the future.
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Change-Id: I89c86ac6afd52dd19e3383b38c3311276a090d50
diff --git a/firmware/ice40-riscv/icE1usb/usb_e1.c b/firmware/ice40-riscv/icE1usb/usb_e1.c
index 09b428c..3de6071 100644
--- a/firmware/ice40-riscv/icE1usb/usb_e1.c
+++ b/firmware/ice40-riscv/icE1usb/usb_e1.c
@@ -13,8 +13,9 @@
#include <no2usb/usb_priv.h>
#include "console.h"
-#include "misc.h"
#include "e1.h"
+#include "misc.h"
+#include "usb_desc_ids.h"
#include "ice1usb_proto.h"
@@ -40,6 +41,12 @@
};
+static volatile struct usb_ep *
+_get_ep_regs(uint8_t ep)
+{
+ return (ep & 0x80) ? &usb_ep_regs[ep & 0x1f].in : &usb_ep_regs[ep & 0x1f].out;
+}
+
static void
_usb_fill_feedback_ep(void)
{
@@ -47,6 +54,7 @@
uint16_t ticks;
uint32_t val = 8192;
unsigned int level;
+ volatile struct usb_ep *ep_regs;
/* Compute real E1 tick count (with safety against bad values) */
ticks = e1_tick_read();
@@ -63,21 +71,25 @@
val -= 256;
/* Prepare buffer */
- usb_data_write(usb_ep_regs[1].in.bd[0].ptr, &val, 4);
- usb_ep_regs[1].in.bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(3);
+ ep_regs = _get_ep_regs(USB_EP_E1_FB(0));
+ usb_data_write(ep_regs->bd[0].ptr, &val, 4);
+ ep_regs->bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(3);
}
void
usb_e1_run(void)
{
+ volatile struct usb_ep *ep_regs;
int bdi;
if (!g_usb_e1.running)
return;
- /* EP3 IRQ */
- if ((usb_ep_regs[3].in.bd[0].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA) {
+ /* Interrupt endpoint */
+ ep_regs = _get_ep_regs(USB_EP_E1_INT(0));
+
+ if ((ep_regs->bd[0].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA) {
const struct e1_error_count *cur_err = e1_get_error_count();
if (memcmp(cur_err, &g_usb_e1.last_err, sizeof(*cur_err))) {
struct ice1usb_irq errmsg = {
@@ -93,24 +105,25 @@
}
};
printf("E");
- usb_data_write(usb_ep_regs[3].in.bd[0].ptr, &errmsg, sizeof(errmsg));
- usb_ep_regs[3].in.bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(sizeof(errmsg));
+ usb_data_write(ep_regs->bd[0].ptr, &errmsg, sizeof(errmsg));
+ ep_regs->bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(sizeof(errmsg));
g_usb_e1.last_err = *cur_err;
}
}
- /* EP2 IN */
+ /* Data IN endpoint */
+ ep_regs = _get_ep_regs(USB_EP_E1_IN(0));
bdi = g_usb_e1.in_bdi;
- while ((usb_ep_regs[2].in.bd[bdi].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA)
+ while ((ep_regs->bd[bdi].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA)
{
- uint32_t ptr = usb_ep_regs[2].in.bd[bdi].ptr;
+ uint32_t ptr = ep_regs->bd[bdi].ptr;
uint32_t hdr;
unsigned int pos;
/* Error check */
- if ((usb_ep_regs[2].in.bd[bdi].csr & USB_BD_STATE_MSK) == USB_BD_STATE_DONE_ERR)
- puts("Err EP2 IN\n");
+ if ((ep_regs->bd[bdi].csr & USB_BD_STATE_MSK) == USB_BD_STATE_DONE_ERR)
+ puts("Err EP IN\n");
/* Get some data from E1 */
int n = e1_rx_level();
@@ -131,25 +144,26 @@
usb_data_write(ptr, &hdr, 4);
/* Resubmit */
- usb_ep_regs[2].in.bd[bdi].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN((n * 32) + 4);
+ ep_regs->bd[bdi].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN((n * 32) + 4);
/* Next BDI */
bdi ^= 1;
g_usb_e1.in_bdi = bdi;
}
- /* EP1 OUT */
+ /* Data OUT endpoint */
+ ep_regs = _get_ep_regs(USB_EP_E1_OUT(0));
bdi = g_usb_e1.out_bdi;
- while ((usb_ep_regs[1].out.bd[bdi].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA)
+ while ((ep_regs->bd[bdi].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA)
{
- uint32_t ptr = usb_ep_regs[1].out.bd[bdi].ptr;
- uint32_t csr = usb_ep_regs[1].out.bd[bdi].csr;
+ uint32_t ptr = ep_regs->bd[bdi].ptr;
+ uint32_t csr = ep_regs->bd[bdi].csr;
uint32_t hdr;
/* Error check */
if ((csr & USB_BD_STATE_MSK) == USB_BD_STATE_DONE_ERR) {
- puts("Err EP1 OUT\n");
+ puts("Err EP OUT\n");
goto refill;
}
@@ -162,7 +176,7 @@
refill:
/* Refill it */
- usb_ep_regs[1].out.bd[bdi].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);
+ ep_regs->bd[bdi].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);
/* Next BDI */
bdi ^= 1;
@@ -173,8 +187,10 @@
puts(".");
}
- /* EP1 IN */
- if ((usb_ep_regs[1].in.bd[0].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA)
+ /* Feedback endpoint */
+ ep_regs = _get_ep_regs(USB_EP_E1_FB(0));
+
+ if ((ep_regs->bd[0].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA)
{
_usb_fill_feedback_ep();
}
@@ -189,16 +205,16 @@
if (!conf)
return USB_FND_SUCCESS;
- intf = usb_desc_find_intf(conf, 0, 0, NULL);
+ intf = usb_desc_find_intf(conf, USB_INTF_E1(0), 0, NULL);
if (!intf)
return USB_FND_ERROR;
printf("e1 set_conf %08x\n", intf);
- usb_ep_boot(intf, 0x01, true);
- usb_ep_boot(intf, 0x81, false);
- usb_ep_boot(intf, 0x82, true);
- usb_ep_boot(intf, 0x83, false);
+ usb_ep_boot(intf, USB_EP_E1_IN(0), true);
+ usb_ep_boot(intf, USB_EP_E1_OUT(0), true);
+ usb_ep_boot(intf, USB_EP_E1_FB(0), false);
+ usb_ep_boot(intf, USB_EP_E1_INT(0), false);
return USB_FND_SUCCESS;
}
@@ -221,8 +237,10 @@
static enum usb_fnd_resp
_e1_set_intf(const struct usb_intf_desc *base, const struct usb_intf_desc *sel)
{
+ volatile struct usb_ep *ep_regs;
+
/* Validity checks */
- if (base->bInterfaceNumber != 0)
+ if ((base->bInterfaceClass != 0xff) || (base->bInterfaceSubClass != 0xe1))
return USB_FND_CONTINUE;
if (sel->bAlternateSetting > 1)
@@ -235,10 +253,10 @@
g_usb_e1.running = (sel->bAlternateSetting != 0);
/* Reconfigure the endpoints */
- usb_ep_reconf(sel, 0x01);
- usb_ep_reconf(sel, 0x81);
- usb_ep_reconf(sel, 0x82);
- usb_ep_reconf(sel, 0x83);
+ usb_ep_reconf(sel, USB_EP_E1_IN(0));
+ usb_ep_reconf(sel, USB_EP_E1_OUT(0));
+ usb_ep_reconf(sel, USB_EP_E1_FB(0));
+ usb_ep_reconf(sel, USB_EP_E1_INT(0));
/* Update E1 and USB state */
switch (g_usb_e1.running) {
@@ -257,11 +275,12 @@
g_usb_e1.in_bdi = 0;
g_usb_e1.out_bdi = 0;
- /* EP1 OUT: Queue two buffers */
- usb_ep_regs[1].out.bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);
- usb_ep_regs[1].out.bd[1].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);
+ /* EP OUT: Queue two buffers */
+ ep_regs = _get_ep_regs(USB_EP_E1_FB(0));
+ ep_regs->bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);
+ ep_regs->bd[1].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);
- /* EP1 IN: Queue buffer */
+ /* EP Feedback: Pre-fill */
_usb_fill_feedback_ep();
break;
@@ -273,7 +292,7 @@
static enum usb_fnd_resp
_e1_get_intf(const struct usb_intf_desc *base, uint8_t *alt)
{
- if (base->bInterfaceNumber != 0)
+ if ((base->bInterfaceClass != 0xff) || (base->bInterfaceSubClass != 0xe1))
return USB_FND_CONTINUE;
*alt = g_usb_e1.running ? 1 : 0;
@@ -374,7 +393,7 @@
case USB_REQ_RCPT_DEV:
return _e1_ctrl_req_dev(req, xfer);
case USB_REQ_RCPT_INTF:
- if (req->wIndex != 0)
+ if (req->wIndex != USB_INTF_E1(0))
return USB_FND_CONTINUE;
return _e1_ctrl_req_intf(req, xfer);
case USB_REQ_RCPT_EP: