262 lines
12 KiB
Markdown
262 lines
12 KiB
Markdown
# SolidRun's LX2160A COM express type 7 build scripts
|
|
|
|
## Introduction
|
|
Main intention of this repository is to provide build scripts that are easy to handle than NXP's flexbuild build environment.
|
|
|
|
They are used in SolidRun to quickly build images for development where those images can be SD or SPI booted or network TFTP (kernel) or used for root NFS
|
|
|
|
The sources are pulled from NXP's GitHub repository and patched after being clone using the patches in the patches/ directory
|
|
|
|
The build script builds the u-boot, atf, rcw and linux components, integrate it with Ubuntu rootfs bootstrapped with multistrap. Buildroot is also built aside for future use.
|
|
|
|
Automatic binary releases are available on [our website](https://images.solid-run.com/LX2k/lx2160a_build) for download (latest versions are in subfolders named by build date).
|
|
|
|
## Get Started
|
|
|
|
For basic usage refer to our various quick-start guides:
|
|
|
|
- [LX2160A HoneyComb / ClearFog CX Quick Start Guide](https://solidrun.atlassian.net/wiki/spaces/developer/pages/197494288/HoneyComb+LX2+ClearFog+CX+LX2+Quick+Start+Guide)
|
|
- [LX2162A ClearFog Quick Start Guide](https://solidrun.atlassian.net/wiki/spaces/developer/pages/199131187/ClearFog+LX2162A+Quick+Start+Guide)
|
|
|
|
This document provides development resources only.
|
|
|
|
## Compiling External Kernel Modules
|
|
|
|
Kernel modules can be built using the "linux-headers" package for a specific image.
|
|
It is available in the same place as binary images on [our website](https://images.solid-run.com/LX2k/lx2160a_build).
|
|
|
|
### Preparations for Cross-Build on x86_64 Host
|
|
|
|
Modules should be compiled in the same environment as the original images:
|
|
x86_64 host, Debian 10, `apt-get install crossbuild-essential-arm64`.
|
|
|
|
### Preparations for Native Build on LX2160
|
|
|
|
The kernel headers package includes binary programs built for x86_64.
|
|
For a native build QEMU user-mode emulation packages must be installed and configured,
|
|
to allow transparent execution of these programs:
|
|
|
|
apt-get update
|
|
apt-get install qemu-user-binfmt
|
|
|
|
Install amd64 library dependencies:
|
|
|
|
apt-get install libc6-amd64-cross
|
|
ln -sv /lib /lib64
|
|
ln -sv /usr/x86_64-linux-gnu/lib/ld-linux-x86-64.so.2 /lib/ld-linux-x86-64.so.2
|
|
ln -sv /usr/x86_64-linux-gnu/lib /usr/lib/x86_64-linux-gnu
|
|
|
|
Install native toolchain:
|
|
|
|
apt-get install build-essential ca-certificates
|
|
|
|
### Compiling the Module
|
|
|
|
After configuration of the build host according to the previous steps,
|
|
a ficticious module may be compiled for binary images `20240328-ec11295/lx2160acex7_2000_700_*_*-ec11295.img.xz` using the steps below:
|
|
|
|
```
|
|
wget https://images.solid-run.com/LX2k/lx2160a_build/20240328-ec11295/linux-headers-ec11295.tar.xz
|
|
mkdir linux-headers-ec11295
|
|
tar -C linux-headers-ec11295 -xf linux-headers-ec11295.tar.xz
|
|
|
|
cd kernel-mod-src
|
|
|
|
make -C ../linux-headers-ec11295/ CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 M="$PWD" modules
|
|
ls *.ko
|
|
```
|
|
|
|
In case the module requires access to kernel private headers not included in -headers package,
|
|
it must be built as part of a full image. See [runme.sh](https://github.com/SolidRun/ti_am64x_build/blob/main/runme.sh) function `build_atemsys` for an example.
|
|
|
|
|
|
## Build Full Image from Source with Docker
|
|
|
|
### Build Full Image from Source with Docker
|
|
|
|
A docker image providing a consistent build environment can be used as below:
|
|
|
|
1. build container image (first time only)
|
|
```
|
|
docker build -t lx2160a_build docker
|
|
# optional with an apt proxy, e.g. apt-cacher-ng
|
|
# docker build --build-arg APTPROXY=http://127.0.0.1:3142 -t lx2160a_build docker
|
|
```
|
|
2. invoke build script in working directory
|
|
```
|
|
docker run --rm -i -t -v "$PWD":/work lx2160a_build -u $(id -u) -g $(id -g)
|
|
```
|
|
|
|
#### rootless Podman
|
|
|
|
Due to the way podman performs user-id mapping, the root user inside the container (uid=0, gid=0) will be mapped to the user running podman (e.g. 1000:100).
|
|
Therefore in order for the build directory to be owned by current user, `-u 0 -g 0` have to be passed to *docker run*.
|
|
|
|
### Build Full Image from Source with host tools
|
|
|
|
Simply running ./runme.sh will check for required tools, clone and build images and place results in images/ directory.
|
|
|
|
We enhanced the NXP PBI scripting tools to accomodate auto detection of boot device, due to that the boot images are now unified for SD, eMMC and SPI.
|
|
|
|
### Configure Build Options
|
|
|
|
By default the script will create an image bootable from SD (ready to use .img file) with DDR4 SO-DIMMs 3200Mtps, SERDES configuration `8_5_2` (SERDES1 = 8, SERDES2 = 5, SERDES = 2) suitable for Clearfog CX and Honeycomb.
|
|
|
|
Build options can be customised by passing environment variables to the runme script / docker/
|
|
For example:
|
|
|
|
- `./runme.sh SERDES=LX2162A_CLEARFOG_18_9_0` **or**
|
|
- `docker run --rm -i -t -v "$PWD":/work -e SERDES=LX2162A_CLEARFOG_18_9_0 lx2160a_build -u $(id -u) -g $(id -g)`
|
|
|
|
generates *images/lx2160acex7_2000_700_3200_8_5_2.img* which is an image ready to be deployed on micro SD card and *images/lx2160acex7_xspi_2000_700_3200_8_5_2.img* which is an image ready to be deployed on the COM SPI flash.
|
|
|
|
#### Available Options:
|
|
|
|
- `RELEASE`: select nxp bsp version
|
|
- `LSDK-21.08` (default)
|
|
- `LSDK-20.12`
|
|
- `LSDK-20.04`
|
|
- `MC_RELEASE`: force specific version of Network Coprocessor Firmware
|
|
- `mc_release_10.37.0`: full release supporting serdes protocol change USXGMII/CAUI (default)
|
|
- `mc_lx2160a_10.36.100.itb`: prerelease supporting serdes protocol change USXGMII/CAUI
|
|
- `mc_lx2160a_10.36.0.itb`
|
|
- `mc_lx2160a_10.32.0.itb`: full release supporting serdes protocol change SGMII/USXGMII
|
|
- `mc_10.28.100_lx2160a.itb`: prerelease supporting serdes protocol change SGMII/USXGMII
|
|
- `DDR_SPEED`: DDR speed in MHz increments
|
|
- `3200`
|
|
- `2900`
|
|
- `2600`
|
|
- `2400`
|
|
- `SERDES`: Select Board and Serdes Protocols (for list of valid choices see `runme.sh`)
|
|
- `SHALLOW`: enable shallow git clone to save space and bandwidth
|
|
- `false` (default)
|
|
- `true`
|
|
- `SECURE`: enable secure-boot
|
|
- `false` (default)
|
|
- `true`
|
|
- `ATF_DEBUG`: enable debug build of atf
|
|
- `false` (default)
|
|
- `true`
|
|
- `DISTRO`: Distribution for rootfs
|
|
- `debian`
|
|
- `ubuntu` (default)
|
|
- `UBUNTU_VERSION`: Ubuntu Version
|
|
- focal (20.04, default)
|
|
- jammy (22.04)
|
|
- `UBUNTU_ROOTFS_SIZE`: rootfs / partition size
|
|
- `350M` (default)
|
|
- arbitrary sizes supported in unit `M`, 350M recommended minimum
|
|
- `DEBIAN_VERSION`: Debian Version
|
|
- bullseye (11, default)
|
|
- bookworm (12)
|
|
- `DEBIAN_ROOTFS_SIZE`: rootfs / partition size
|
|
- `350M` (default)
|
|
- arbitrary sizes supported in unit `M`, 350M recommended minimum
|
|
- `APTPROXY`: specify url to a local apt cache, e.g. apt-cacher-ng
|
|
|
|
## Customize
|
|
|
|
### Adding a new Configuration
|
|
|
|
The easiest way to start development is reuse of an existing configuration `SERDES` setting and make changes where required.
|
|
It comes however at the cost of merging future upstream changes not having customer boards in mind.
|
|
|
|
The intended method is as follows:
|
|
|
|
1. Define a specific configuration for the `SERDES` setting. The variable is a combination of multiple parameters: `<SOC>_<BOARD>_<SERDES-1>_<SERDES-2>_<SERDES-3>`
|
|
|
|
For example a ficticious board called "Waffle" using LX2160A CEX-7 with Serdes 1 Protocol 1, Serdes 2 Protocol 13 and Serdes 3 Protocol 3 should be named: `LX2160A_WAFFLE_1_13_3`
|
|
|
|
2. Create configuration files DPL & DPC for the network coprocessor:
|
|
|
|
- `build/mc-utils/config/lx2160a/CEX7/waffle-s1_1-s2_13-dpc.dts`
|
|
- `build/mc-utils/config/lx2160a/CEX7/waffle-s1_1-s2_13-dpl.dts`
|
|
|
|
Safe starting points are configurations that disable all network interfaces:
|
|
|
|
- `build/mc-utils/config/lx2160a/LX2162-USOM/clearfog-s1_0-s2_0-dpc.dts`
|
|
- `build/mc-utils/config/lx2160a/LX2162-USOM/clearfog-s1_0-s2_0-dpl.dts`
|
|
|
|
DPC must be edited by hand. DPL can be auto-generated with `restool` command after booting linux and manually instantiating dpmac and optionally dpni objects.
|
|
|
|
3. Create Linux device-tree file: `build/linux/arch/arm64/boot/dts/freescale/fsl-lx2160a-waffle.dts`
|
|
|
|
And add it to the `build/linux/arch/arm64/boot/dts/freescale/Makefile`.
|
|
|
|
4. Add configuration to `runme.sh`:
|
|
|
|
Within the `case "${SERDES}" in` block, add a new entry:
|
|
|
|
```
|
|
LX2160A_WAFFLE_1_13_3)
|
|
DPC=CEX7/waffle-s1_1-s2_13-dpc.dtb
|
|
DPL=CEX7/waffle-s1_1-s2_13-dpl.dtb
|
|
DEFAULT_FDT_FILE="fsl-lx2160a-waffle.dtb"
|
|
;;
|
|
```
|
|
|
|
5. Configure U-Boot device-tree filename:
|
|
|
|
`DEFAULT_FDT_FILE` makes the default of u-boot `fdtfile` variable. Note however that U-Boot generates different names in most cases.
|
|
Currently (see `build/u-boot/board/solidrun/lx2160a/eth_lx2160acex7.c:fsl_board_late_init`) LX2160 defaults to "fsl-lx2160a-clearfog-cx.dtb", and LX2162 defaults to "fsl-lx2162a-som-\<SD1>-\<SD2>.dtb".
|
|
Therefore it is recommended to add a match for selected serdes protocol in this function and force the correct filename.
|
|
|
|
6. Create RCW Configuration Files:
|
|
|
|
Based on the configuration name the build system generates reset configuration for the SoC from the following files (lower-case names):
|
|
|
|
- `build/rcw/lx2160acex7/configs/lx2160a_defaults.rcwi`: SolidRun defaults for LX2160A CEX-7 / LX2162A SoM
|
|
- `build/rcw/lx2160acex7/configs/lx2160a_<SPEED>.rcwi`: DDR Frequency Selection
|
|
- `build/rcw/lx2160acex7/configs/<SOC>_<BOARD>.rcwi`: Board-specific configuration, e.g. pinmux
|
|
- `build/rcw/lx2160acex7/configs/<SOC>_<BOARD>_SD1_<Serdes-1 Protocol>.rcwi`: Serdes-Protocol-specific configuration, e.g. serdes clocks and pci-e speed
|
|
- `build/rcw/lx2160acex7/configs/<SOC>_<BOARD>_SD2_<Serdes-2 Protocol>.rcwi`: Serdes-Protocol-specific configuration, e.g. serdes clocks and pci-e speed
|
|
- `build/rcw/lx2160acex7/configs/<SOC>_<BOARD>_SD3_<Serdes-3 Protocol>.rcwi`: Serdes-Protocol-specific configuration, e.g. serdes clocks and pci-e speed
|
|
|
|
For the Waffle example:
|
|
|
|
- `build/rcw/lx2160acex7/configs/lx2160a_defaults.rcwi`
|
|
- `build/rcw/lx2160acex7/configs/lx2160a_<SPEED>.rcwi`
|
|
- `build/rcw/lx2160acex7/configs/lx2160a_waffle.rcwi`
|
|
- `build/rcw/lx2160acex7/configs/lx2160a_waffle_SD1_1.rcwi`
|
|
- `build/rcw/lx2160acex7/configs/lx2160a_waffle_SD2_13.rcwi`
|
|
- `build/rcw/lx2160acex7/configs/lx2160a_waffle_SD3_3.rcwi`
|
|
|
|
For examples see `build/rcw/lx2160acex7/configs/lx2162a_clearfog*.rcwi` as these include comments with explanations.
|
|
|
|
Safe reference points in case uart stays silent are protocols `0` (`SRDS_PRTCL_S1=0`, `SRDS_PRTCL_S2=0`, `SRDS_PRTCL_S3=0`).
|
|
|
|
|
|
## Deploying
|
|
For SD card bootable images, plug in a micro SD into your machine and run the following, where sdX is the location of the SD card got probed into your machine -
|
|
|
|
`sudo dd if=images/lx2160acex7_2000_700_3200_8_5_2_sd.img of=/dev/sdX`
|
|
|
|
For SPI boot, boot thru SD card and then load the _xspi_ images to system memory and flash it using the `sf probe` and `sf update` commands. An example below loads the image through TFTP prototocl, flashes and then verifies the image -
|
|
|
|
`sf probe; setenv ipaddr 192.168.15.223; setenv serverip 192.168.15.3; tftp 0xa0000000 lx2160acex7_xspi_2000_700_2600_8_5_2_xspi.img;sf update 0xa0000000 0 $filesize; sf read 0xa4000000 0 $filesize; cmp.b 0xa0000000 0xa4000000 $filesize`
|
|
|
|
And then set boot DIP switch on COM to off/off/off/off from numbers 1 to 4 (dip number 5 is not used. Notice the marking 'ON' on the DIP switch)
|
|
|
|
For eMMC boot (supported only thru LX2160A silicon rev 2 which is LX2160A COM Express type 7 rev 1.5 and newer) -
|
|
|
|
`load mmc 0:1 0xa4000000 ubuntu-core.img`
|
|
|
|
`mmc dev 1`
|
|
|
|
`mmc write 0xa4000000 0 0xd2000`
|
|
|
|
And then set boot DIP switch on COM to off/on/on/off from numbers 1 to 4 (dip number 5 is not used, notice the marking 'ON' on the DIP switch)
|
|
|
|
After booting Ubuntu you must resize the boot partition; for instance if booted under eMMC then login as root/root; then fdisk /dev/mmcblk1; delete first partition and then recreate it starting from 131072 (64MByte) to the end of the volume.
|
|
Do not remove the signaute since it indicates for the kernel which partition ID to use.
|
|
|
|
After resizing the partition; resize the ext4 boot volume by running 'resize2fs /dev/mmcblk1p1'
|
|
|
|
Afterwards run update the RTC and update the repository -
|
|
|
|
`dhclient -i eth0; ntpdate pool.ntp.org; apt update`
|
|
|
|
If using a GPU then install the linux-firmware package that contains GPU firmwares -
|
|
|
|
`apt install linux-firmware`
|