准备工作
虚拟机:VM-Ware 16.2.3
操作系统:Ubuntu Linux 16.04
交叉编译器:arm-linux-gcc-4.6.4
工作文件夹:/home/work
搭建配置好交叉编译环境,完整搭建配置过程可参照下述博文:
迅为iTOP-4412之Android 4.0系统编译环境的搭建(完整版)-CSDN博客 https://blog.csdn.net/Eva20192020/article/details/134668004?spm=1001.2014.3001.5502
提示:虚拟机中解压完后的原打包文件建议删除,可以节约虚拟机空间。
一、linux内核源码的获取
1、从linux官网下载内核源码
从linux 官方网站:https://www.kernel.org/ ,下载内核源码,我们选择的是linux4.14.326,如下图所示:
单击打包“tarball”(将多个文件打包成一个文件称之为tarball),进行内核源码的下载,如下图所示:
内核源码文件linux-4.14.326.tar.xz下载完成,如下图所示:
2、虚拟机中解压内核源码
下载完成后,打开虚拟机,在虚拟机Ubuntu中的“/home/work”文件夹中建立"kernel"目录文件夹,并将下载的内核源码压缩包linux-4.14.326.tar.xz拷贝进去,操作过程如下图所示:
说明:有关 .tar.xz打包文件的解压说明
tar.xz是一种文件压缩格式,其中tar是一个类Unix操作系统下的文件归档格式,用于将多个文件打包成一个文件,称之为tarball,使用tarball可以方便地进行传输、备份、存档或者用于其他目的。而xz则是一种无损数据压缩工具,采用 LZMA/LZMA2 压缩算法,可以压缩文件到很小的大小。
因此,tar.xz文件是对多个文件进行归档后再进行压缩得到的一个包含所有文件的文件。在Ubuntu操作系统中,用于解压tar.xz文件的工具为tar命令和unxz命令,咱们以tar命令来进行解压并说明。
使用tar命令解压tar.xz文件需要使用到两个参数,首先-tar选项用于指定要执行的操作,然后-f选项指定要操作的文件名,使用"-"号表示从标准输入读取文件或者将文件输出到标准输出。
回到本文正题,需要将该打包文件压缩到/home/work/kernel下,如上图所示,/home/work/kernel是当前目录,只需解压到当前目录即可,命令如下:
tar -xvf linux-4.14.326.tar.xz
其中,-x选项表示解压文件,-v选项用于输出详细信息,-f选项指定要操作的文件名,可以将文件名替换成实际的文件名。
解压完成,生成linux-4.14.326文件夹,如下图所示:
二、修改源码编译架构及编译器
打开Makefile文件:进入解压后的inux内核源码文件夹,查找Makefile文件夹,并用命令“ gedit Makefile ”打开Makefile文件,过程如下图所示:
打开Makefile源文件后,打开显示行号“Display line numbers”,如下图所示:
修改320行和321行对应的架构(arch)和交叉编译器(CROSS_COMPILE),如下图所示:
Save保存关闭退出。
三、对内核进行裁剪
1、生成.config默认裁剪菜单文件
可以直接使用linux官方的默认配置即可,在内核源码下直接输入命令“ make exynos_defconfig ”,如下图所示:
2、进入裁剪界面
配置平台和调试串口:在内核源码下输入命令“ make menuconfig ”,试图打开裁剪界面。
如果出现报错提示,如下图所示:
根据上述提示,可知这个过程中需要ncurses库,但是在系统里面找不到,也就是基本的依赖库问题。解决方案就是安装一下 ncurses-devel就可以了,输入命令如下:
sudo apt-get install ncurses-dev
再次输入“ make menuconfig ”,成功打开裁剪界面,如下图所示:
3、选择芯片类型
下移选择" System Type ",回车,如下述图示所示:
下移选择“ Samsung EXYNOS ” 即迅为iTOP-4412开发板的内核型号“三星猎户座”,如下述图示所示:
回车进入该路径的选项配置,在配置过程中,【*】的选择和【 】的取消用“空格键”来进行操作,最终配置成下图所示:
4、调试串口的配置
右移到“Exit”,回车返回到“menuconfig”第一级目录,从第一级目录下移找到“ Kernel hacking ”的内核监视路径。
回车进入到“ Kernel hacking”的内核监视路径,选中“Kernel low-level debugging functions (read help!)”和“Early printk”两个选项,如下图所示:
然后选择“Kernel low-level debugging port (Use Samsung S3C UART 0 for low-level debug) ” 选项,把串口设置成串口2,如下图所示::
5、文件系统启动方式的配置
返回到menuconfig第一级目录,从第一级目录选择“Boot options”,如下图所示:
回车,进入“ Boot options”,进行配置,如下图所示:
进入上图中第二个红框标注的中间一行,进行内核启动参数的设置,将其设置为“ root=/dev/mmcblk0p2 rw console=ttySAC2,115200 init=/linuxrc rootwait ”如下图所示:
保存退出,继续将Kernel command type改为:kernel模式,如下图所示:
修改好后,结果如下图所示:
6、网络的配置
itop4412开发板板载dm9621网卡芯片是usb类型,因此需要依赖于usb 网络框架,所以要通过裁剪菜单选中支持项。
返回到menuconfig第一级目录,从第一级目录选择“Device Drivers”,如下图所示:
进入到设备驱动选项后,选择“Network device support ”网络设备支持选项,如下图所示:
进入网络设备支持选项后,选择USB网络适配,如下图所示:
进入USB网络适配设置,在其下选择对DM96XX的支持,如下图所示:
7、配置NFS服务
返回到menuconfig第一级目录,从第一级目录选择“File systems ”文件系统选项,如下图所示:
进入文件系统,继续选择网络文件系统选项,如下图所示:
进入网络文件系统,在网络文件系统配置界面,选中和NFS相关的选项,如下图所示:
设置完成后,保存并退出menuconfig配置。
四、对内核进行编译
我们在内核源码目录下输入以下命令:
make uImage LOADADDR=0X40007000
编译过程需要几分钟的时间,其中“ LOADADDR=0X40007000 ” 表示指定内核的加载地址,编译成功如下图所示:
如果编译不成功,出现“mkimage“ command not found - U-Boot images will not be built的错误提示,如下图所示:
其实就是缺乏uboot工具,安装即可,安装命令如下:
sudo apt-get install u-boot-tools
安装后,如下图所示:
安装成功后,再次输入编译内核命令,如下图所示:
五、修改设备树(dts)文件
进到内核 arch/arm/boot/dts/下,里面默认有 iTOP 的设备树文件,如下图所示:
再找到iTOP4412三星猎户座内核匹配设备树文件,如下图所示:
打开编辑修改exynos4412-itop-scp-core.dtsi文件,如下图所示:
1、注释掉firmware设备
firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。注释掉29到32行的代码,如下图所示:
2、修改event属性
因为没有events这个属性,所以我们要把72行的events修改成event,如下图所示:
3、配置核心板电源芯片
Exynos4412 芯片的POP和SCP两种封装形式,芯片的电源管理都是低功耗动态三星 S5M8767 电源管理架构。
把下面的代码修改成如下图所示:
CTRL+S,CTRL+Q,保存退出。
4、解决字符串溢出问题
打开编辑修改exynos4.dtsi文件,如下图所示:
注释掉文件中的串口2节点serial_2中的dmas属性,如下图所示:
保存退出。
5、对设备树进行编译
返回到内核源码文件目录,输入下图所示命令,如下图所示:
等待编译结果如下图所示:
如上两图所示,即为编译生成的设备树 dtb 文件“exynos4412-itop-elite.dtb” 和内核镜像uImage 。