Setting Up the Environment

Environment Requirements

Hardware

  • Linux compile server
  • Windows workstation (host computer)
  • Hi3861 WLAN module
  • USB Type-C cable used to connect the Windows workstation to Hi3861 WLAN module

The following figure shows the hardware connections.

Figure 1 Hardware connections

Software

NOTICE: The following part describes how to install tools using installation packages. If you use Docker to set up the build environment, you only need to install the Windows workstation described in Table 1.

The following table lists the tools required for the Hi3861 development board.

Table 1 Required tools

Platform

Development Tool

Description

How to Obtain

Linux server

Basic software package for compilation and building (required only for Ubuntu 20+)

Provides a basic software package for compilation and building.

Internet

Linux server

SCons 3.0.4+

Executes script compilation.

Internet

Linux server

Python modules: setuptools, Kconfiglib, PyCryptodome, six, and ecdsa

Executes script compilation.

Internet

Linux server

gcc riscv32

Executes script compilation.

Internet

Windows workstation

CH341SER.EXE

USB-to-Serial adapter driver

http://www.wch-ic.com/search?t=downloads&q=ch340g

Installing Linux Build Tools

NOTICE:

  • If you acquire the source code using an HPM component or HPM CLI tool, you do not need to install gcc_riscv32.
  • (Recommended) If you obtain the source code via the mirror site or code repository, install gcc_riscv32. When installing the compilation tool, ensure that its environment variable path is unique.

Installing Basic Software Used for Compilation and Building (Required Only for Ubuntu 20+)

Install the software.

sudo apt-get install build-essential gcc g++ make zlib* libffi-dev

Installing Scons

  1. Start a Linux server.

  2. Install the SCons installation package.

    python3 -m pip install scons
    
  3. Check whether the installation is successful.

    scons -v
    

    Figure 2 Successful installation (SCons version requirement: 3.0.4 or later)

Installing Python Modules

  1. Install setuptools.

    pip3 install setuptools
    
  2. Install the GUI menuconfig tool (Kconfiglib). You are advised to install Kconfiglib 13.2.0 or later.

    • Command line:

      sudo pip3 install kconfiglib
      
    • Installation package:

      1. Download the .whl file (for example, kconfiglib-13.2.0-py2.py3-none-any.whl).

        Download path: https://pypi.org/project/kconfiglib#files

      2. Install the .whl file.

        sudo pip3 install kconfiglib-13.2.0-py2.py3-none-any.whl
        
  3. Install PyCryptodome using either of the following methods:

    Install the Python component packages on which the file signature depends, including PyCryptodome, six, and ecdsa. As the installation of ecdsa depends on that of six, install six first.

    • Command line:

      sudo pip3 install pycryptodome
      
    • Installation package:

      1. Download the .whl file (for example, pycryptodome-3.9.9-cp38-cp38-manylinux1_x86_64.whl).

        Download path: https://pypi.org/project/pycryptodome/#files

      2. Install the .whl file.

        sudo pip3 install pycryptodome-3.9.9-cp38-cp38-manylinux1_x86_64.whl
        
  4. Install six using either of the following methods:

    • Command line:

      sudo pip3 install six --upgrade --ignore-installed six
      
    • Installation package:

      1. Download the .whl file, for example, six-1.12.0-py2.py3-none-any.whl.

        Download path: https://pypi.org/project/six/#files

      2. Install the .whl file.

        sudo pip3 install six-1.12.0-py2.py3-none-any.whl
        
  5. Install ecdsa using either of the following methods:

    • Command line:

      sudo pip3 install ecdsa
      
    • Installation package:

      1. Download the .whl file, for example, ecdsa-0.14.1-py2.py3-none-any.whl.

        Download path: https://pypi.org/project/ecdsa/#files

      2. Install the .whl file.

        sudo pip3 install ecdsa-0.14.1-py2.py3-none-any.whl
        

Installing gcc_riscv32 (Compiler Toolchain for WLAN Module)

