Hello, just noted: This patch now contains more from my code than from Sebastian. I'll discuss with him whether we change the author before commiting it.
Best regards Christian On 02/04/2020 16:42, Christian Mauderer wrote: > From: Sebastian Huber <sebastian.hu...@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); > -- -------------------------------------------- embedded brains GmbH Herr Christian Mauderer Dornierstr. 4 D-82178 Puchheim Germany email: christian.maude...@embedded-brains.de Phone: +49-89-18 94 741 - 18 Fax: +49-89-18 94 741 - 08 PGP: Public key available on request. Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel