Skip to content

Latest commit

 

History

History
234 lines (186 loc) · 8.15 KB

05-xc-userland.md

File metadata and controls

234 lines (186 loc) · 8.15 KB

Guide to Cross Compilation for a Raspberry Pi

  1. Start
  2. Setup XCS and RPi
  3. Setup RPi Network and SSH
  4. Setup RPi Peripherals
  5. Setup Cross-compile environment
  6. > Cross-compile and Install Userland
  7. Cross-compile and Install OpenCV
  8. Cross-compile and Install ROS
  9. Compile and Install OpenCV
  10. Compile and Install ROS
  11. Remote ROS (RPi node and XCS master)
  12. ROS package development (RPi/XCS)
  13. Compile and Install WiringPi

6. Cross-compile and Install Userland

The userland repository of the Pi Foundation contains several libraries to communicate with the RPi's GPU and use GPU related actions such as mmal, GLES and others. It also contains the camera functions such as raspivid and raspistill.

Table of Contents

  1. Prerequisites
  2. Preparation
  3. Compilation
  4. Installation
  5. Testing
  6. Troubleshooting

Prerequisites

  • Setup of XCS and RPi
  • Setup of RPi Network and SSH
  • Setup of the Cross-compile environment
  • Optional: RPi Camera (only used for testing)

Preparation

  1. Sync RPi with the XCS. This ensures all symbolic links will be corrected.

    XCS~$ $XC_RPI_BASE/rpicross_notes/scripts/sync-rpi-xcs.sh rpizero-local-root
    
  2. Download userland

    XCS~$ mkdir -p $XC_RPI_ROOTFS/usr/src/
    XCS~$ cd $XC_RPI_ROOTFS/usr/src/
    XCS~$ git clone https://github.com/raspberrypi/userland.git --depth 1
    

    The userland repository is downloaded in rootfs because the make install does not copy the headers of the libraries.

Compilation

  1. Create the build location for userland and run CMake.

    XCS~$ mkdir -p $XC_RPI_ROOTFS/usr/src/userland/build/arm-linux/release
    XCS~$ cd $XC_RPI_ROOTFS/usr/src/userland/build/arm-linux/release
    XCS~$ cmake \
      -D CMAKE_TOOLCHAIN_FILE=$XC_RPI_BASE/rpicross_notes/rpi-generic-toolchain.cmake \
      -D CMAKE_BUILD_TYPE=Release \
      -D ARM64=OFF \
      $XC_RPI_ROOTFS/usr/src/userland/
    

    This should produce an output similar to:

    -- The C compiler identification is GNU 4.9.3
    -- The CXX compiler identification is GNU 4.9.3
    -- Check for working C compiler: /usr/bin/arm-linux-gnueabihf-gcc
    -- Check for working C compiler: /usr/bin/arm-linux-gnueabihf-gcc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Check for working CXX compiler: /usr/bin/arm-linux-gnueabihf-g++
    -- Check for working CXX compiler: /usr/bin/arm-linux-gnueabihf-g++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Looking for execinfo.h
    -- Looking for execinfo.h - found
    -- The ASM compiler identification is GNU
    -- Found assembler: /usr/bin/arm-linux-gnueabihf-gcc
    -- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1")
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/pi/rpi/rootfs/usr/src/userland/build/arm-linux/release
    
  2. Next, make userland.

    XCS~$ make -j 4
    

    -j 4 tells make to use 4 threads, which speeds up the process.

  3. Install the created libraries:

    XCS~$ make install DESTDIR=$XC_RPI_ROOTFS
    
  4. Remove build and git files from the src (these are not needed on the RPi)

    XCS~$ cd $XC_RPI_ROOTFS
    XCS~$ rm -rf $XC_RPI_ROOTFS/usr/src/userland/build
    XCS~$ rm -rf $XC_RPI_ROOTFS/usr/src/userland/.git*
    

Installation

  1. Sync the updated "rootfs" with the RPi:

    XCS~$ $XC_RPI_BASE/rpicross_notes/scripts/sync-xcs-rpi.sh rpizero-local-root
    

Testing

