Porting VxWorks 7 to NXP T2080: U-Boot, BSP, and Drivers
Porting an embedded real-time operating system to a new processor involves much more than compiling a kernel for a different CPU. The bootloader, processor initialization, memory map, interrupt controller, peripheral configuration, and device drivers must all work together before the operating system can run reliably on the target hardware.
The NXP T2080, part of the QorIQ Power Architecture family, is designed for demanding embedded applications such as networking, radar processing, and industrial control. Its four PowerPC e6500 cores support eight hardware threads through simultaneous multithreading (SMT), while its AltiVec vector-processing capabilities provide acceleration for computationally intensive workloads.
This article describes a practical approach to adapting VxWorks 7.0 to a custom T2080-based processing card intended for airborne radar applications. The workflow covers bootloader customization, VxWorks kernel configuration, Board Support Package (BSP) development, Device Tree integration, and custom Serial RapidIO (SRIO) driver implementation.
For broader platform context, see the related VxWorks 7 on T2080 adaptation guide and the VxWorks 7 BSP Development Guide.
🚀 Why VxWorks 7 and the T2080? #
VxWorks has a long history in embedded real-time systems, including aerospace, defense, and industrial applications. Its appeal lies in its real-time scheduling, configurable system services, hardware abstraction, and support for developing applications that must respond predictably to external events.
VxWorks 7 further modularizes the operating-system environment, allowing developers to select and configure the components required for a particular product.
The T2080 complements this architecture with a combination of general-purpose processing, multithreading, and vector computation.
T2080 Platform Characteristics #
The key capabilities relevant to this port include:
- Four PowerPC e6500 cores: Provide parallel execution for multiple application functions.
- Eight hardware threads: Enable simultaneous multithreading across the processor cores.
- AltiVec vector engine: Accelerates suitable data-parallel operations, including signal-processing workloads.
- Integrated communication and I/O capabilities: Support the networking and peripheral interfaces used in embedded processing systems.
- QorIQ platform architecture: Provides a foundation for networking, industrial control, and other compute-intensive embedded applications.
For an airborne radar processing card, these capabilities are useful for separating acquisition, signal processing, system management, and communication functions while maintaining predictable real-time behavior.
However, available processing capacity alone does not guarantee deterministic performance. The BSP, interrupt configuration, memory subsystem, driver design, and application scheduling must all be engineered around the target workload.
🧰 Bootloader Development with U-Boot #
The bootloader establishes the hardware environment required for VxWorks to start. It is responsible for early initialization, loading the operating-system image, and transferring control to the kernel using the expected boot parameters.
For the T2080 adaptation described here, U-Boot provides the boot foundation.
Compared with older, board-specific boot mechanisms, U-Boot offers a flexible environment for hardware initialization, image loading, network boot, storage access, and board-level debugging.
The exact boot configuration depends on the T2080 board design, the selected U-Boot version, and the requirements of the VxWorks BSP.
Development Environment #
The original implementation used the following development setup:
- Ubuntu 14.04 running in a VMware environment
- Cross-compilation tools from the NXP Yocto SDK
- U-Boot source code for QorIQ PowerPC platforms
- A reference board configuration based on the T2080RDB
Relevant U-Boot source locations included:
arch/powerpc/mpc85xx/for PowerPC platform initializationboard/freescale/t208xrdb/for the reference board implementation
These directories provide useful starting points, but the organization of U-Boot source code can vary by version. Engineers should verify the directory structure and configuration options in the source tree being used.
T2080 Boot Flow #
The boot sequence depends on the selected boot medium and the board’s boot configuration.
A simplified flow is:
Power-On / Reset
|
v
Early Processor Initialization
|
v
DDR and Essential Hardware Setup
|
v
U-Boot Initialization
|
v
Load VxWorks Image and Boot Parameters
|
v
Transfer Control to VxWorksFor supported NOR Flash configurations, an initial boot stage performs essential hardware initialization before transferring execution to the main U-Boot image.
For SPI Flash or eMMC configurations, a Secondary Program Loader (SPL) may be used to initialize DDR and load the full bootloader. The precise stages depend on the board configuration and its boot implementation.
The bootloader must ultimately establish a valid environment for VxWorks, including suitable memory initialization and any required boot information.
Customizing U-Boot for the Board #
Adapting U-Boot from a reference board to a custom T2080 card typically involves:
- Creating a board-specific configuration based on the closest supported platform.
- Updating the board configuration and hardware parameters.
- Configuring memory initialization for the actual DDR devices.
- Adapting peripheral and bus settings to match the PCB.
- Adding or modifying board-specific configuration targets.
- Building and validating the bootloader image.
A custom board directory might be named t208xleihua, for example, with its own configuration files and build target.
The configuration must reflect the actual hardware. Reusing a reference-board configuration without checking DDR timing, peripheral routing, flash layout, and reset behavior can produce a bootloader that builds successfully but fails on the target board.
The final U-Boot image should be validated independently before integrating it with VxWorks.
⚙️ Adapting the VxWorks 7 Kernel #
Once U-Boot can initialize the board and load an operating-system image, development moves to the VxWorks platform configuration.
The key objective is to create a VxWorks image that matches the T2080 processor, the custom board, and the required peripheral interfaces.
VxWorks 7 uses a modular build architecture, with separate project types for source components and the final bootable system image.
VSB and VIP Projects #
Two important project types are the VxWorks Source Build (VSB) and VxWorks Image Project (VIP).
| Project | Purpose |
|---|---|
| VSB | Builds the selected VxWorks source components and libraries for the target architecture |
| VIP | Configures and builds the bootable VxWorks image using the required kernel components and platform support |
The VSB establishes the system-component configuration available to the final image. The VIP selects the components and settings required for the target application.
A typical development workflow is:
Configure VxWorks Source Build (VSB)
|
v
Build System Libraries
|
v
Configure Image Project
|
v
Select Kernel Components
|
v
Build VxWorks
|
v
Generate Target Image
|
v
Boot and ValidateComponents such as networking, file systems, debugging facilities, and peripheral drivers should be selected according to the requirements of the target system.
Enabling every available component is generally unnecessary. A focused configuration can reduce image size and simplify troubleshooting.
Platform Support and VxBus #
VxWorks 7 organizes platform-specific support and device integration through a more modular architecture than many legacy BSP implementations.
The Platform Support Library (PSL) provides platform-oriented support, while VxBus supplies the framework used by many device drivers.
For the T2080 port, kernel adaptation includes checking that the platform support correctly handles:
- Processor initialization
- Memory configuration
- Interrupt management
- System timers
- Serial-console access
- Network interfaces
- Peripheral registration
- Board-specific hardware resources
Driver and platform configurations should be selected based on the actual VxWorks release and the relevant BSP. Not every legacy VxWorks component or driver interface can be assumed to work unchanged in a newer platform architecture.
🌳 Device Tree Integration #
Device Tree support is an important part of the VxWorks 7 hardware-description model.
Rather than placing every hardware address, interrupt number, or peripheral configuration directly into driver code, the platform can describe much of its hardware through a Device Tree Source (DTS) file.
The DTS is compiled into a Device Tree Blob (DTB), which can then be passed by the bootloader to the operating system when supported by the BSP and boot configuration.
The relationship is:
Custom Board Hardware
|
v
Device Tree Source (.dts)
|
v
Device Tree Compiler
|
v
Device Tree Blob (.dtb)
|
v
U-Boot
|
v
VxWorks
|
v
Device and Driver InitializationThe device tree describes hardware properties such as:
- CPU and memory configuration
- Peripheral register regions
- Interrupt assignments
- Bus topology
- Clock relationships
- Peripheral compatibility identifiers
- Board-specific hardware connections
For the T2080 board, the device tree must reflect the actual processor and PCB implementation rather than relying entirely on the reference-board description.
Why Device Tree Matters #
Consider two boards based on the same T2080 processor.
They may share the same CPU architecture while using different memory layouts, Ethernet PHYs, serial interfaces, interrupt routing, or external devices.
Without a structured hardware description, supporting both boards can require separate modifications to driver code.
Device Tree allows much of this variation to be represented as board configuration, improving maintainability and making drivers more reusable.
It is still necessary to ensure that the relevant VxWorks driver understands the properties being supplied. A device tree does not automatically create support for an otherwise unsupported peripheral.
Debugging the DTB #
Device Tree problems can prevent devices from being discovered or initialized even when the associated driver compiles correctly.
A practical validation process includes:
- Inspecting the DTS for correct hardware descriptions.
- Compiling the DTS into a DTB.
- Confirming that U-Boot loads or passes the intended DTB.
- Verifying memory regions and interrupt assignments.
- Checking that driver-compatible strings match the expected values.
- Inspecting the target’s device information during startup.
Where available in the development environment, tools such as vxrtdtbdump can help inspect the compiled DTB.
For additional implementation details, see Device Tree-Based Driver Development in VxWorks 7.0.
🔌 Custom Driver Development with VxBus #
A complete port often requires custom drivers for peripherals that are not supported by the available BSP or cannot be used without board-specific modifications.
In the airborne radar implementation, Serial RapidIO (SRIO) interfaces required custom driver development.
SRIO is used in embedded systems that need high-speed communication among processors, data-processing cards, and other specialized hardware.
VxBus-Based Driver Design #
VxBus provides a structured framework for integrating devices with VxWorks.
A driver implementation typically needs to manage:
- Device discovery and registration
- Hardware-resource mapping
- Register access
- Interrupt configuration
- Data-transfer operations
- Error handling
- Device initialization
- Communication with application software
A simplified driver-integration model is:
Device Tree Node
|
v
Device Matching / Discovery
|
v
VxBus Driver Initialization
|
v
Map Hardware Resources
|
v
Configure Interrupts and Registers
|
v
Expose Device Services
|
v
ApplicationThe driver should use the interfaces supported by the selected VxWorks release and VxBus implementation. Exact callback names, registration methods, and device-resource APIs depend on the driver framework version.
Modeling Multiple SRIO Ports #
In the described implementation, multiple physical SRIO ports were represented as a single logical device because they shared certain hardware registers.
This type of design can simplify access to shared resources, but it also requires careful coordination.
The driver must distinguish between registers shared by all ports and registers specific to an individual port. It must also ensure that initialization or runtime operations on one port do not unintentionally affect another.
Important implementation considerations include:
- Defining the relationship between logical and physical ports
- Managing shared-register access
- Configuring port-specific resources
- Handling interrupts and errors
- Synchronizing concurrent operations
- Validating throughput and latency under load
The driver source was integrated into the VSB in this implementation to support close integration with the system build and facilitate system-level debugging.
Whether a driver should be built into the VxWorks image or delivered separately depends on deployment, maintenance, dependency, and update requirements.
Driver Testing #
Driver validation should proceed from basic hardware access to full application-level operation.
A useful sequence is:
- Verify register access and hardware identification.
- Confirm device initialization and port configuration.
- Test interrupt delivery.
- Validate basic transmit and receive operations.
- Test multiple ports and shared-register access.
- Measure throughput and latency.
- Exercise error-handling and recovery paths.
- Run system-level tests under realistic application load.
For other VxWorks 7 driver-development patterns, the VxWorks PCIe Driver Development Guide provides related examples of driver integration, hardware resources, interrupts, and DMA.
🧪 Hardware Bring-Up and System Validation #
A successful build does not guarantee a successful port. The custom board must be validated at every stage between reset and application execution.
The recommended approach is to bring up the platform incrementally.
Stage 1: Processor and Bootloader #
Verify that the processor exits reset correctly, basic initialization completes, and U-Boot starts reliably.
Check serial-console output and confirm that the bootloader can access the expected memory and boot media.
Stage 2: Memory and Kernel Startup #
Validate DDR initialization, memory placement, image loading, and the transfer of control from U-Boot to VxWorks.
Memory-map errors at this stage can cause hangs, exceptions, or corrupted system state.
Stage 3: BSP Services #
Verify the functions required by the operating system, including timers, interrupts, serial output, and essential platform services.
These services form the foundation for debugging more complex failures.
Stage 4: Device Tree and Drivers #
Check that the expected devices are described correctly and that the associated drivers initialize successfully.
Test peripherals individually before combining them into a complete system.
Stage 5: Application-Level Validation #
Finally, exercise the radar-processing workload and its communication paths.
Measure processing latency, interrupt response, I/O throughput, CPU utilization, and system stability under representative load.
The overall process can be summarized as:
U-Boot
|
v
Processor / DDR Initialization
|
v
VxWorks Kernel Startup
|
v
BSP Services
|
v
Device Tree and Driver Initialization
|
v
Peripheral Validation
|
v
Application Integration
|
v
System-Level Performance TestingThis staged approach makes it easier to isolate failures and reduces the risk of debugging hardware, kernel, and application problems simultaneously.
📌 Key Takeaways #
Adapting VxWorks 7 to the NXP T2080 is a multi-layer engineering task involving boot firmware, processor support, kernel configuration, hardware description, and peripheral drivers.
The main lessons are:
- U-Boot establishes the boot foundation. Its configuration must match the custom board’s memory, boot media, and hardware initialization requirements.
- The BSP connects VxWorks to the actual hardware. Processor startup, interrupt management, timers, and peripheral initialization must all be validated.
- VSB and VIP separate system construction from image configuration. They provide a structured workflow for building the required VxWorks components and target image.
- Device Tree reduces hardware-specific coupling. It allows supported device properties to be described separately from driver implementation.
- VxBus provides a driver integration framework. Custom peripherals such as SRIO can be integrated using the interfaces appropriate to the target VxWorks release.
- Incremental validation reduces debugging complexity. Boot, memory, kernel, platform services, drivers, and applications should be tested in stages.
For engineers working on PowerPC-based embedded computers, especially in radar, aerospace, defense, and networking systems, this workflow provides a useful foundation for adapting VxWorks to custom hardware.
The most important principle is that a successful port requires more than a bootable kernel. Reliable operation depends on the coordination of the entire platform—from the first processor initialization instructions to the final application-level data path.
For additional support information, see the VxWorks BSP development resources for related material on bootloader integration, board initialization, Device Tree configuration, and device-driver development.