icE1usb fw: Add device request to read/write I2C device registers

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Change-Id: I55a72762d535827a51e5ea1775e9abbd116bc8a8
diff --git a/firmware/ice40-riscv/icE1usb/ice1usb_proto.h b/firmware/ice40-riscv/icE1usb/ice1usb_proto.h
index 5b65d76..8cf8439 100644
--- a/firmware/ice40-riscv/icE1usb/ice1usb_proto.h
+++ b/firmware/ice40-riscv/icE1usb/ice1usb_proto.h
@@ -20,6 +20,10 @@
 /*! returns a string describing the firmware version */
 #define ICE1USB_DEV_GET_FW_BUILD	0x02
 
+/*! performs an I2C register access (read/write depends on direction) */
+#define ICE1USB_DEV_I2C_REG_ACCESS	0x10
+
+
 enum e1usb_dev_capability {
 	/*! Does this board have a GPS-DO */
 	ICE1USB_DEV_CAP_GPSDO,
diff --git a/firmware/ice40-riscv/icE1usb/usb_dev.c b/firmware/ice40-riscv/icE1usb/usb_dev.c
index e834142..da1e7f2 100644
--- a/firmware/ice40-riscv/icE1usb/usb_dev.c
+++ b/firmware/ice40-riscv/icE1usb/usb_dev.c
@@ -12,6 +12,7 @@
 #include <no2usb/usb_proto.h>
 
 #include "console.h"
+#include "i2c.h"
 #include "misc.h"
 
 #include "ice1usb_proto.h"
@@ -24,6 +25,10 @@
 _usb_dev_ctrl_req_write(struct usb_ctrl_req *req, struct usb_xfer *xfer)
 {
 	switch (req->bRequest) {
+	case ICE1USB_DEV_I2C_REG_ACCESS:
+		if (!i2c_write_reg((req->wIndex >> 8), req->wIndex & 0xff, req->wValue & 0xff))
+			return USB_FND_ERROR;
+		break;
 	default:
 		return USB_FND_ERROR;
 	}
@@ -43,6 +48,11 @@
 		xfer->data = (void*) fw_build_str;
 		xfer->len  = strlen(fw_build_str);
 		break;
+	case ICE1USB_DEV_I2C_REG_ACCESS:
+		if (!i2c_read_reg((req->wIndex >> 8), req->wIndex & 0xff, &xfer->data[0]))
+			return USB_FND_ERROR;
+		xfer->len = 1;
+		break;
 	default:
 		return USB_FND_ERROR;
 	}