前一阵想在nanopi t2的uboot上添加网卡驱动来加载内核开发驱动,结果无奈编译出来的uboot没办法烧录运行。官方制作SD镜像的工具也是缺胳膊少腿的,并且我也不想玩个uboot做个几G的镜像。官方提供的资料实在太少,对于一个爱折腾的人来说这怎么行呢,于是乎就有了下面这边文章。
通过对nanopi官方提供的uboot2016.1 一阵子的研究终于弄清楚了最新版本uboot的内存分布,实现了编译烧写到SD卡运行。
新版本的uboot跟以前的版本有很大的不同,uboot的内容和内存分布跟之前不一样了,之前的布局:传送门
1.2016版uboot内存布局
现在的内存布局及内容大致猜测如下:
块地址 | 内容 |
---|---|
Block 0 | Sd/emmc卡信息 |
Block1 | Nsih.bin |
Block2-BlocK3841 | 2ndboot.bin |
Block3842-BlockXX | u-boot.bin |
以上除了可以确定u-boot的位置无误以外其他的纯属猜测,目前还没心思钻研汇编代码的含义,2nboot部分都是不开源的,现在搞得这么大也不知道在做什么。确定了u-boot.bin的位置之后就可以动手了。
2.离线烧录步骤
1.下载uboot最新源码:
git clone https://github.com/friendlyarm/u-boot.git
git checkout nanopi2-v2016.01
2.编译前的准备:
3.配置uboot
导出默认配置:
make s5p4418_nanopi2_defconfig
添加自定义配置:
make menuconfig
编译:
make -j16 CROSS_COMPILE=arm-linux-
4.烧录镜像
编译会获得u-boot.bin和bootloader.img
bootloader.img是写入Nish参数以及签了名的uboot,这个才是可以直接用来烧录的uboot,可以看到最后编译完有句提示:
最后一行提示我们bootloader的生成跟tools/nexell/nish/nanopi2.txt有关,nanopi2.txt就是配置了一些启动代码和参数,其中就包括uboot的加载地址加载大小,启动地址等等。
格式的含义如下:
<值> // <写入镜像的地址> : <注释>
通过查看bootloader.img的二进制发现确实如此
最后只需要提取官方镜像中的前3841个块接上编译输出的bootloader.img就可以了,刷写脚本代码:
sudo dd if=bootloader.img of=uboot2016.bin bs=512 seek=3841
sudo dd if=uboot2016.bin of=/dev/sdx
整个文件大小4M不到,下面就可以愉快的挂接NFS和网络加载内核了