NOTICE:

  • The Hi3861 platform supports only the static link of the libgcc library. The dynamic link is not recommended because version 3 of the GNU General Public License (GPLv3) will be polluted during commercial distribution.
  • Steps 2 to 15 of the following procedure are used to build the gcc_riscv32 image. You can simply download the image and skip these steps.
  1. Start a Linux server.

  2. Install the GCC, G++, Bison, Flex, Makeinfo tools to ensure that the toolchain can be correctly compiled.

    sudo apt-get install gcc && sudo apt-get install g++ && sudo apt-get install flex bison && sudo apt-get install texinfo
    
  3. Download the RISC-V GNU toolchain.

    git clone --recursive https://gitee.com/mirrors/riscv-gnu-toolchain.git
    
  4. Open the riscv-gnu-toolchain folder and delete empty folders to prevent conflicts during the download of Newlib, Binutils, and GCC.

    cd riscv-gnu-toolchain && rm -rf riscv-newlib && rm -rf riscv-binutils && rm -rf riscv-gcc
    
  5. Download RISC-V Newlib 3.0.0.

    git clone -b riscv-newlib-3.0.0 https://github.com/riscv/riscv-newlib.git
    
  6. Download RISC-V Binutils 2.31.1.

    git clone -b riscv-binutils-2.31.1 https://github.com/riscv/riscv-binutils-gdb.git
    
  7. Download RISC-V GCC 7.3.0.

    git clone -b riscv-gcc-7.3.0 https://github.com/riscv/riscv-gcc
    
  8. Add the RISC-V GCC 7.3.0 patch.

    Visit the GCC official patch links 89411 and 86724, and manually add the changes to the .c and .h files based on the requirements in the patch links. Note that the number of rows may not match because of different versions of the patch and GCC. You need to search for the keyword in the patch to locate the corresponding row.

  9. Download, decompress, and install GMP 6.1.2.

    tar -xvf gmp-6.1.2.tar.bz2 && mkdir build_gmp && cd build_gmp && ../gmp-6.1.2/configure --prefix=/usr/local/gmp-6.1.2 --disable-shared --enable-cxx && make && make install
    
  10. Download, decompress, and install mpfr-4.0.2.

    tar -xvf mpfr-4.0.2.tar.gz && mkdir build_mpfr && cd build_mpfr && ../mpfr-4.0.2/configure --prefix=/usr/local/mpfr-4.0.2 --with-gmp=/usr/local/gmp-6.1.2 --disable-shared && make && make install
    
  11. Download, decompress, and install mpc-1.1.0.

    tar -xvf mpc-1.1.0.tar.gz && mkdir build_mpc && cd build_mpc && ../mpc-1.1.0/configure --prefix=/usr/local/mpc-1.1.0 --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-4.0.2 --disable-shared && make && make install
    
  12. Open the riscv-gnu-toolchain folder and create a directory for toolchain output.

    cd /opt && mkdir gcc_riscv32
    
  13. Compile binutils.

    mkdir build_binutils && cd build_binutils && ../riscv-binutils-gdb/configure --prefix=/opt/gcc_riscv32 --target=riscv32-unknown-elf --with-arch=rv32imc --with-abi=ilp32 --disable-__cxa_atexit --disable-libgomp --disable-libmudflap --enable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-multilib --enable-poison-system-directories --enable-languages=c,c++ --with-gnu-as --with-gnu-ld --with-newlib --with-system-zlib CFLAGS="-fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack -fPIE" CXXFLAGS="-fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack -fPIE" CXXFLAGS_FOR_TARGET="-Os -mcmodel=medlow -Wall -fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -fno-short-enums -fno-short-wchar" CFLAGS_FOR_TARGET="-Os -mcmodel=medlow -Wall -fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -fno-short-enums -fno-short-wchar" --bindir=/opt/gcc_riscv32/bin --libexecdir=/opt/gcc_riscv32/riscv32 --libdir=/opt/gcc_riscv32 --includedir=/opt/gcc_riscv32 && make -j16 && make install && cd ..
    
  14. Build Newlib.

    mkdir build_newlib && cd build_newlib && ../riscv-newlib/configure --prefix=/opt/gcc_riscv32 --target=riscv32-unknown-elf --with-arch=rv32imc --with-abi=ilp32 --disable-__cxa_atexit --disable-libgomp --disable-libmudflap --enable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-multilib --enable-poison-system-directories --enable-languages=c,c++ --with-gnu-as --with-gnu-ld --with-newlib --with-system-zlib CFLAGS="-fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack -fPIE" CXXFLAGS="-fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack -fPIE" \CXXFLAGS_FOR_TARGET="-Os -mcmodel=medlow -Wall -fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -fno-short-enums -fno-short-wchar" CFLAGS_FOR_TARGET="-Os -mcmodel=medlow -Wall -fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -fno-short-enums -fno-short-wchar" --bindir=/opt/gcc_riscv32/bin --libexecdir=/opt/gcc_riscv32 --libdir=/opt/gcc_riscv32 --includedir=/opt/gcc_riscv32 && make -j16 && make install && cd ..
    
  15. Build GCC.

    mkdir build_gcc && cd build_gcc && ../riscv-gcc/configure --prefix=/opt/gcc_riscv32 --target=riscv32-unknown-elf --with-arch=rv32imc --with-abi=ilp32 --disable-__cxa_atexit --disable-libgomp --disable-libmudflap --enable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-multilib --enable-poison-system-directories --enable-languages=c,c++ --with-gnu-as --with-gnu-ld --with-newlib --with-system-zlib CFLAGS="-fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack -fPIE" CXXFLAGS="-fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack -fPIE" LDFLAGS="-Wl,-z,relro,-z,now,-z,noexecstack" CXXFLAGS_FOR_TARGET="-Os -mcmodel=medlow -Wall -fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -fno-short-enums -fno-short-wchar" CFLAGS_FOR_TARGET="-Os -mcmodel=medlow -Wall -fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -fno-short-enums -fno-short-wchar" --with-headers="/opt/gcc-riscv32/riscv32-unknown-elf/include" --with-mpc=/usr/local/mpc-1.1.0 --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-4.0.2 && make -j16 && make install
    
  16. Set an environment variable.

    NOTE: If you use the compiled riscv32 gcc package, perform the following steps to set environment variables:

    1. Decompress the package to the root directory.
    tar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C ~
    
    1. Set an environment variable.
    vim ~/.bashrc
    
    1. Copy the following command to the last line of the .bashrc file, save the file, and exit.
    export PATH=~/gcc_riscv32/bin:$PATH
    
    vim ~/.bashrc
    

    Copy the following command to the last line of the .bashrc file, save the file, and exit.

    export PATH=~/gcc_riscv32/bin:$PATH
    
  17. Validate the environment variable.

    source ~/.bashrc
    
  18. Check whether the compiler is successfully installed. If the compiler version number is correctly displayed, the installation is successful.

    riscv32-unknown-elf-gcc -v
    

Installing the USB-to-Serial Driver

Perform the following operations on the Windows station.

  1. Download the USB-to-serial driver: CH341SER USB-to-serial driver.

  2. Install the driver.

  3. After the driver is installed, remove and then insert the USB cable. The serial port entry should be displayed as shown in the following figure.