Template:S5P6818BuildFromSource
Contents
1 Make Your Own OS Image
1.1 Install Cross Compiler
1.1.1 Install aarch64-linux-gcc 6.4
Download the compiler package:
git clone https://github.com/friendlyarm/prebuilts.git sudo mkdir -p /opt/FriendlyARM/toolchain sudo tar xf prebuilts/gcc-x64/aarch64-cortexa53-linux-gnu-6.4.tar.xz -C /opt/FriendlyARM/toolchain/
Then add the compiler's directory to "PATH" by appending the following lines in "~/.bashrc":
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin:$PATH export GCC_COLORS=auto
Execute "~/.bashrc" to make the changes take effect. Note that there is a space after the first ".":
. ~/.bashrc
This compiler is a 64-bit one therefore it cannot be run on a 32-bit Linux machine. After the compiler is installed you can verify it by running the following commands:
aarch64-linux-gcc -v Using built-in specs. COLLECT_GCC=aarch64-linux-gcc COLLECT_LTO_WRAPPER=/opt/FriendlyARM/toolchain/6.4-aarch64/libexec/gcc/aarch64-cortexa53-linux-gnu/6.4.0/lto-wrapper Target: aarch64-cortexa53-linux-gnu Configured with: /work/toolchain/build/aarch64-cortexa53-linux-gnu/build/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=aarch64-cortexa53-linux-gnu --prefix=/opt/FriendlyARM/toolchain/6.4-aarch64 --with-sysroot=/opt/FriendlyARM/toolchain/6.4-aarch64/aarch64-cortexa53-linux-gnu/sysroot --enable-languages=c,c++ --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-cpu=cortex-a53 ... Thread model: posix gcc version 6.4.0 (ctng-1.23.0-150g-FA)
1.1.2 Install arm-linux-gcc 4.9.3
Download the compiler package:
git clone https://github.com/friendlyarm/prebuilts.git sudo mkdir -p /opt/FriendlyARM/toolchain sudo tar xf prebuilts/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz -C /opt/FriendlyARM/toolchain/
Then add the compiler's directory to "PATH" by appending the following lines in "~/.bashrc":
export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH export GCC_COLORS=auto
Execute "~/.bashrc" to make the changes take effect. Note that there is a space after the first ".":
. ~/.bashrc
This compiler is a 64-bit one therefore it cannot be run on a 32-bit Linux machine. After the compiler is installed you can verify it by running the following commands:
arm-linux-gcc -v Using built-in specs. COLLECT_GCC=arm-linux-gcc COLLECT_LTO_WRAPPER=/opt/FriendlyARM/toolchain/4.9.3/libexec/gcc/arm-cortexa9-linux-gnueabihf/4.9.3/lto-wrapper Target: arm-cortexa9-linux-gnueabihf Configured with: /work/toolchain/build/src/gcc-4.9.3/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=arm-cortexa9-linux-gnueabihf --prefix=/opt/FriendlyARM/toolchain/4.9.3 --with-sysroot=/opt/FriendlyARM/toolchain/4.9.3/arm-cortexa9-linux-gnueabihf/sys-root --enable-languages=c,c++ --with-arch=armv7-a --with-tune=cortex-a9 --with-fpu=vfpv3 --with-float=hard ... Thread model: posix gcc version 4.9.3 (ctng-1.21.0-229g-FA)
1.2 Compile Linux kernel 4.4.y
1.2.1 Compile Kernel
- Download Kernel Source Code
git clone https://github.com/friendlyarm/linux.git -b nanopi2-v4.4.y --depth 1 cd linux
The kernel source for S5P6818 is in the "nanopi2-v4.4.y" branch. Before you start compiling it you need to switch to this branch.
- Compile Ubuntu Kernel
touch .scmversion make ARCH=arm64 nanopi3_linux_defconfig make ARCH=arm64
After your compilation succeeds an "arch/arm/boot/Image" will be generated and a DTB file(s5p6818-nanopi3-rev*.dtb) will be generated in the "arch/arm/boot/dts/nexell" directory. You can use them to replace the existing Image and DTB files in the boot partition of your bootable SD card.
1.2.2 Use Your Generated Kernel
- Update kernel in SD card
If you use an SD card to boot Ubuntu you can copy your generated Image and DTB files to your SD card's boot partition(e.g. partition 1 /dev/sdX1).
- Update kernel in eMMC
If you boot your board from eMMC you can update your kernel file by following the steps below:
1) Usually after OS is loaded eMMC's boot partition (in our example eMMC's device name was /dev/mmcblk0p1) will be automatically mounted and you can verify that by running "mount"
2) Connect your board to a host PC running Ubuntu and copy the Image and DTB files to eMMC's boot partition
3) Or you can copy your generated kernel file to an external storage card(e.g. an SD card or a USB drive), connect the storage card to your board the move the file from the card to eMMC's boot partition
4) After update is done type "reboot" to reboot your board. Note: don't just directly disconnect your board from its power source or press the reset button to reboot the board. These actions will damage your kernel file
- Generate Your boot.img
If you want to generate an image file that can be flashed to eMMC you need to generate a boot.img file and then copy it to your installation SD card
For Ubuntu follow the steps below to generate a boot.img file:
1) Download debian_nanopi2
git clone https://github.com/friendlyarm/debian_nanopi2.git
2) Copy the Image and DTB files to replace the corresponding files under the "debian_nanopi2/boot/" directory
3) Generate boot.img
cd debian_nanopi2 mkdir rootfs ./build.sh
A newly generated boot.img will be under the "debian_nanopi2/sd-fuse_nanopi2/debian" directory.
The "mkdir rootfs" command creates a working directory for the build.sh script to run. It also creates some files such as "rootfs.img" but these files are useless.
1.2.3 Compile U-Boot
Download the U-Boot v2016.01 source code and compile it. Note that the github's branch is nanopi2-v2016.01:
git clone https://github.com/friendlyarm/u-boot.git cd u-boot git checkout nanopi2-v2016.01 make make s5p6818_nanopi3_defconfig make CROSS_COMPILE=aarch64-linux-
After your compilation succeeds a fip-nonsecure.img will be generated. If you want to test it flash it to your installation SD card to replace an existing U-Boot v2016.01 file via fastboot, sd-fuse_s5p6818 or eflasher ROM.
Note: you cannot use mixed U-Boot files. For example you cannot use fastboot to update an existing U-Boot V2014.07 and you cannot use bootloader.img to replace an existing u-boot.bin.
1.3 Compile Linux kernel 3.4.y
1.3.1 Prepare mkimage
You need the mkimage utility to compile a U-Boot source code package. Make sure this utility works well on your host before you start compiling a uImage.
You can install this utility by either commanding "sudo apt-get install u-boot-tools" or following the commands below:
cd uboot_nanopi2 make CROSS_COMPILE=arm-linux- tools sudo mkdir -p /usr/local/sbin && sudo cp -v tools/mkimage /usr/local/sbin
1.3.2 Compile Linux Kernel
- Download Kernel Source Code
git clone https://github.com/friendlyarm/linux-3.4.y.git cd linux-3.4.y git checkout nanopi2-lollipop-mr1
The {{{1}}}'s kernel source code lies in the "nanopi2-lollipop-mr1" branch.
- Compile Android Kernel
make nanopi3_android_defconfig touch .scmversion make uImage
- Compile Debian Kernel
make nanopi3_linux_defconfig touch .scmversion make uImage
After your compilation succeeds a uImage will be generated in the "arch/arm/boot/" directory. This kernel is for LCD output. You can use it to replace the existing uImage.
If you want to generate a kernel for HDMI output you need to run nanopi3_linux_hdmi_defconfig and do it this way:
make nanopi3_linux_hdmi_defconfig touch .scmversion make uImage
After your compilation succeeds a uImage.hdmi will be generated for HDMI 720P. If you want a uImage.hdmii for 1080P you can do it this way:
touch .scmversion make nanopi3_linux_hdmi_defconfig make menuconfig Device Drivers --> Graphics support --> Nexell Graphics --> [ ] LCD [*] HDMI (0) Display In [0=Display 0, 1=Display 1] Resolution (1920 * 1080p) ---> make uImage
After your compilation succeeds a uImage.hdmi will be generated for HDMI 1080P. You can use it to replace the existing uImage.hdmi.
1.3.3 Use Your Generated Kernel
- Update the kernel file in SD card
If you use an SD card to boot Android you can copy your generated uImage file to your SD card's boot partition(e.g. partition 1 /dev/sdX1).
If you use an SD card to Debian and you generated a uImage for an HDMI monitor you can use that uImage to replace the uImage.hdmi file in the SD card's boot partition. If you use an SD card to Debian and you generated a uImage for an LCD you can use that uImage to replace the uImage file in the SD card's boot partition.
- Update Android kernel file in eMMC
If you want to update the kernel file in eMMC you need firstly boot your board, then mount eMMC's boot partition, replace the boot partition's kernel file with your generated one and reboot your board.
If you boot your board from eMMC you can update your kernel file by following the steps below:
1) After Android is loaded mount eMMC's boot partition (in our example eMMC's device name was /dev/mmcblk0p1) by using the following commands:
su mount -t ext4 /dev/block/mmcblk0p1 /mnt/media_rw/sdcard1/
2) Connect your board to a host PC running Ubuntu with a MicroUSB cable and copy the uImage file to eMMC's boot partition by running the following commands
adb push uImage /mnt/media_rw/sdcard1/
3) Or you can copy your generated kernel file to an external storage card(e.g. an SD card or a USB drive), connect the storage card to your board the move the file from the card to eMMC's boot partition
4) After update is done type "reboot" and enter to reboot your board. Note: don't just directly disconnect your board from its power source or press the reset button to reboot the board. These actions will damage your kernel file
- Update Debian kernel file in eMMC
If you boot your board from eMMC you can update your kernel file by following the steps below:
1) When Debian is being loaded eMMC's boot partition will be automatically mounted(in our example eMMC's device name was /dev/mmcblk0p1). You can use "mount" to verify that
2) Connect your board to a host PC via Ethernet and copy your generated uImage file via scp/ftp to eMMC's boot partition and replace the existing file. If your file is for LCD output use your uImage file to replace the existing uImage. If your file is for HDMI output use your uImage.hdmi file to replace the existing uImage.hdmi file
3) Or you can copy your generated kernel file to an external storage card(e.g. an SD card or a USB drive), connect the storage card to your board the move the file from the card to eMMC's boot partition
4) After update is done type in "reboot" to reboot your board. Note: don't just directly disconnect your board from its power source or press the reset button to reboot the board. These actions will damage your kernel file
- Generate Your boot.img
If you want to generate an image file that can be flashed to eMMC you need to generate a boot.img file and copy it to your installation SD card
For Android copy the uImage file to Android source code's "device/friendly-arm/nanopi3/boot/" directory and compile this whole Android source code. After your compilation is successful you will get a boot.img file.
For Debian follow the steps below to generate a boot.img file
1) Download debian_nanopi2
git clone https://github.com/friendlyarm/debian_nanopi2.git
2) Copy the image file for an HDMI monitor and use it to replace the "debian_nanopi2/boot/uImage.hdmi" file and copy the image file for an LCD and use it to replace the "debian_nanopi2/boot/uImage" file
3) Generate Debian's boot.img
cd debian_nanopi2 mkdir rootfs ./build.sh
A newly generated boot.img will be under the "debian_nanopi2/sd-fuse_nanopi2/debian" directory.
The "mkdir rootfs" command creates a working directory for the build.sh script to run. It also creates some files such as "rootfs.img" but these files are useless.
1.3.4 Compile Kernel Modules
Android contains kernel modules which are in the "/lib/modules" directory in the system partition. If you want to add your own modules to the kernel or you changed your kernel configurations you need to recompile these new modules.
Compile Original Kernel Modules:
cd linux-3.4.y make CROSS_COMPILE=arm-linux- modules
Here we have two new modules and we can compile them by running the commands below:
cd /opt/FriendlyARM/s5p6818/android ./vendor/friendly-arm/build/common/build-modules.sh
The "/opt/FriendlyARM/s5p6818/android" directory points to the top directory of Android source code. You can get more details by specifying option "-h".
After your compilation succeeds new modules will be generated
1.3.5 Compile U-Boot
Download the U-Boot v2014.07 source code and compile it. Note that the github's branch is nanopi2-lollipop-mr1:
git clone https://github.com/friendlyarm/uboot_nanopi2.git cd uboot_nanopi2 git checkout nanopi2-lollipop-mr1 make s5p6818_nanopi3_config make CROSS_COMPILE=arm-linux-
After compilation is done a u-boot.bin will be generated and you can update your {{{1}}}'s u-boot with fastboot by running the following commands:
1) On your host PC run "sudo apt-get install android-tools-fastboot" to installl the fastboot utility;
2) Connect your {{{1}}} to your host PC, boot your {{{1}}} and press "Enter" within two seconds right after your board is powered on and you will enter the u-boot commandline:
3) In the commandline window type "fastboot" and then press "Enter" to enter the fastboot mode:
4) Connect your {{{1}}} to a host PC with a MicroUSB cable and run the following commands in the commandline window to flash u-boot.bin to your {{{1}}}:
fastboot flash bootloader u-boot.bin
Note:you cannot use "dd" to update your SD card in this situation.
1.4 Compile Android
1.4.1 Install Cross Compiler
Install 64 bit Ubuntu 16.04 on your host PC.
sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zip sudo apt-get install flex libncurses5-dev zlib1g-dev gawk minicom
For more details refer to https://source.android.com/source/initializing.html 。
1.4.2 Download Android5.1 source code
There are two ways to download the source code:
- repo archive file on netdisk
Netdisk URL: Click here
File location on netdisk:sources/s5pxx18-android5.git-YYYYMMDD.tgz (YYYYMMDD表示打包的日期)
After extracting the repo package from the network disk, you need to execute the sync.sh script, which will pull the latest code from gitlab:
tar xvzf /path/to/netdisk/sources/s5pxx18-android5.git-20181228.tgz cd s5pxx18-android5 ./sync.sh
- git clone from gitlab
{{{1}}} source code is maintained in gitlab, You can download it by running the following command:
git clone https://gitlab.com/friendlyelec/s5pxx18-android5 cd s5pxx18-android5
1.4.3 Compile Android
source build/envsetup.sh lunch aosp_nanopi3-userdebug make -j8
After your compilation succeeds an image will be generated in the "out/target/product/nanopi3/" directory.
filename partition Description boot.img boot - cache.img cache - userdata.img userdata - system.img system - partmap.txt - partition description file
1.4.4 Flash Image to SD Card
If you want to boot your board from an SD card you need to copy your generated image file to the "sd-fuse_s5p6818 /android/" directory and flash it to your SD card with our script. For more details refer to # Make an Installation SD Card under Linux Desktop。
1.4.5 Flash Image to eMMC
After compiling Android successfully you can flash it to eMMC with either of the following methods:
1) fastboot: right after the {{{1}}} is booted from eMMC press any key to enter the uboot commandline mode and type in "fastboot"
Connect your board to a host PC running Ubuntu with a USB cable and run the following commands in the PC's terminal:
cd out/target/product/nanopi3 sudo fastboot flash boot boot.img sudo fastboot flash cache cache.img sudo fastboot flash userdata userdata.img sudo fastboot flash system system.img sudo fastboot reboot
2) Use an SD Card
Copy these files: boot.img, cache.img, userdata.img, system.img, partmap.txt from the out/target/product/nanopi3 directory to your installation SD card's images/android directory and you can use this SD card to flash Android to eMMC.