-----最近手头之前学习使用的是九鼎的X210开发板,使用的是S5PV210 SOC,目前210 的学习资料也比较丰富,易于学习。可是目前最多的资料都是基于Linux2.6.35.7这个内核版本来学习的。今天下载了Linux4.4.1版本的内核,发现该版本上使用设备树传参已经很好的支持了S5PV210,特此打算移植4.4.1版本的内核并且使用设备树传参来启动内核。
说干就干,从官网下载Linux4.4.1内核,原来是使用三星官方的2009q3这套交叉编译工具链,先使用该工具链编译内核,后续有问题的话再换工具链。
首先设置内核源码目录下的Makefile.修改ARCH 和CROSS_COMPILE:
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/2009q3/bin/arm-linux-gunabie-
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/2009q3/bin/arm-linux-gunabie-
# Architecture as present in compile.h
UTS_MACHINE := $(ARCH)
SRCARCH := $(ARCH)
然后执行make s5pv210_defconfig
make
这时候发现报错误:
/tmp/ccgcmPjb.s: Assembler messages:
/tmp/ccgcmPjb.s:243: Error: garbage following instruction -- `dsb nshst'
/tmp/ccgcmPjb.s:251: Error: garbage following instruction -- `dsb nsh'
解决办法:
make menuconfig 后取消该配置:
Power management options --->
[] Suspend to RAM and standby
然后继续make,编译一会后报错:
garbage following instruction - 'dmb ish'
此时上网查了很多博客,发现是交叉编译器的问题,可能是版本太低。然后就按照网上的说法安装新版本工具链:
sudo apt-get install gcc-arm-linux-gnueabi
然后重新修改Makefile中的编译工具链:
(注意此时要把原来2009q3的工具链环境变量导出路径从/etc/profile下删除,不然可能会有冲突,还是识别旧版本工具链)
CROSS_COMPILE ?= /usr/local/arm/2009q3/bin/arm-linux-gunabie-
然后重新make,过一会发现编译成功。在arch/arm/boot/目录下生成了zImage.
进入arch/arm/boot/dts/目录下发现和S5PV210相关的设备树文件已经被编译成了dtb文件。
以后修改设备树文件我们可以直接make dtbs就可以生成dtb文件,不用编译整个内核。
我们可以使用dtc工具将dtb文件反编译生成完整的dts文件,方便查看。
反编译指令如下:
dtc -I dtb -O dts s5pv210-smdkv210.dtb > 210.dts
如果指令输入失败可以安装dtc工具:
sudo apt-get install device-tree-compiler
至此,内核编译成功,并且得到完整的devices tree参数。下一步使用uboot 启动内核,遇到问题在解决 。