NanoPC-T2/T3 测试记录

/ 0评 / 0

在开始之前,先要交代下环境.

接着还要对软件目录有个概念认知,因为官方描述实在太模糊,所以让我很不解.而且官方分到了很多个文件,更是烦人.

我已经全部整合了一下.但是未做任何功能修改(有些不改编译不过的还是改了,但是功能绝对还是在的.代码里面还很多垃圾文件,也从来未管过.)

我们先看看烧写镜像,写入方法很多,其中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没开放吧,不知道有没有网友做.还没探讨.

  1. 在电脑上先用命令 sudo apt-get install android-tools-fastboot 安装 fastboot 工具.
  2. 用串口配件连接NanoPC-T3和电脑,在上电启动的2秒内,在串口终端上按下回车,进入 u-boot 的命令行模式.
  3. 在u-boot 命令行模式下输入命令 fastboot 回车,进入 fastboot 模式.
  4. 用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内容的.目前我还不是很懂,但是官方提供了,就放下来吧.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注