[PATCH libbsd 09/11] ehci_imx.c: Port to RTEMS

Christian Mauderer christian.mauderer at embedded-brains.de
Thu Apr 2 14:42:43 UTC 2020


From: Sebastian Huber <sebastian.huber at embedded-brains.de>

Update #3869.
---
 freebsd/sys/arm/freescale/imx/imx6_usbphy.c | 11 ++++++
 freebsd/sys/dev/usb/controller/ehci_imx.c   | 12 +++++++
 freebsd/sys/dev/usb/usb_busdma.c            | 54 +++++++++++++++++++++++++++++
 libbsd.py                                   |  4 +++
 rtemsbsd/include/bsp/nexus-devices.h        |  5 +++
 5 files changed, 86 insertions(+)

diff --git a/freebsd/sys/arm/freescale/imx/imx6_usbphy.c b/freebsd/sys/arm/freescale/imx/imx6_usbphy.c
index 8f47507b..ad545601 100644
--- a/freebsd/sys/arm/freescale/imx/imx6_usbphy.c
+++ b/freebsd/sys/arm/freescale/imx/imx6_usbphy.c
@@ -91,6 +91,17 @@ usbphy_detach(device_t dev)
 	return (0);
 }
 
+#ifdef __rtems__
+#define BUS_SPACE_PHYSADDR(res, offs) \
+	((u_int)(rman_get_start(res)+(offs)))
+
+void
+imx6_anatop_write_4(bus_size_t offset, uint32_t value)
+{
+
+	bus_space_write_4(0, 0x20c8000, offset, value);
+}
+#endif /* __rtems__ */
 static int
 usbphy_attach(device_t dev)
 {
diff --git a/freebsd/sys/dev/usb/controller/ehci_imx.c b/freebsd/sys/dev/usb/controller/ehci_imx.c
index a872fb62..d158df1d 100644
--- a/freebsd/sys/dev/usb/controller/ehci_imx.c
+++ b/freebsd/sys/dev/usb/controller/ehci_imx.c
@@ -303,6 +303,16 @@ imx_ehci_probe(device_t dev)
 		return (ENXIO);
 
 	if (ofw_bus_search_compatible(dev, compat_data)->ocd_data != 0) {
+#ifdef __rtems__
+		char dr_mode[24];
+
+		if (OF_getprop(ofw_bus_get_node(dev), "dr_mode",
+		    &dr_mode, sizeof(dr_mode)) > 0 &&
+		    strcasecmp(dr_mode, "host") != 0) {
+			return (ENXIO);
+		}
+#endif /* __rtems__ */
+
 		device_set_desc(dev, "Freescale i.MX integrated USB controller");
 		return (BUS_PROBE_DEFAULT);
 	}
@@ -437,8 +447,10 @@ imx_ehci_attach(device_t dev)
 		goto out;
 	}
 
+#ifndef __rtems__
 	/* Turn on clocks. */
 	imx_ccm_usb_enable(dev);
+#endif /* __rtems__ */
 
 	/* Disable overcurrent detection, if configured to do so. */
 	if (OF_hasprop(ofw_bus_get_node(sc->dev), "disable-over-current"))
diff --git a/freebsd/sys/dev/usb/usb_busdma.c b/freebsd/sys/dev/usb/usb_busdma.c
index 9a70c687..c8000170 100644
--- a/freebsd/sys/dev/usb/usb_busdma.c
+++ b/freebsd/sys/dev/usb/usb_busdma.c
@@ -78,6 +78,52 @@ static void	usb_pc_common_mem_cb(void *, bus_dma_segment_t *, int, int,
 		    uint8_t);
 #endif
 
