一、NUC972的BSP包安装好后内容如下:
applications:示例程序以及开源软件,例如busybox, wireless tool…
buildroot:可用来编译内核,交叉编译工具,应用程序...等的集合
image/kernel:使用默认设置预先编译好的内核
image/U-Boot:使用默认设置预先编译好的支持NAND或SPI flash的U-Boot执行档及环境变量env.txt档。其中U-Boot的默认执行地址为0xE00000。
linux-3.10.x:内核源码
rootfs(rootfs_48):根文件系统(arm_linux_4.8环境使用)
rootfs_eth2uart:根文件系统(Eth2UART开发板使用)
rootfs_tomato:根文件系统 (Tomato开发板使用)
uboot:U-Boot V2013RC4源码
uboot.v2016.11:U-Boot V2016.11 源码
二、编译前的准备
NUC972的BSP自带了交叉编译器,安装完了BSP包,交叉编译器也随着被安装了,路径在/usr/local/arm_linux_4.8/usr/bin。把这个路径加入$PATH中,执行:
gedit /etc/profile
在profile中加入:
PATH="$PATH:/usr/local/arm_linux_4.8/usr/bin"
export PATH
保存退出。
执行
source /etc/profile
让其生效,现在执行
echo $PATH
可以看到PATH已经更新了。再执行
arm-linux-gcc -v
可以看到arm-linux-gcc的版本号,说明交叉编译器已经没问题了。
因为NUC972的BSP包是在32位系统下生成的,如果你的系统是64位的,那么就还需要安装32位的兼容包才可以使用BSP包中的二进制工具。执行
apt-get install libgtk2.0-0:i386 libxtst6:i386 gtk2-engines-murrine:i386 lib32stdc++6 libxt6:i386 libdbus-glib-1-2:i386 libasound2:i386
再执行
apt-get install g++
安装完成后,进入BSP包中的uboot文件夹
cd uboot
执行
make distclean
应该能正常执行,如果不行,参考:https://bbs.csdn.net/topics/390999780
如果怎么样都不行,可能就要换32位的系统了。(本人就是先装的64位的Ubuntu18.04,然后搜遍了网上也没有办法执行BSP包中的32位工具,所以只好重新装了32位的Ubuntu14.04)
三、编译Uboot
进入BSP包中的uboot文件夹
cd uboot
先清除以前编译留下的残留文件,执行
make distclean
把uboot的设置恢复为出厂设置(不需要恢复出厂设置的,跳过本步),执行
make nuc970_config
编译uboot,执行
make all
编译过程中好像会提示找不到rootfs文件夹,把BSP目录下的rootfs_48文件夹改为rootfs就可以了。
编译成功后,会生成u-boot.bin和u-boot-spl.bin。
u-boot.bin在uboot目录下:
u-boot-spl.bin在uboot/nand_spl目录下:
u-boot-spl.bin的功能是:把u-boot.bin从NAND flash中复制到DDR中执行,因为uboot不能直接在NAND flash中执行。
u-boot.bin才是真正的uboot文件。
因此,如果要让NUC972从NAND flash中启动,那就需要同时烧录u-boot-spl.bin和u-boot.bin。如果是从SPI flash或eMMC中启动,那就只需要烧录u-boot.bin,因为uboot可以直接在SPI flash或eMMC中执行。
四、编译Linux内核
uboot编译后会在uboot/tools文件夹下生成mkimage工具,而编译内核时需要使用它,所以执行:
cp uboot/tools/mkimage /bin
把它复制到/bin中,以便后面使用。
首先执行
apt-get install libncurses5-dev
安装libncurses5-dev软件包。然后进入内核目录
cd linux-3.10.x
把内核配置恢复成出厂:
make nuc972_defconfig
编译:
make uImage