Implemention of RTEMS-libbsd FDT support for BBB
The previous blog article describes how to implement FDT on RTEMS. This article will show you how to implement FDT support on RTEMS-libbsd.
Then, to add bus support, FreeBSD's device tree is root_bus, the bus, then nexus mounts on root_bus, then ofwbus mounts on nexus, and then simplebus hangs on ofwbus. Then other uhub or other devices are mounted on the simplebus.
The implementation of the rtems-libbsd management bus is in the nexus-devices.h file, that is, rtemsbsd/include/bsp/nexus-devices.h
- /*
- * Copyright (c) 2013-2015 embedded brains GmbH. All rights reserved.
- *
- * embedded brains GmbH
- * Dornierstr. 4
- * 82178 Puchheim
- * Germany
- * <rtems@embedded-brains.de>
- *
- * Copyright (c) 2016 Chris Johns <chrisj@rtems.org> All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
- #if !defined(BSP_NEXUS_DEVICES_h)
- #define BSP_NEXUS_DEVICES_h
- #include <bsp.h>
- #include <rtems/bsd/bsd.h>
- #include <machine/rtems-bsd-nexus-bus.h>
- #if defined(LIBBSP_ARM_REALVIEW_PBX_A9_BSP_H)
- #include <bsp/irq.h>
- RTEMS_BSD_DRIVER_SMC0(0x4e000000, RVPBXA9_IRQ_ETHERNET);
- #elif defined(LIBBSP_ARM_LPC32XX_BSP_H)
- #include <bsp/irq.h>
- RTEMS_BSD_DRIVER_LPC32XX_PWR;
- RTEMS_BSD_DRIVER_LPC32XX_LPE;
- RTEMS_BSD_DRIVER_ICSPHY;
- RTEMS_BSD_DRIVER_LPC32XX_OHCI;
- SYSINIT_DRIVER_REFERENCE(usbus, ohci);
- RTEMS_BSD_DRIVER_USB;
- RTEMS_BSD_DRIVER_USB_MASS;
- #elif defined(LIBBSP_M68K_GENMCF548X_BSP_H)
- RTEMS_BSD_DRIVER_FEC;
- #elif defined(LIBBSP_ARM_XILINX_ZYNQ_BSP_H)
- #include <bsp/irq.h>
- RTEMS_BSD_DRIVER_XILINX_ZYNQ_SLCR;
- RTEMS_BSD_DRIVER_XILINX_ZYNQ_CGEM0(ZYNQ_IRQ_ETHERNET_0);
- RTEMS_BSD_DRIVER_E1000PHY;
- #elif defined(LIBBSP_ARM_ATSAM_BSP_H)
- RTEMS_BSD_DRIVER_USB;
- RTEMS_BSD_DRIVER_USB_MASS;
- #elif defined(LIBBSP_ARM_ALTERA_CYCLONE_V_BSP_H)
- #include <bsp/socal/hps.h>
- #include <bsp/irq.h>
- RTEMS_BSD_DRIVER_DWC0((unsigned long) ALT_EMAC1_ADDR,
- ALT_INT_INTERRUPT_EMAC1_IRQ);
- RTEMS_BSD_DRIVER_MIPHY;
- RTEMS_BSD_DRIVER_DWCOTG0((unsigned long) ALT_USB1_ADDR,
- ALT_INT_INTERRUPT_USB1_IRQ);
- RTEMS_BSD_DRIVER_DWC_MMC;
- RTEMS_BSD_DRIVER_MMC;
- RTEMS_BSD_DRIVER_USB;
- RTEMS_BSD_DRIVER_USB_MASS;
- #elif defined(LIBBSP_ARM_LPC24XX_BSP_H)
- RTEMS_BSD_DEFINE_NEXUS_DEVICE(ohci, 0, 0, NULL);
- SYSINIT_DRIVER_REFERENCE(usbus, ohci);
- RTEMS_BSD_DRIVER_USB;
- RTEMS_BSD_DRIVER_USB_MASS;
- #elif defined(LIBBSP_I386_PC386_BSP_H)
- RTEMS_BSD_DRIVER_PC_LEGACY;
- RTEMS_BSD_DRIVER_PCI_LEM;
- RTEMS_BSD_DRIVER_PCI_IGB;
- RTEMS_BSD_DRIVER_PCI_EM;
- RTEMS_BSD_DRIVER_PCI_RE;
- RTEMS_BSD_DRIVER_REPHY;
- #elif defined(LIBBSP_POWERPC_QORIQ_BSP_H)
- #if !QORIQ_CHIP_IS_T_VARIANT(QORIQ_CHIP_VARIANT)
- #include <bsp/irq.h>
- RTEMS_BSD_DEFINE_NEXUS_DEVICE(ofwbus, 0, 0, NULL);
- SYSINIT_DRIVER_REFERENCE(simplebus, ofwbus);
- SYSINIT_DRIVER_REFERENCE(tsec, simplebus);
- SYSINIT_DRIVER_REFERENCE(ukphy, miibus);
- #endif /* !QORIQ_CHIP_IS_T_VARIANT(QORIQ_CHIP_VARIANT) */
- #endif
- #endif
As you can see, there is no support for BBB, so you need to add the following fields:
Then, to add bus support, FreeBSD's device tree is root_bus, the bus, then nexus mounts on root_bus, then ofwbus mounts on nexus, and then simplebus hangs on ofwbus. Then other uhub or other devices are mounted on the simplebus.
Therefore, the following code needs to be added:
- RTEMS_BSD_DEFINE_NEXUS_DEVICE(ofwbus, 0, 0, NULL);
- SYSINIT_DRIVER_REFERENCE(simplebus, ofwbus);
- SYSINIT_DRIVER_REFERENCE(ti_scm, simplebus);
- SYSINIT_DRIVER_REFERENCE(am335x_prcm, simplebus);
- SYSINIT_DRIVER_REFERENCE(usbss, simplebus);
- SYSINIT_DRIVER_REFERENCE(musbotg, usbss);
The first line indicates that the ofwbus is mounted on the nexus, and the other lines are other mount relationships. This enables FDT support to be implemented at the BSP layer.
In addition, looking at the opt_platform.h file shows that if you need to enable FDT, you should also define the macro BSP_FDT_IS_SUPPORTED.
Therefore, we need to add in the bsp.h of the RTEMS source code:
That's the way RTEMS-libbsd adds FDT support.
评论
发表评论