一,前言
环境搭建好了,所以uboot和kernel需要先编译下。用虚拟机ubuntu14.04.6 64位的PC来编译。
二,实践
A,TI官网的sdk uboot编译方法
1,装必要的包 在ubuntu14.04.6上编译uboot2021,很明显版本会不匹配,所以过程会报错误,然后要补充安装某些库,我遇过坑后,整理了下,需要安装如下,Linaro交叉编译器要6.0版本以上,我装了7.5,网上地址为:Linaro Releases我选择了7.5版本的64bit交叉编译安装包。
sudo apt-get install bison flex libssl-dev
2,若之前已经编译过,需要重新编译,执行如下2条命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
rm -rf ./am335x_evm
3,从来没编译过,过做更新编译,可以直接运行如下2条命令,O=代表编译后的输出文件夹名称
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=am335x_evm am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=am335x_evm
B,TI官网的zImage编译方法
1,需要重新编译则要先清除之前的编译输出物
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
2,进行配置,如下等于直接copy到.config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- tisdk_am335x-evm_defconfig
3,linux kenrnel源码编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage
4,编译设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x-boneblack.dtb
5,编译所有模块
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
6,安装内模块,Linux kernel, dtb files and modules编译完成后,copy到同一个目录。(可选) 暂时定义copy到/work/img/rootfs,如下等于是copy所有模块。
make ARCH=arm INSTALL_MOD_PATH=/work/img/rootfs modules_install
7,copy zImage和uboot到/work/img/rootfs的boot文件夹。(可选)
cp arch/arm/boot/zImage /work/img/rootfs/boot/
cp arch/arm/boot/dts/am335x-boneblack.dtb /work/img/rootfs/boot/
C,编译增加的外部模块
1,只要编译过modules有Module.symvers后,就可以编译外部模块的,否则会报错。在外部模块目录下输入命令。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
2,外部模块的makefile供参考,内核路径是交叉编译内核的源码路径。
KERNELDIR :=/work/kernel/board-support/linux-5.10.100
CURRENT_PATH := $(shell pwd)
obj-m := applepaper.o
build: kernel_modules
kernel_modules:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
三,小结
一开始编译就出现各种问题,吓了我一跳,怎么会卡在这里。原来是交叉编译器的问题,以前我用的ubuntu是32bit的,现在用了64bit的ubuntu,所以交叉编译器也要用64bit的。