在开始之前,先要交代下环境.
- 系统和软件配置:与NanoPi K2编译环境一致.(包括JDK和基本软件都要安装)
- 磁盘空间:100GB+ (需要CCACHE则多附加100GB)
- 软件包:NanoPC_T2-T3_Sources.tar.xz
- 注意:切换目标,应经常make clean等操作.最好就是一套源码,只为一个板子.出现问题最好能dd清空SD卡.
接着还要对软件目录有个概念认知,因为官方描述实在太模糊,所以让我很不解.而且官方分到了很多个文件,更是烦人.
我已经全部整合了一下.但是未做任何功能修改(有些不改编译不过的还是改了,但是功能绝对还是在的.代码里面还很多垃圾文件,也从来未管过.)
- android_kitkat_4.4.2 => 安卓4.4源码,只适用于NanoPC-T2
- android_lollipop_5.1.1_r6 => 安卓5.1源码,通用.
- debian_nanopi2 => 生成boot.img重要工具,通用.
- linux-3.4 => Android 内核(也可以用于Linux,不推荐.),通用.
- linux-4.4 => Linux内核,通用.
- nexell_linux_platform => 也许是三星特有代码,通用.
- prebuilts => 预置工具链,Linux平台,通用.
- sd-fuse_s5p4418 => 内置软件包的NanoPC-T2烧写工具.
- sd-fuse_s5p6818 => 内置软件包的NanoPC-T3烧写工具.
- u-boot-v2014.07 => 安卓用引导(也可以用于Linux,不推荐.),通用.
- u-boot-v2016.01 => Linux用引导,通用.
我们先看看烧写镜像,写入方法很多,其中sd-fuse是其中一种.支持的系统也有所不同.具体烧写命令格式如下.(sd-fuse_s5pXXXX 是烧写工具目录,切换到该目录下执行.)
sudo ./fusing.sh /dev/sdb lubuntu
如下图,红框就是支持的系统.(注意这里是不同平台,eflasher是烧写到EMMC用的.)
烧写是非常简单的操作,每个文件夹里面就是要写入的文件,后面会用到.(如果要替换里面的内容,直接替换就可以了.)
一般系统镜像烧写是非常简单的,写入后就可以启动,可能复杂一点,也许就是eflash的吧.(他本质是个烧写器.专门烧写EMMC的.),他烧写后启动,有提示,要自己放镜像,就没有再继续测试了.
PS:烧写elflash提示缺少一个文件,实际测试无影响.
那么接下来记录下如何编译各种,这个板子的最初级BL不是开源的,GPU本身也不开源,要自己做rootfs并且适配GPU,只能复制对应文件.首先当然是准备环境.把工具链位置加入PATH.(我是临时运行一下,临时配置环境.)
export PATH=/home/tater/android/prebuilts/gcc-x64/aarch64-cortexa53-linux-gnu-6.4/bin:/home/tater/android/prebuilts/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3/bin:$PATH
我们到linux-4.4目录,尝试编译Linux 4.4内核.有两个主要目标,根据平台选择.(虽然是这样,但是同时只能存在一个平台配置.)
make ARCH=arm nanopi2_linux_defconfig make ARCH=arm64 nanopi3_linux_defconfig
当然,后面也是根据平台选择的,一个是32位内核,一个是64位内核,不能搞混.
make ARCH=arm make ARCH=arm64
因为目标平台差异很大,所以他们生成的文件也有差别.(估计是改过文件了,不然怎么一下子就能编译出dtb 呢?)
比如NanoPC-T2的目标文件arch/arm/boot/zImage,在arch/arm/boot/dts/下还包括新的DTB文件(s5p4418-nanopi2-rev*.dtb).
而在NanoPC-T3的目标文件arch/arm64/boot/Image,在arch/arm64/boot/dts/nexell/下还包括新的DTB文件(s5p6818-nanopi3-rev*.dtb).
如果是已烧写好的EMMC或者SD卡,那么只要想办法把文件替换到boot分区(SCP/SFTP/读卡器)就可以了.比如我替换的NanoPC-T3的Ubuntu,原始是这样的.
替换过程.
结果.(编译用的机器信息也有~)
这个内核支持除了安卓之外的所有Image.(其中eflasher未测试,因为那只是个烧写器,烧写EMMC的工具而已,他是什么内核不重要.),也同时完全测试了NanoPC-T2也是支持的.替换方法差不多,但是路径有一点点区别,下图是NanoPC-T2的记录图.(#1意思是首次编译,每次编译都会增加.)
这种替换方法,至少有一次启动成功,才有后续.如果是另外的方法呢,就要生成boot.img,然后去做.这里用到了debian_nanopi2文件夹.(其实debian_nanopi2是打包boot分区的工具罢了)
使用NanoPC-T2,则复制如下文件(zImage + dtb):
使用NanoPC-T3,则复制如下文件(Image + dtb):
然后执行目录下的build.sh脚本,生成boot.img.(生成的rootfs不能用.)
复制替换原来sd-fuse的镜像文件夹内.然后烧写.(这里是不是有什么文件重复了的感觉.)
PS:我是先尝试NanoPC-T2,再尝试NanoPC-T3,然后失败,找不到bootz指令,这个跟U-Boot还有什么联系?我猜测可能是因为环境变量已经存在了,所以U-Boot没有重写任何环境变量,然后出错了.如果是干净TF卡也许就没问题.因为反过来,先做T3再做T2的,也是会类似失败.
经过对比,发现是环境变量有问题.
setenv rootdev 0 setenv kernel Image setenv mmcboot "run load_kernel; run load_initrd; run load_dtb; booti ${loadaddr} ${initrd_addr}:${initrd_size} ${dtb_addr}" saveenv reset
继续往下,进入U-Boot目录去做U-Boot,也是有两个选择.
make s5p4418_nanopi2_defconfig make s5p6818_nanopi3_defconfig
对应的编译选项也有两个.(因为一个是32位,一个是64位,也不能混用.)
make CROSS_COMPILE=arm-linux- make CROSS_COMPILE=aarch64-linux-
编译过程:
U-Boot的话,可以用fastboot烧写,也可以sd-fuse,我推荐后者.把生成文件复制过去.
对于NanoPC-T3,生成如下文件:
对于NanoPC-T2,生成如下文件:
然后一样用sd-fuse测试就可以.
接着,到Linux-3.4内核,实际上3.4内核支持Linux,但是不讨论这个情况,毕竟4.4已经开发完好的呢.何必想不开呢.
内核编译有下面几个配置项.(看名字就可以理解,但是我们只讨论安卓情况.)
make nanopi3_android_defconfig make nanopi3_linux_defconfig make nanopi3_linux_hdmi_defconfig make nanopi2_android_defconfig make nanopi2_linux_defconfig make nanopi2_linux_hdmi_defconfig
先编译NanoPC-T3的尝试下,如下图.
更新内核也就两种方法,一种是想方设法,复制uImage到安卓boot分区下(adb或者挂载/dev/sdb1).一种是生成boot.img,他们原理是一样的.生成boot.img比较麻烦,需要重新编译Android,要把uImage复制到源码的device/friendly-arm/nanopiX/boot/目录下.(X要自己替换.)
替换前:
替换后:
编译内核模块.需要两部分.(第一条指令是在内核目录下的,第二条是安卓目录下的.)
make CROSS_COMPILE=arm-linux- modules ./vendor/friendly-arm/build/common/build-modules.sh -k /home/tater/android/linux-3.4/ -c s5p6818
第一条指令看起来很正常.
第二条记得替换目录,可以用-h查帮助.
替换方法?也很简单.挂载system(我的是/dev/sdb2)分区,然后替换/lib/modules/下相关文件.如果要从源码级就开始替换,复制到./vendor/friendly-arm/nanopi2/prebuilt/目录才对.
下图只是个举例说明:
切换到U-Boot目录,就是2014.07版本的那个.同样,他也有两个目标.但是,目前依然讨论NanoPC-T3.
make s5p6818_nanopi3_config make s5p4418_nanopi2_config
但是编译方法是一个.
make CROSS_COMPILE=arm-linux-
最终得到的是u-boot.bin文件.
但是烧写方法非常恶心.可能由于BL1没开放吧,不知道有没有网友做.还没探讨.
- 在电脑上先用命令 sudo apt-get install android-tools-fastboot 安装 fastboot 工具.
- 用串口配件连接NanoPC-T3和电脑,在上电启动的2秒内,在串口终端上按下回车,进入 u-boot 的命令行模式.
- 在u-boot 命令行模式下输入命令 fastboot 回车,进入 fastboot 模式.
- 用microUSB线连接NanoPC-T3和电脑,在电脑上输入"sudo fastboot flash bootloader u-boot.bin"
结果如下图:
在fastboot下,界面是这样的.
替换结果(注意的是编译日期):
最后,是安卓编译.老惯例设置环境.(这里指的是编译安卓5.1.1),是否用CCACHE,自己决定就好.
export USE_CCACHE=1 export WITHOUT_HOST_CLANG=false export ANDROID_SET_JAVA_HOME=true prebuilts/misc/linux-x86/ccache/ccache -M 50G source build/envsetup.sh
然后选择目标.(参考两个目标,实际上不止,还有一个-eng的,具体只运行lunch是可以选择的.如果是切换目标,切记make clobber一下.)
lunch aosp_nanopi3-userdebug lunch aosp_nanopi2-userdebug
然后开始make就行.最好输出个日志,这样自己也很好查.(因为使用了CCACHE,所以首次时间会很长,但是如果进行二次修改再编译,就能从中得益.)
编译安卓是非常浪费时间的,特别是开了CCACHE,我这里花了2个小时,(你也可以参考下我编译用时,因为是虚拟机编译,肯定还有那么一点点的性能损失,该去休息的休息.)
这个是编译Log,整个过程也是漫长啊.(用我提供代码肯定不会错,其他...说不准.)
这个是编译输出文件.
这些文件的含义如下(可见没有U-Boot):
文件名 | 目标分区 | 描述 |
boot.img | boot | 内核 |
cache.img | cache | Cache |
userdata.img | userdata | 用户数据 |
system.img | system | 系统 |
partmap.txt | - | 分区描述文件 |
可以用坑爹的fastboot烧写方法.
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
具体验证:
也可以用sd-fuse,就比较简单,复制这些文件到sd-fuse的android下,然后烧写就可以.
启动后长这个样子.(两种方法我都试过了,都可以的,但是方便来说,就看具体环境了,比如我当然是sd-fuse方便.)
接着尝试编译NanoPC-T2的Linux-3.4源码,如下图.(与NanoPC-T3同理,生成的是uImage文件.所以不再啰嗦,自己翻查前面,重点只在于替换了配置文件.连源码都是同一份.)
得到文件:
内核模块的编译和安装,与NanoPC-T3是一模一样的,所以这里也不再啰嗦,直接查看前面.
接着就是编译U-Boot.(也是除了配置不同,其他一样,连要用fastboot坑爹方法更新,都是一模一样的.)
得到文件:
编译安卓5.1源码也几乎无差别.只是编译目标进行了改变.但是记得进行完整的清理(完整清理命令:make clobber)
各种更新方法,也没有半点差别.(包括可以用坑爹的fastboot更新.)验证如下:
[图]
但是,NanoPC-T2支持Android 4.4,这个就有点差别了.因为他天生要用JDK 1.6(而且要SUN公司版本的~)编译.不过,不需要破坏自身的JAVA环境.
配置脚本按照这么执行.(记得替换路径,这样,他就会自己找Java 1.6来编译拉~,最好是临时绑定,不要永久,不然JAVA默认就被PATH环境变量替换了.)
export JAVA_HOME=/home/tater/android/android_kitkat_4.4.2/prebuilts/jdk1.6.0_45 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export USE_CCACHE=1 export ANDROID_SET_JAVA_HOME=true export WITHOUT_HOST_CLANG=false source build/envsetup.sh lunch aosp_nanopi2-userdebug
然后开始愉快编译~
不管是编译Android 4.4还是Android 5.1,他们的生成目标文件是同一个,放内核的位置也是同一个,所以没什么好说的了.
安卓4.4编译结果显示跟5.1的显示有一点点差别,不过,到底就是一样的东西.能看到这句话就没问题了.
安卓4.4验证.
摆在最后,要说下nexell_linux_platform这东西,其实,他是nanocams程序源码,主要体现OpenCV内容的.目前我还不是很懂,但是官方提供了,就放下来吧.