+#ifdef __rtems__
+#include <bsp.h>
+#if defined(LIBBSP_ARM_IMX_BSP_H)
+#define NEED_MISSALIGNED_COPY
+#endif
+
+#ifdef NEED_MISSALIGNED_COPY
+/*
+ * Note: This functions are used instead of memcpy for regions where a
+ * misaligned access is not allowed (e.g. peripheral memory).
+ */
+static void misaligned_do_copy(
+  uint8_t *dst,
+  const uint8_t *src,
+  size_t n,
+  bool aligned
+)
+{
+  if (aligned) {
+    while (n > 3) {
+      *(uint32_t *)dst = *(uint32_t *)src;
+      dst += 4;
+      src += 4;
+      n -= 4;
+    }
+  }
+
+  while (n > 0) {
+    *dst = *src;
+    ++dst;
+    ++src;
+    --n;
+  }
+}
+
+void misaligned_copy_to_io(void *dst, const void *src, size_t n)
+{
+  misaligned_do_copy(dst, src, n, ((uintptr_t)dst) % 4 == 0);
+}
+
+void misaligned_copy_from_io(void *dst, const void *src, size_t n)
+{
+  misaligned_do_copy(dst, src, n, ((uintptr_t)src) % 4 == 0);
+}
+#endif
+#endif /* __rtems__ */
 /*------------------------------------------------------------------------*
  *  usbd_get_page - lookup DMA-able memory for the given offset
  *
@@ -182,7 +228,11 @@ usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset,
 		if (buf_res.length > len) {
 			buf_res.length = len;
 		}
+#if defined(__rtems__) && defined(NEED_MISSALIGNED_COPY)
+		misaligned_copy_to_io(buf_res.buffer, ptr, buf_res.length);
+#else /* __rtems__ */
 		memcpy(buf_res.buffer, ptr, buf_res.length);
+#endif /* __rtems__ */
 
 		offset += buf_res.length;
 		len -= buf_res.length;
@@ -302,7 +352,11 @@ usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset,
 		if (res.length > len) {
 			res.length = len;
 		}
+#if defined(__rtems__) && defined(NEED_MISSALIGNED_COPY)
+		misaligned_copy_from_io(ptr, res.buffer, res.length);
+#else /* __rtems__ */
 		memcpy(ptr, res.buffer, res.length);
+#endif /* __rtems__ */
 
 		offset += res.length;
 		len -= res.length;
diff --git a/libbsd.py b/libbsd.py
index 6eaca5ad..ed6493b2 100644
--- a/libbsd.py
+++ b/libbsd.py
@@ -5018,6 +5018,8 @@ class imx(builder.Module):
         mm = self.manager
         self.addKernelSpaceHeaderFiles(
             [
+                'sys/arm/freescale/imx/imx6_anatopreg.h',
+                'sys/arm/freescale/imx/imx6_anatopvar.h',
                 'sys/arm/freescale/imx/imx6_ccmreg.h',
                 'sys/arm/freescale/imx/imx6_machdep.h',
                 'sys/arm/freescale/imx/imx_machdep.h',
@@ -5026,6 +5028,8 @@ class imx(builder.Module):
         self.addKernelSpaceSourceFiles(
             [
                 'sys/arm/freescale/imx/imx6_ccm.c',
+                'sys/arm/freescale/imx/imx6_usbphy.c',
+                'sys/dev/usb/controller/ehci_imx.c',
             ],
             mm.generator['source']()
         )
diff --git a/rtemsbsd/include/bsp/nexus-devices.h b/rtemsbsd/include/bsp/nexus-devices.h
index 0a210bd9..d2ceab8e 100644
--- a/rtemsbsd/include/bsp/nexus-devices.h
+++ b/rtemsbsd/include/bsp/nexus-devices.h
@@ -128,6 +128,11 @@ RTEMS_BSD_DEFINE_NEXUS_DEVICE(ofwbus, 0, 0, NULL);
 SYSINIT_DRIVER_REFERENCE(simplebus, ofwbus);
 
 SYSINIT_DRIVER_REFERENCE(ccm, simplebus);
+SYSINIT_DRIVER_REFERENCE(ehci, simplebus);
+SYSINIT_DRIVER_REFERENCE(usbphy, simplebus);
+SYSINIT_DRIVER_REFERENCE(usbus, ehci);
+RTEMS_BSD_DRIVER_USB;
+RTEMS_BSD_DRIVER_USB_MASS;
 
 SYSINIT_DRIVER_REFERENCE(ffec, simplebus);
 SYSINIT_DRIVER_REFERENCE(ukphy, miibus);
-- 
2.16.4



More information about the devel mailing list