imx6ull移植Linux系统第二篇——Linux内核的移植

花了大概两周的时间,把Linux的移植认真学了一遍,期间踩了不少坑,花费了不少时间去解决各种奇奇怪怪的问题,最终完成了uboot、系统镜像、设备树以及根文件系统的制作,并最终下载到开发板上运行。这里想对这两周的学习内容进行一个总结,因为后期会有其他的学习安排,系统移植是一些经验和方法的掌握,如果长时间不去用,时间久了肯定会忘,希望这里写的总结会对后期的移植工作给出一些方法上的参考。




文章目录

  • imx6ull移植Linux系统第二篇——Linux内核的移植
  • 前言
  • 一、配置Linux内核
  • 1.1 添加开发板默认文件
  • 1.2 添加开发板对应的设备树文件
  • 1.3 CPU主频修改
  • 1.4 使能8线EMMC驱动
  • 1.5 修改网络驱动
  • 1.6 修改smsc.c文件
  • 二、编译Linux内核



前言

Linux内核由Linux基金会管理和发布,我们可以从Linux官网下载最新的Linux内核,同时半导体厂商也会移植某个版本的Linux内核,将其移植适配自家芯片以后开放给用户,所以这里我们用的就是NXP官方提供的Linux内核源码。
关于Linux内核源码的内容这里不作分析,本部分仅说明移植的方法。


提示:本文是根据正点原子imx6ull开发板教程,参考NXP官方EVK开发板源码做的移植工作,结合自己的一些理解所做的一些总结。

一、配置Linux内核

  这里使用的源码是正点原子提供的NXP官方原版Uboot,文件名叫做Linux->linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2,我们可以到正点原子官网或者NXP官网下载,然后将其发送到Ubuntu下并解压。

1.1 添加开发板默认文件

  在目录arch/arm/configs复制imx_v7_mfg_defconfig,重命名为imx_alientek_emmc_defconfig,这个文件就是我们的默认配置文件了,可用命令make imx_alientek_emmc_defconfig来配置内核。

1.2 添加开发板对应的设备树文件

.dts是设备树源码,编译Linux的时候会被编译为.dtb文件。然后修改 arch/arm/boot/dts/Makefile 文件,修改如下:

dtb-$(CONFIG_SOC_IMX6ULL) += \
    imx6ull-14x14-ddr3-arm2.dtb \
    imx6ull-14x14-ddr3-arm2-adc.dtb \
    imx6ull-14x14-ddr3-arm2-cs42888.dtb \
    imx6ull-14x14-ddr3-arm2-ecspi.dtb \
    imx6ull-14x14-ddr3-arm2-emmc.dtb \
    imx6ull-14x14-ddr3-arm2-epdc.dtb \
    imx6ull-14x14-ddr3-arm2-flexcan2.dtb \
    imx6ull-14x14-ddr3-arm2-gpmi-weim.dtb \
    imx6ull-14x14-ddr3-arm2-lcdif.dtb \
    imx6ull-14x14-ddr3-arm2-ldo.dtb \
    imx6ull-14x14-ddr3-arm2-qspi.dtb \
    imx6ull-14x14-ddr3-arm2-qspi-all.dtb \
    imx6ull-14x14-ddr3-arm2-tsc.dtb \
    imx6ull-14x14-ddr3-arm2-uart2.dtb \
    imx6ull-14x14-ddr3-arm2-usb.dtb \
    imx6ull-14x14-ddr3-arm2-wm8958.dtb \
    imx6ull-14x14-evk.dtb \
    imx6ull-14x14-evk-btwifi.dtb \
    imx6ull-14x14-evk-emmc.dtb \
    imx6ull-14x14-evk-gpmi-weim.dtb \
    imx6ull-14x14-evk-usb-certi.dtb \
    imx6ull-alientek-emmc.dtb \
    imx6ull-9x9-evk.dtb \
    imx6ull-9x9-evk-btwifi.dtb \
    imx6ull-9x9-evk-ldo.dtb

  这里只在23行加上了 imx6ull_alientek_emmc.dtb 一行,让内核编译源码时也能编译出设备树文件。

1.3 CPU主频修改

  CPU的主频使可以修改的,也可以修改为根据负载自动调频的模式,这样更加节能省电,由于修改主频非内核移植的必要操作,我们就不作介绍了,当移植完Linux系统以后,如果有超频的需要,可以尝试这方面的操作。

1.4 使能8线EMMC驱动

  NXP官方EVK开发板用的是4线的EMMC驱动,而正点原子的开发板用的是8线的EMMC驱动,8线速度更快,这里要修改EMMC的部分驱动程序。打开imx6ull-alientek-emmc.dts设备树文件,原代码如下:

&usdhc2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>;
non-removable;
status = "okay";
};

  修改如下:

&usdhc2 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc2_8bit>;
pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
bus-width = <8>;
non-removable;
status = "okay";
};

  修改完保存,然后用命令make dtbs重新编译设备树。

1.5 修改网络驱动

  前面说到开发板的网络PHY芯片改为了LAN8720,所以需要修改引脚和PHY地址、使能LAN8720内核等,前面一些关于引脚等修改有些繁琐,这里不做说明,具体看正点原子的教程,我想说一下图形配置的操作。
输入命令 make menuconfig,打开图形化配置界面,选择使能LAN8720A的驱动,路径如下:

-> Device Drivers 
 -> Network device support 
  -> PHY Device support and infrastructure 
   -> Drivers for SMSC PHYs

图形化配置文件生成的.config文件会被编译时的clean命令给清除,这就相当于没有配置,要么编译时不执行clean,要么我们就把这个.config文件保存起来,当然推荐的是方法二。我们在选中 “Drivers for SMSC PHYs” 以后,不要急着退出,到图形界面下“Save”选择保存文件。

imx6ull 安装mysql_设备树


  这时要输入保存的文件名,可以带相对路径(相对于Linux内核源码根目录),那么我们输入“arch/arm/configs/imx_alientek_emmc_defconfig”,即重命名 imx_alientek_emmc_defconfig 到目录 arch/arm/configs 下,也就是相当于在我们前面修改的 imx_alientek_emmc_defconfig 文件里面添加了图形配置的改动部分。

imx6ull 安装mysql_ubuntu_02


  然后就可以退出了,这样编译的时候不会对配置造成改动。

1.6 修改smsc.c文件

  这部分文件含有网络驱动的程序,若不修改会导致NFS挂载文件的成功率很低,要修改文件drivers/net/phy/smsc.c的smsc_phy_reset函数,具体修改见正点原子教程。

二、编译Linux内核

  编译Linux内核和编译uboot的方法差不多,都是清理、配置、编译,这里我们直接建一个imx6ull_alientek_emmc.sh的脚本,将要执行的命令都放进去,脚本内容:

#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihfimx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

在目录 arch/arm/boot 下生成 zImage 镜像文件,在 arch/arm/boot/dts 目录下生成 imx6ull-alientek-emmc.dtb 文件,后面我们就用到这两个文件来制作系统。
  我们可以把他们拷贝到tftp目录(需要先设置好Ubuntu的tftp功能),然后在uboot命令行中设置tftp网络启动的方式,直接通过网络将这两个文件加载到开发板运行,主要是为了方便我们调试镜像和设备树,uboot命令为:

tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-emmc.dtb
bootz 80800000 – 83000000

  但是现在去运行内核和设备树一般会有一些异常的提示,这是因为缺少根文件系统,我们只能进入到内核中,却看不到任何文件,等移植完rootfs我们才能得到一个完整的Linux系统。