Testing the compiled userland-libraries is done by building our own version of raspicam and creating a picture. Note that this test requires that the RPi has a camera connected and that you have links2 installed.

  1. Create the build-dir and build the application

    XCS~$ mkdir -p $XC_RPI_BUILD/hello/raspicam
    XCS~$ cd $XC_RPI_BUILD/hello/raspicam
    XCS~$ cmake \
        -D CMAKE_TOOLCHAIN_FILE=$XC_RPI_BASE/rpicross_notes/rpi-generic-toolchain.cmake \
        $XC_RPI_BASE/rpicross_notes/hello/raspicam
    XCS~$ make
    
  2. Sync and run.

    XCS~$ scp hellocam rpizero-local:~/
    XCS~$ ssh -X rpizero-local
    RPI~$ ./hellocam -v -o testcam.jpg
    
        "hellocam" Camera App (commit Not found)
    
        Camera Name imx219
        Width 3280, Height 2464, filename testcam.jpg
        Using camera 0, sensor mode 0
    
        GPS output Disabled
    
        Quality 85, Raw no
        Thumbnail enabled Yes, width 64, height 48, quality 35
        Time delay 5000, Timelapse 0
        Link to latest frame enabled  no
        Full resolution preview No
        Capture method : Single capture
    
        Preview Yes, Full screen Yes
        Preview window 0,0,1024,768
        Opacity 255
        Sharpness 0, Contrast 0, Brightness 50
        Saturation 0, ISO 0, Video Stabilisation No, Exposure compensation 0
        Exposure Mode 'auto', AWB Mode 'auto', Image Effect 'none'
        Flicker Avoid Mode 'off'
        Metering Mode 'average', Colour Effect Enabled No with U = 128, V = 128
        Rotation 0, hflip No, vflip No
        ROI x 0.000000, y 0.000000, w 1.000000 h 1.000000
        Camera component done
        Encoder component done
        Starting component connection stage
        Connecting camera preview port to video render.
        Connecting camera stills port to encoder input port
        Opening output file testcam.jpg
        Enabling encoder output port
        Starting capture -1
        Finished capture -1
        Closing down
        Close down completed, all components disconnected, disabled and destroyed
    
    RPI~$ links2 -g testcam.jpg
    

    As a result, a window should be opened and show a snapshot of the camera.

    Depending on the size of the image, this may take a while.

Troubleshooting

Error during build of userland:

../../../../lib/libvcos.so: undefined reference to `_dl_init_static_tls'
../../../../lib/libvcos.so: undefined reference to `_dl_pagesize'
../../../../lib/libvcos.so: undefined reference to `__pointer_chk_guard_local'
../../../../lib/libvcos.so: undefined reference to `__dlclose'
../../../../lib/libvcos.so: undefined reference to `__dlerror'
../../../../lib/libvcos.so: undefined reference to `_dl_stack_flags'
../../../../lib/libvcos.so: undefined reference to `__dlopen'
../../../../lib/libvcos.so: undefined reference to `__dlsym'
../../../../lib/libvcos.so: undefined reference to `_dl_wait_lookup_done'
../../../../lib/libvcos.so: undefined reference to `__pthread_create'

If such message appear during building (make) it might be because you need to fix the symlinks of the RPi-filesytem. Try building after syncing (and make sure you remove all build files):

XCS~$ $XC_RPI_BASE/rpicross_notes/scripts/sync-rpi-xcs.sh rpizero-local-root
...
XCS~$ cd $XC_RPI_ROOTFS/usr/src/userland/
XCS~$ rm -rf build/*
XCS~$ mkdir -p $XC_RPI_ROOTFS/usr/src/userland/build/arm-linux/release
XCS~$ cd $XC_RPI_ROOTFS/usr/src/userland/build/arm-linux/release
XCS~$ cmake \
  -D CMAKE_TOOLCHAIN_FILE=$XC_RPI_BASE/rpicross_notes/rpi-generic-toolchain.cmake \
  -D CMAKE_BUILD_TYPE=Release \
  -D ARM64=OFF \
  $XC_RPI_ROOTFS/usr/src/userland/
XCS~$ make

Image is not loaded by links2:

Could not initialize any graphics driver. Tried the following drivers:
x:
Can't open display "(null)"
fb:
Could not get VT mode.

Check if there is a warning upon login on the RPi. If you see "Warning: untrusted X11 forwarding setup failed: xauth key data not generated" you might need to use the "-Y" instead of "-X" option when connecting via SSH.