Template:S5P6818BuildFromSource
Contents
1 Make Your Own OS Image
1.1 Install Cross Compiler
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 U-Boot
Download the U-Boot 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 your compilation succeeds a u-boot.bin will be generated. If you want to test it flash it to your installation SD card via fastboot. Here is how you can do it:
1) On your host PC run "sudo apt-get install android-tools-fastboot" to install the fastboot utility;
2) Connect your NanoPC-T3 to your host PC via a serial cable (e.g. PSU-ONECOME). Press the enter key within two seconds right after you power on your NanoPC-T3 and you will enter uboot's command line mode;
3) After type in "fastboot" and press "enter" you will enter the fastboot mode;
4) Connect your NanoPC-T3 to this host PC via a microUSB cable and type in the following command to flash u-boot.bin:
fastboot flash bootloader u-boot.bin
Warning: you cannot update this SD card by commanding "dd". This command will cause trouble when booting the NanoPC-T3.
1.3 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.4 Compile Linux Kernel
1.4.1 Compile 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 NanoPC-T3'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/uImage" 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 menuconfig
After your compilation succeeds a uImage will be generated for HDMI 720P. If you want a uImage 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 will be generated for HDMI 1080P. You can use it to replace the existing uImage.hdmi.
- Compile Kernel for Ubuntu Core
The steps here are nearly the same as the steps for compiling a Debian kernel:
LCD Output:
make nanopi3_core-qt_defconfig
HDMI Output:
make nanopi3_core-qt_hdmi_defconfig
Select your configuration file and run the following commands to generate a uImage.
touch .scmversion make uImage
1.4.2 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 section(e.g. section 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 section. 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 section.
- 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 section, replace the boot section's kernel file with your generated one and reboot your board to make your new kernel run.
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 section (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 and copy the uImage file to eMMC's boot section 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 section;
4) After update is done type in "reboot" to reload Android. Note don't directly power off and on the board or press the reset button to reboot the board. These two 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 section 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 section and replace the existing file. If your file is for an LCD use your uImage file to replace the existing uImage. If your file is for an HDMI monitor 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 section;
4) After update is done type in "reboot" to reload Debian. Note don't directly power off and on the board or press the reset button to reboot the board. These two 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.4.3 Compile Kernel Modules
Android contains kernel modules which are in the "/lib/modules" directory in the system section. 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 following 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.5 Compile Android
- 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 。
- Download Source Code
You need to use repo to get the Android source code. Refer to https://source.android.com/source/downloading.html 。
mkdir android && cd android repo init -u https://github.com/friendlyarm/android_manifest.git -b nanopi3-lollipop-mr1 repo sync
The "android" directory is the working directory.
- Compile System Package
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 file
- 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。
- 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 NanoPC-T2 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.