Now RTEMS can detect USB device on Beaglebone Black. --- freebsd/sys/arm/ti/am335x/am335x_musb.c | 14 ++++ freebsd/sys/arm/ti/am335x/am335x_prcm.c | 18 +++++ freebsd/sys/arm/ti/am335x/am335x_usbss.c | 19 +++++ freebsd/sys/arm/ti/ti_cpuid.h | 19 +++++ freebsd/sys/arm/ti/ti_prcm.c | 2 + freebsd/sys/arm/ti/ti_scm.c | 9 +++ libbsd.py | 30 +++++++ libbsd_waf.py | 6 ++ rtemsbsd/include/bsp/nexus-devices.h | 12 +++ rtemsbsd/include/machine/rtems-bsd-nexus-bus.h | 108 +++++++++++++++++++++++++ 10 files changed, 237 insertions(+)
diff --git a/freebsd/sys/arm/ti/am335x/am335x_musb.c b/freebsd/sys/arm/ti/am335x/am335x_musb.c index 52d799c..fff217e 100644 --- a/freebsd/sys/arm/ti/am335x/am335x_musb.c +++ b/freebsd/sys/arm/ti/am335x/am335x_musb.c @@ -223,11 +223,13 @@ musbotg_wrapper_interrupt(void *arg) static int musbotg_probe(device_t dev) { +#ifndef __rtems__ if (!ofw_bus_status_okay(dev)) return (ENXIO); if (!ofw_bus_is_compatible(dev, "ti,musb-am33xx")) return (ENXIO); +#endif /* __rtems__ */ device_set_desc(dev, "TI AM33xx integrated USB OTG controller"); @@ -310,6 +312,7 @@ musbotg_attach(device_t dev) } sc->sc_otg.sc_platform_data = sc; +#ifndef __rtems__ if (OF_getprop(ofw_bus_get_node(dev), "dr_mode", mode, sizeof(mode)) > 0) { if (strcasecmp(mode, "host") == 0) @@ -323,6 +326,13 @@ musbotg_attach(device_t dev) else sc->sc_otg.sc_mode = MUSB2_HOST_MODE; } +#else /* __rtems__ */ + /* Beaglebone defaults: USB0 device, USB1 HOST. */ + if (sc->sc_otg.sc_id == 0) + sc->sc_otg.sc_mode = MUSB2_DEVICE_MODE; + else + sc->sc_otg.sc_mode = MUSB2_HOST_MODE; +#endif /* __rtems__ */ /* * software-controlled function @@ -417,5 +427,9 @@ static driver_t musbotg_driver = { static devclass_t musbotg_devclass; +#ifdef __rtems__ +DRIVER_MODULE(musbotg, nexus, musbotg_driver, musbotg_devclass, 0, 0); +#else /* __rtems__ */ DRIVER_MODULE(musbotg, usbss, musbotg_driver, musbotg_devclass, 0, 0); +#endif /* __rtems__ */ MODULE_DEPEND(musbotg, usbss, 1, 1, 1); diff --git a/freebsd/sys/arm/ti/am335x/am335x_prcm.c b/freebsd/sys/arm/ti/am335x/am335x_prcm.c index 1d10f7f..5ba452a 100644 --- a/freebsd/sys/arm/ti/am335x/am335x_prcm.c +++ b/freebsd/sys/arm/ti/am335x/am335x_prcm.c @@ -36,12 +36,18 @@ __FBSDID("$FreeBSD$"); #include <sys/module.h> #include <sys/malloc.h> #include <sys/rman.h> +#ifndef __rtems__ #include <sys/timeet.h> +#endif /* __rtems__ */ #include <sys/timetc.h> +#ifndef __rtems__ #include <sys/watchdog.h> +#endif /* __rtems__ */ #include <machine/bus.h> #include <machine/cpu.h> +#ifndef __rtems__ #include <machine/intr.h> +#endif /* __rtems__ */ #include <arm/ti/tivar.h> #include <arm/ti/ti_scm.h> @@ -409,6 +415,10 @@ static int am335x_prcm_probe(device_t dev) { +#ifdef __rtems__ + device_set_desc(dev, "AM335x Power and Clock Management"); + return(BUS_PROBE_DEFAULT); +#else /* __rtems__ */ if (!ofw_bus_status_okay(dev)) return (ENXIO); @@ -418,6 +428,7 @@ am335x_prcm_probe(device_t dev) } return (ENXIO); +#endif /* __rtems__ */ } static int @@ -438,7 +449,9 @@ am335x_prcm_attach(device_t dev) sc->bsh = rman_get_bushandle(sc->res[0]); am335x_prcm_sc = sc; +#ifndef __rtems__ ti_cpu_reset = am335x_prcm_reset; +#endif /* __rtems__ */ if (am335x_clk_get_sysclk_freq(NULL, &sysclk) != 0) sysclk = 0; @@ -467,8 +480,13 @@ static driver_t am335x_prcm_driver = { static devclass_t am335x_prcm_devclass; +#ifdef __rtems__ +DRIVER_MODULE(am335x_prcm, nexus, am335x_prcm_driver, + am335x_prcm_devclass, 0, 0); +#else /* __rtems__ */ DRIVER_MODULE(am335x_prcm, simplebus, am335x_prcm_driver, am335x_prcm_devclass, 0, 0); +#endif /* __rtems__ */ MODULE_VERSION(am335x_prcm, 1); MODULE_DEPEND(am335x_prcm, ti_scm, 1, 1, 1); diff --git a/freebsd/sys/arm/ti/am335x/am335x_usbss.c b/freebsd/sys/arm/ti/am335x/am335x_usbss.c index d7b43a2..9f8f912 100644 --- a/freebsd/sys/arm/ti/am335x/am335x_usbss.c +++ b/freebsd/sys/arm/ti/am335x/am335x_usbss.c @@ -116,11 +116,13 @@ static int usbss_probe(device_t dev) { +#ifndef __rtems__ if (!ofw_bus_status_okay(dev)) return (ENXIO); if (!ofw_bus_is_compatible(dev, "ti,am33xx-usb")) return (ENXIO); +#endif /* __rtems__ */ device_set_desc(dev, "TI AM33xx integrated USB OTG controller"); @@ -168,6 +170,7 @@ usbss_attach(device_t dev) device_printf(dev, "TI AM335X USBSS v%d.%d.%d\n", (rev >> 8) & 7, (rev >> 6) & 3, rev & 63); +#ifndef __rtems__ node = ofw_bus_get_node(dev); if (node == -1) { @@ -176,17 +179,20 @@ usbss_attach(device_t dev) } simplebus_init(dev, node); +#endif /* __rtems__ */ /* * Allow devices to identify. */ bus_generic_probe(dev); +#ifndef __rtems__ /* * Now walk the OFW tree and attach top-level devices. */ for (node = OF_child(node); node > 0; node = OF_peer(node)) simplebus_add_device(dev, node, 0, NULL, -1, NULL); +#endif /* __rtems__ */ return (bus_generic_attach(dev)); } @@ -218,9 +224,22 @@ static device_method_t usbss_methods[] = { DEVMETHOD_END }; +#ifdef __rtems__ +static driver_t usbss_driver = { + "usbss", + usbss_methods, + sizeof(struct usbss_softc), +}; +#endif /* __rtems__ */ +#ifndef __rtems__ DEFINE_CLASS_1(usbss, usbss_driver, usbss_methods, sizeof(struct usbss_softc), simplebus_driver); +#endif /* __rtems__ */ static devclass_t usbss_devclass; +#ifdef __rtems__ +DRIVER_MODULE(usbss, nexus, usbss_driver, usbss_devclass, 0, 0); +#else /* __rtems__ */ DRIVER_MODULE(usbss, simplebus, usbss_driver, usbss_devclass, 0, 0); +#endif /* __rtems__ */ MODULE_DEPEND(usbss, usb, 1, 1, 1); diff --git a/freebsd/sys/arm/ti/ti_cpuid.h b/freebsd/sys/arm/ti/ti_cpuid.h index 715f080..213714b 100644 --- a/freebsd/sys/arm/ti/ti_cpuid.h +++ b/freebsd/sys/arm/ti/ti_cpuid.h @@ -29,6 +29,9 @@ #ifndef _TI_CPUID_H_ #define _TI_CPUID_H_ +#ifdef __rtems__ +#include <bsp.h> +#endif /* __rtems__ */ #define OMAP_MAKEREV(d, a, b, c) \ (uint32_t)(((d) << 16) | (((a) & 0xf) << 8) | (((b) & 0xf) << 4) | ((c) & 0xf)) @@ -70,7 +73,23 @@ #define CHIP_OMAP_4 0 #define CHIP_AM335X 1 +#ifdef __rtems__ +#ifdef IS_AM335X +#define SOC_TI_AM335X +#else +#warning Unknown SOC. +#endif + +#if defined(SOC_TI_AM335X) +#define _ti_chip CHIP_AM335X +#elif defined(SOC_OMAP4) +#define _ti_chip CHIP_OMAP_4 +#else +#define _ti_chip -1 +#endif +#else /* __rtems__ */ extern int _ti_chip; +#endif /* __rtems__ */ static __inline int ti_chip(void) { diff --git a/freebsd/sys/arm/ti/ti_prcm.c b/freebsd/sys/arm/ti/ti_prcm.c index b4dd03f..04b1b6b 100644 --- a/freebsd/sys/arm/ti/ti_prcm.c +++ b/freebsd/sys/arm/ti/ti_prcm.c @@ -55,7 +55,9 @@ __FBSDID("$FreeBSD$"); #include <machine/bus.h> #include <machine/resource.h> +#ifndef __rtems__ #include <machine/intr.h> +#endif /* __rtems__ */ #include <arm/ti/ti_cpuid.h> #include <arm/ti/ti_prcm.h> diff --git a/freebsd/sys/arm/ti/ti_scm.c b/freebsd/sys/arm/ti/ti_scm.c index 2e54262..2ea9975 100644 --- a/freebsd/sys/arm/ti/ti_scm.c +++ b/freebsd/sys/arm/ti/ti_scm.c @@ -66,7 +66,9 @@ __FBSDID("$FreeBSD$"); #include <dev/ofw/openfirm.h> #include <dev/ofw/ofw_bus.h> #include <dev/ofw/ofw_bus_subr.h> +#ifndef __rtems__ #include <dev/fdt/fdt_pinctrl.h> +#endif /* __rtems__ */ #include "ti_scm.h" @@ -88,6 +90,7 @@ static struct ti_scm_softc *ti_scm_sc; static int ti_scm_probe(device_t dev) { +#ifndef __rtems__ if (!ofw_bus_status_okay(dev)) return (ENXIO); @@ -97,6 +100,7 @@ ti_scm_probe(device_t dev) if (ti_scm_sc) { return (EEXIST); } +#endif /* __rtems__ */ device_set_desc(dev, "TI Control Module"); return (BUS_PROBE_DEFAULT); @@ -172,5 +176,10 @@ static driver_t ti_scm_driver = { static devclass_t ti_scm_devclass; +#ifdef __rtems__ +EARLY_DRIVER_MODULE(ti_scm, nexus, ti_scm_driver, ti_scm_devclass, 0, 0, + BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE); +#else /* __rtems__ */ EARLY_DRIVER_MODULE(ti_scm, simplebus, ti_scm_driver, ti_scm_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE); +#endif /* __rtems__ */ diff --git a/libbsd.py b/libbsd.py index e171a9d..c53d5a00 100644 --- a/libbsd.py +++ b/libbsd.py @@ -890,6 +890,35 @@ def dev_usb_storage_add_on(mm): return mod # +# BBB USB +# +def dev_usb_controller_bbb(mm): + mod = builder.Module('dev_usb_controller_bbb') + mod.addDependency(mm['dev_usb']) + mod.addKernelSpaceHeaderFiles( + [ + 'sys/arm/ti/ti_cpuid.h', + 'sys/arm/ti/ti_prcm.h', + 'sys/arm/ti/ti_scm.h', + 'sys/arm/ti/tivar.h', + 'sys/arm/ti/am335x/am335x_scm.h', + 'sys/dev/usb/controller/musb_otg.h', + ] + ) + mod.addKernelSpaceSourceFiles( + [ + 'sys/arm/ti/ti_scm.c', + 'sys/arm/ti/am335x/am335x_prcm.c', + 'sys/arm/ti/am335x/am335x_usbss.c', + 'sys/arm/ti/ti_prcm.c', + 'sys/arm/ti/am335x/am335x_musb.c', + 'sys/dev/usb/controller/musb_otg.c', + ], + mm.generator['source']() + ) + return mod + +# # USB Template # def dev_usb_template(mm): @@ -3195,6 +3224,7 @@ def sources(mm): mm.addModule(cam(mm)) mm.addModule(dev_usb_storage(mm)) #mm.addModule(dev_usb_storage_add_on(mm)) + mm.addModule(dev_usb_controller_bbb(mm)) #mm.addModule(dev_usb_template(mm)) diff --git a/libbsd_waf.py b/libbsd_waf.py index 30765de..5d0d5d0 100644 --- a/libbsd_waf.py +++ b/libbsd_waf.py @@ -731,6 +731,11 @@ def build(bld): source = ['freebsd/sys/arm/lpc/if_lpe.c', 'freebsd/sys/arm/lpc/lpc_pwr.c', + 'freebsd/sys/arm/ti/am335x/am335x_musb.c', + 'freebsd/sys/arm/ti/am335x/am335x_prcm.c', + 'freebsd/sys/arm/ti/am335x/am335x_usbss.c', + 'freebsd/sys/arm/ti/ti_prcm.c', + 'freebsd/sys/arm/ti/ti_scm.c', 'freebsd/sys/arm/xilinx/zy7_slcr.c', 'freebsd/sys/cam/cam.c', 'freebsd/sys/cam/scsi/scsi_all.c', @@ -896,6 +901,7 @@ def build(bld): 'freebsd/sys/dev/tsec/if_tsec_fdt.c', 'freebsd/sys/dev/usb/controller/dwc_otg.c', 'freebsd/sys/dev/usb/controller/ehci.c', + 'freebsd/sys/dev/usb/controller/musb_otg.c', 'freebsd/sys/dev/usb/controller/ohci.c', 'freebsd/sys/dev/usb/controller/usb_controller.c', 'freebsd/sys/dev/usb/input/atp.c', diff --git a/rtemsbsd/include/bsp/nexus-devices.h b/rtemsbsd/include/bsp/nexus-devices.h index 1fbf756..6fe4f7d 100644 --- a/rtemsbsd/include/bsp/nexus-devices.h +++ b/rtemsbsd/include/bsp/nexus-devices.h @@ -46,6 +46,18 @@ RTEMS_BSD_DRIVER_SMC0(0x4e000000, RVPBXA9_IRQ_ETHERNET); +#elif defined(LIBBSP_ARM_BEAGLE_BSP_H) + +#include <bsp/irq.h> + +RTEMS_BSD_DRIVER_MUSB1(0x47401c00, 0x47401800, 0x13); +RTEMS_BSD_DRIVER_MUSB0(0x47401400, 0x47401000, 0x12); +RTEMS_BSD_DRIVER_USBSS(0x47400000); +RTEMS_BSD_DRIVER_AM335x_PRCM(0x44e00000); +RTEMS_BSD_DRIVER_TI_SCM(0x44e10000); + +RTEMS_BSD_DRIVER_USB; + #elif defined(LIBBSP_ARM_LPC32XX_BSP_H) #include <bsp/irq.h> diff --git a/rtemsbsd/include/machine/rtems-bsd-nexus-bus.h b/rtemsbsd/include/machine/rtems-bsd-nexus-bus.h index 06048b7..fc15bab 100644 --- a/rtemsbsd/include/machine/rtems-bsd-nexus-bus.h +++ b/rtemsbsd/include/machine/rtems-bsd-nexus-bus.h @@ -40,6 +40,8 @@ * RTEMS_BSD_DRIVER_XILINX_ZYNQ_SLCR * RTEMS_BSD_DRIVER_LPC32XX_PWR * RTEMS_BSD_DRIVER_LPC32XX_TSC + * RTEMS_BSD_DRIVER_TI_SCM + * RTEMS_BSD_DRIVER_AM335x_PRCM * * Buses: * RTEMS_BSD_DRIVER_PC_LEGACY @@ -53,6 +55,9 @@ * RTEMS_BSD_DRIVER_MMC * RTEMS_BSD_DRIVER_USB * RTEMS_BSD_DRIVER_USB_MASS + * RTEMS_BSD_DRIVER_USBSS + * RTEMS_BSD_DRIVER_MUSB0 + * RTEMS_BSD_DRIVER_MUSB1 * * Networking: * RTEMS_BSD_DRIVER_SMC0 @@ -158,6 +163,40 @@ extern "C" { &lpc_tsc0_res[0]) #endif /* RTEMS_BSD_DRIVER_LPC32XX_TSC */ +/* + * Ti SCM + */ +#if !defined(RTEMS_BSD_DRIVER_TI_SCM) + #define RTEMS_BSD_DRIVER_TI_SCM(_base) \ + static const rtems_bsd_device_resource ti_scm_res[] = { \ + { \ + .type = RTEMS_BSD_RES_MEMORY, \ + .start_request = 0, \ + .start_actual = (_base) \ + } \ + }; \ + RTEMS_BSD_DEFINE_NEXUS_DEVICE(ti_scm, 0, \ + RTEMS_ARRAY_SIZE(ti_scm_res), \ + &ti_scm_res[0]) +#endif /* RTEMS_BSD_DRIVER_TI_SCM */ + +/* + * AM335x PRCM + */ +#if !defined(RTEMS_BSD_DRIVER_AM335x_PRCM) + #define RTEMS_BSD_DRIVER_AM335x_PRCM(_base) \ + static const rtems_bsd_device_resource am335x_prcm_res[] = { \ + { \ + .type = RTEMS_BSD_RES_MEMORY, \ + .start_request = 0, \ + .start_actual = (_base) \ + } \ + }; \ + RTEMS_BSD_DEFINE_NEXUS_DEVICE(am335x_prcm, 0, \ + RTEMS_ARRAY_SIZE(am335x_prcm_res),\ + &am335x_prcm_res[0]) +#endif /* RTEMS_BSD_DRIVER_AM335x_PRCM */ + /** ** Physical Buses **/ @@ -255,6 +294,75 @@ extern "C" { SYSINIT_DRIVER_REFERENCE(umass, uhub) #endif /* RTEMS_BSD_DRIVER_USB_MASS */ +/* + * USBSS driver. + */ +#if !defined(RTEMS_BSD_DRIVER_USBSS) + #define RTEMS_BSD_DRIVER_USBSS(_base) \ + static const rtems_bsd_device_resource usbss_res[] = { \ + { \ + .type = RTEMS_BSD_RES_MEMORY, \ + .start_request = 0, \ + .start_actual = (_base) \ + } \ + }; \ + RTEMS_BSD_DEFINE_NEXUS_DEVICE(usbss, 0, \ + RTEMS_ARRAY_SIZE(usbss_res), \ + &usbss_res[0]) +#endif /* RTEMS_BSD_DRIVER_USBSS */ + +/* + * MUSB0 driver. + */ +#if !defined(RTEMS_BSD_DRIVER_MUSB0) + #define RTEMS_BSD_DRIVER_MUSB0(_base0, _base1, _irq) \ + static const rtems_bsd_device_resource musbotg0_res[] = { \ + { \ + .type = RTEMS_BSD_RES_MEMORY, \ + .start_request = 0, \ + .start_actual = (_base0) \ + }, { \ + .type = RTEMS_BSD_RES_MEMORY, \ + .start_request = 1, \ + .start_actual = (_base1) \ + }, { \ + .type = RTEMS_BSD_RES_IRQ, \ + .start_request = 0, \ + .start_actual = (_irq) \ + } \ + \ + }; \ + RTEMS_BSD_DEFINE_NEXUS_DEVICE(musbotg, 0, \ + RTEMS_ARRAY_SIZE(musbotg0_res), \ + &musbotg0_res[0]) +#endif /* RTEMS_BSD_DRIVER_MUSB0 */ + +/* + * MUSB1 driver. + */ +#if !defined(RTEMS_BSD_DRIVER_MUSB1) + #define RTEMS_BSD_DRIVER_MUSB1(_base0, _base1, _irq) \ + static const rtems_bsd_device_resource musbotg1_res[] = { \ + { \ + .type = RTEMS_BSD_RES_MEMORY, \ + .start_request = 0, \ + .start_actual = (_base0) \ + }, { \ + .type = RTEMS_BSD_RES_MEMORY, \ + .start_request = 1, \ + .start_actual = (_base1) \ + }, { \ + .type = RTEMS_BSD_RES_IRQ, \ + .start_request = 0, \ + .start_actual = (_irq) \ + } \ + \ + }; \ + RTEMS_BSD_DEFINE_NEXUS_DEVICE(musbotg, 1, \ + RTEMS_ARRAY_SIZE(musbotg1_res), \ + &musbotg1_res[0]) +#endif /* RTEMS_BSD_DRIVER_MUSB1 */ + /** ** Networking **/ -- 2.7.4 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel