上篇博文描述了如何在RTEMS上实现FDT,这篇文章将展示如何在RTEMS-libbsd上实现FDT support。
rtems-libbsd 管理总线的实现在nexus-devices.h文件中,也就是: rtemsbsd/include/bsp/nexus-devices.h
/* * Copyright (c) 2013-2015 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 * 82178 Puchheim * Germany ** * Copyright (c) 2016 Chris Johns 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 #include #include #if defined(LIBBSP_ARM_REALVIEW_PBX_A9_BSP_H)#include RTEMS_BSD_DRIVER_SMC0(0x4e000000, RVPBXA9_IRQ_ETHERNET);#elif defined(LIBBSP_ARM_LPC32XX_BSP_H)#include 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 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 #include 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 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
可以看出里面并没有包含对BBB的支持,因此需要添加以下字段:
#elif defined(LIBBSP_ARM_BEAGLE_BSP_H)然后就是添加总线支持,FreeBSD的设备树是root_bus是总线,然后nexus挂载在root_bus,然后ofwbus挂载在nexus上,接着simplebus挂在ofwbus上。然后其他的uhub或者其他设备挂载在simplebus上。
因此需要添加如下代码:
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);第一行表示将ofwbus挂载在nexus上,后面几行则是其他挂载关系。这样就能在bsp层实现FDT support。
除此之外,查看opt_platform.h文件,可以看出,如果需要使能FDT,还应该定义宏BSP_FDT_IS_SUPPORTED。
因此我们需要在rtems 源码的bsp.h中添加:
#define BSP_FDT_IS_SUPPORTED
以上就是RTEMS-libbsd添加FDT支持的方法。