The Yocto Project provides a flexible framework for creating custom embedded Linux distributions tailored for EV charging applications. EVerest includes a meta-layer for seamless integration.
Overview
The meta-everest layer provides BitBake recipes and configurations for building EVerest and its dependencies into embedded Linux images.
Repository : The meta-everest layer is located in yocto/ directory of the EVerest Core repository.Supported Releases :
Kirkstone (LTS)
Scarthgap (Latest)
Prerequisites
Development Host Requirements
# Ubuntu/Debian
sudo apt-get install gawk wget git diffstat unzip texinfo \
gcc build-essential chrpath socat cpio python3 python3-pip \
python3-pexpect xz-utils debianutils iputils-ping python3-git \
python3-jinja2 libegl1-mesa libsdl1.2-dev xterm python3-subunit \
mesa-common-dev zstd liblz4-tool
# Fedora/RHEL
sudo dnf install gawk make wget tar bzip2 gzip python3 unzip \
perl patch diffutils diffstat git cpp gcc gcc-c++ glibc-devel \
texinfo chrpath ccache perl-Data-Dumper perl-Text-ParseWords \
perl-Thread-Queue python3-pip xz which SDL-devel xterm zstd lz4
Disk Space Requirements
Minimum : 50 GB free disk space
Recommended : 100 GB+ for multiple builds and sstate cache
Setting Up Yocto Build Environment
Clone Poky and Layers
Initialize Yocto workspace
mkdir ~/yocto-everest
cd ~/yocto-everest
# Clone Poky (Yocto reference distribution)
git clone -b kirkstone git://git.yoctoproject.org/poky.git
cd poky
Add meta-everest layer
# Copy or symlink meta-everest from EVerest source
ln -s /path/to/everest-core/yocto/kirkstone/meta-everest \
~/yocto-everest/poky/meta-everest
Add additional required layers
cd ~/yocto-everest/poky
# meta-openembedded (for additional dependencies)
git clone -b kirkstone \
git://git.openembedded.org/meta-openembedded
# Source the build environment
source oe-init-build-env build-everest
# This creates and enters the build directory
cd ~/yocto-everest/poky/build-everest
Edit conf/bblayers.conf
Add meta-everest and dependencies:
BBLAYERS ? = " \
/home/user/yocto-everest/poky/meta \
/home/user/yocto-everest/poky/meta-poky \
/home/user/yocto-everest/poky/meta-yocto-bsp \
/home/user/yocto-everest/poky/meta-openembedded/meta-oe \
/home/user/yocto-everest/poky/meta-openembedded/meta-python \
/home/user/yocto-everest/poky/meta-openembedded/meta-networking \
/home/user/yocto-everest/poky/meta-everest \
"
Edit conf/local.conf
# Set target machine (example for generic x86-64)
MACHINE = "genericx86-64"
# Or for ARM-based platforms:
# MACHINE = "raspberrypi4-64"
# MACHINE = "phyboard-electra-imx8mp-3"
# Parallelization (adjust to your CPU)
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
# Disk space monitoring
BB_DISKMON_DIRS = "STOPTASKS,${ TMPDIR },1G,100K STOPTASKS,${ DL_DIR },1G,100K"
# Add EVerest to image
IMAGE_INSTALL:append = " everest-core"
# Optional: Enable systemd
DISTRO_FEATURES:append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
Building EVerest Images
Build Core Image
# Build a minimal image with EVerest
bitbake core-image-minimal
# Or build a more complete image
bitbake core-image-full-cmdline
The first build will take 2-6 hours depending on your hardware and network speed, as it downloads and compiles all dependencies from source.
Build EVerest Package Only
To rebuild just EVerest after changes:
# Clean previous build
bitbake -c cleansstate everest-core
# Rebuild
bitbake everest-core
The meta-everest layer includes recipes for EVerest and its dependencies:
meta-everest/
├── recipes-everest/
│ ├── everest-core/ # Main EVerest package
│ ├── everest-framework/ # EVerest framework library
│ ├── libocpp/ # OCPP library
│ └── libevse-security/ # Security library
├── recipes-backports/
│ ├── nlohmann-json/ # JSON library
│ ├── libwebsockets/ # WebSocket support
│ ├── fmt/ # Formatting library
│ └── date/ # Date/time library
└── classes/
└── everest_version_file.bbclass
Key Recipes
EVerest Core Recipe
The main recipe builds EVerest from source with all dependencies:
# From recipes-everest/everest-core/everest-core_*.bb
DESCRIPTION = "EVerest - EV Charging Station Framework"
LICENSE = "Apache-2.0"
DEPENDS = " \
everest-framework \
libocpp \
libevse-security \
nlohmann-json \
fmt \
date \
websocketpp \
libwebsockets \
"
inherit cmake systemd
Version Tracking
The everest_version_file class generates a JSON file with package versions installed on the system.
Enable Version File
Add to your image recipe:
inherit everest_version_file
This creates /etc/everest/everest_release.json:
{
"everest-core" : "2024.3.0" ,
"libocpp" : "0.16.0" ,
"kernel" : "5.15.92" ,
"systemd" : "250.5"
}
Add Custom Packages to Version File
In local.conf:
EVEREST_RELEASE_PACKAGES += "systemd tcpdump mosquitto"
The version file is useful for debugging and tracking deployed software versions in production charging stations.
Deployment to Embedded Systems
Flash Image to Target
SD Card / eMMC
# Locate the built image
cd tmp/deploy/images/ ${ MACHINE } /
# Flash to SD card (replace /dev/sdX with your device)
sudo dd if=core-image-minimal- ${ MACHINE } .wic \
of=/dev/sdX bs=4M status=progress
sudo sync
Network Boot (TFTP/NFS)
For development:
# Extract rootfs
sudo tar -xzf core-image-minimal- ${ MACHINE } .tar.gz \
-C /srv/nfs/everest/
# Configure TFTP boot on target bootloader
First Boot Configuration
Network Setup
Configure static IP or DHCP in /etc/systemd/network/
Verify EVerest Installation
systemctl status everest-core
/usr/bin/manager --help
Check System Resources
free -h
df -h
dmesg | grep -i error
PHYTEC SoMs
PHYTEC’s ampliPHY distribution provides:
Pre-configured BSP for PHYTEC hardware
RAUC update support built-in
Secure boot configurations
# Use ampliphy-rauc or ampliphy-secure distributions
DISTRO = "ampliphy-rauc"
Raspberry Pi
For testing and development:
MACHINE = "raspberrypi4-64"
# Enable UART for debugging
ENABLE_UART = "1"
Add to config.txt:
enable_uart=1
dtoverlay=disable-bt
Custom Image Recipes
Create a custom image recipe for your charging station:
# meta-custom/recipes-core/images/everest-charger-image.bb
require recipes-core/images/core-image-minimal.bb
DESCRIPTION = "Custom EVerest Charging Station Image"
IMAGE_FEATURES += "ssh-server-dropbear"
IMAGE_INSTALL += " \
everest-core \
mosquitto \
node-red \
tcpdump \
htop \
vim \
"
# Add version tracking
inherit everest_version_file
# Enable read-only rootfs
IMAGE_FEATURES += "read-only-rootfs"
Optimization for Production
Minimize Image Size
# Remove development tools
EXTRA_IMAGE_FEATURES:remove = "tools-debug tools-sdk dev-pkgs"
# Use smaller C library
TCLIBCAPPEND = "musl"
# Strip debug symbols
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
Security Hardening
# Enable security flags
EXTRA_IMAGE_FEATURES += "seccomp apparmor"
# Read-only root filesystem
IMAGE_FEATURES += "read-only-rootfs"
# Disable root login
EXTRA_IMAGE_FEATURES:remove = "allow-root-login"
Development Workflow
Iterative Development
# 1. Make changes to EVerest source
vim /path/to/everest-core/modules/...
# 2. Tell Yocto to use local source
# Add to local.conf:
EVEREST_CORE_SRC = "/path/to/everest-core"
# 3. Rebuild
bitbake -c compile -f everest-core
bitbake -c deploy everest-core
# 4. Update running target
scp tmp/deploy/rpm/.../everest-core * .rpm root@target:/tmp/
ssh root@target 'rpm -Uvh --force /tmp/everest-core*.rpm'
SDK for Cross-Compilation
Generate SDK for development:
bitbake core-image-minimal -c populate_sdk
# Install SDK
./tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-*-toolchain-*.sh
# Source environment
source /opt/poky/ * /environment-setup- *
# Now you can cross-compile directly
$CC myapp.c -o myapp
Troubleshooting
Build Failures
# Clear download cache
rm -rf downloads/
# Or set alternative mirror
PREMIRRORS:prepend = "git://.*/.* http://downloads.yoctoproject.org/mirror/sources/"
# Clean old builds
bitbake -c cleansstate everest-core
# Remove tmp directory
rm -rf tmp/
# Check recipe dependencies
bitbake -g everest-core
cat pn-depends.dot
Runtime Issues
# Check system logs
journalctl -u everest-core -f
# Verify library dependencies
ldd /usr/bin/manager
# Check configuration
/usr/bin/manager --check config.yaml
Next Steps
OTA Updates Implement RAUC for safe updates
Configuration Configure your charging station
Security Set up TPM and certificates
Hardware Setup Connect and configure peripherals