【IMX6ULL学习笔记】九、Linux内核移植

发布者:CaptivatingEyes最新更新时间:2025-03-03 来源: elecfans关键字:Linux  内核移植 手机看文章 扫描二维码
随时随地手机看文章

一、在 Linux 中添加自己的开发板

1、添加开发板默认配置文件

将 arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重新复制一份,命名为 imx_kodo_emmc_defconfig,命令如下:


cd arch/arm/configs

cp imx_v7_mfg_defconfig imx_kodo_emmc_defconfig

以后就可以使用如下命令来配置正点原子 EMMC 版开发板对应的 Linux 内核了:


make imx_kodo_emmc_defconfig

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

添加适合 EMMC 版开发板的设备树文件,进入目录 arch/arm/boot/dts 中,复制一份 imx6ull-14x14-evk.dts,将其重命名为 imx6ull-kodo-emmc.dts,命令如下:


cd arch/arm/boot/dts

cp imx6ull-14x14-evk.dts imx6ull-kodo-emmc.dts

.dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件。imx6ull-kodo-emmc.dts 创建好以后还需要修改文件 arch/arm/boot/dts/Makefile , 找到 “ dtb- $(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“imx6ull-kodo-emmc.dtb”,如下所示:


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-kodo-emmc.dtb

    imx6ull-9x9-evk.dtb

    imx6ull-9x9-evk-btwifi.dtb

    imx6ull-9x9-evk-ldo.dtb

第 23 行为“imx6ull-alientek-emmc.dtb”,编译 Linux 的时候就可以从 imx6ull-kodo-emmc.dts 编译出 imx6ull-kodo-emmc.dtb 文件了。


3、编译测试

创建一个编译脚本 kodo.sh,脚本内容如下:


#!/bin/sh

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf imx_kodo_emmc_defconfig

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

第 2 行:清理工程。

第 3 行:使用默认配置文件 imx_kodo_emmc_defconfig 来配置 Linux 内核。

第 4 行:打开 Linux 的图形配置界面,不需要每次都打开图形配置界面可以删除。

第 5 行:编译 Linux。


执行 shell 脚本 kodo.sh 编译 Linux 内核,命令如下:


chmod 777 kodo.sh           //给予可执行权限

./kodo.sh  //执行 shell 脚本编译内核

编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录下生成 imx6ull-kodo-emmc.dtb 文件。将这两个文件拷贝到 tftp 目录下,然后重启开发板,在 uboot 命令模式中使用 tftp 命令下载这两个文件并启动,命令如下:


tftp 80800000 zImage

tftp 83000000 imx6ull-kodo-emmc.dtb

bootz 80800000 - 83000000

只要出现如图所示内容就表示 Linux 内核启动成功:

image

二、CPU 主频和驱动修改

1、CPU 主频修改

2、使能 8 线 EMMC 驱动

Linux 内核驱动里面 EMMC 默认是 4 线模式的, 8 线模式的速度快,所以将 EMMC 的驱动修改为 8 线模式,直接修改设备树即可,打开文件 imx6ull-kodo-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;

    no-1-8-v;

    status = 'okay';

};

修改完成以后保存一下 imx6ull-kodo-emmc.dts,然后使用命令“make dtbs”重新编译一下设备树,编译完成以后使用新的设备树重启 Linux 系统即可。


3、修改网络驱动

学习 Linux 驱动开发的时候要用到网络调试驱动,所以要把网络驱动调试好。开发板的网络和 NXP 官方的网络硬件上不同,网络 PHY 芯片由 KSZ8081 换为了 LAN8720A,两个网络 PHY 芯片的复位 IO 也不同,需要做修改。


①、修改 LAN8720 的复位以及网络时钟引脚驱动

ENET1 复位引脚 ENET1_RST 连接在 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。ENET2 的复位引脚 ENET2_RST 连接在 I.MX6ULL 的 SNVS_TAMPER8 上。

打开设备树文件 imx6ull-kodo-emmc.dts,找到如下代码:


pinctrl_spi4: spi4grp {

    fsl,pins = <

        MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1

        MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1

        MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1

        MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000

    >;

};

示例代码中第 5 和 6 行就是初始化 SNVS_TAMPER7 和 SNVS_TAMPER8 这两个

引脚的,不过是作为了 SPI4 的 IO,所以将 5 和 6 这两行注释掉。

继续在 imx6ull-alientek-emmc.dts 中找到如下所示代码:


spi4 {

    compatible = 'spi-gpio';

    pinctrl-names = 'default';

    pinctrl-0 = <&pinctrl_spi4>;

    pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;

......

    cs-gpios = <&gpio5 7 0>;

第 5 行:设置 GPIO5_IO08 为 SPI4 的一个功能引脚(不清楚具体作为什么功能用),而 GPIO5_IO08 就是 SNVS_TAMPER8 的 GPIO 功能引脚。

第 7 行:设置 GPIO5_IO07 作为 SPI4 的片选引脚,而 GPIO5_IO07 就是 SNVS_TAMPER7 的 GPIO 功能引脚。需要 GPIO5_IO07 和 GPIO5_IO08 分别作为 ENET1 和 ENET2 的复位引脚,因此将示例代码中的第 5 行和第 7 行处的代码注释掉!


在 imx6ull-kodo-emmc.dts 里面找到名为“iomuxc_snvs”的节点(就是直接搜索),然后在此节点下添加网络复位引脚信息,添加完成以后的“iomuxc_snvs”的节点内容如下:


&iomuxc_snvs {

    pinctrl-names = 'default_snvs';

    pinctrl-0 = <&pinctrl_hog_2>;

    imx6ul-evk {

......

        /*省略掉其他*/


        /*enet1 reset zuozhongkai*/

        pinctrl_enet1_reset: enet1resetgrp {

            fsl,pins = <

                /* used for enet1 reset */

                MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0

            >;

        };

        

        /*enet2 reset zuozhongkai*/

        pinctrl_enet2_reset: enet2resetgrp {

            fsl,pins = <

                /* used for enet2 reset */

                MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0

            >;

        };

    };

};

第 1 行:imx6ull-kodo-emmc.dts 文件中 iomuxc_snvs 节点。

第 9~14 行:ENET1 网络复位引脚配置信息。

第 17~22 行:ENET2 网络复位引脚配置信息。


最后还需要修改一下 ENET1 和 ENET2 的网络时钟引脚配置,继续在 imx6ull-kodo-emmc.dts 中找到如下所示代码:


pinctrl_enet1: enet1grp {

    fsl,pins = <

        MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0

        MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0

        MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0

        MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0

        MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0

        MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0

        MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0

       MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009

    >;

};


pinctrl_enet2: enet2grp {

    fsl,pins = <

        MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0

        MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0

        MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0

        MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0

        MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0

        MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0

        MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0

        MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0

        MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0

        MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009

    >;

};

第 10 和 25 行:分别为 ENET1 和 ENET2 的网络时钟引脚配置信息,将这两个引脚的电气属性值改为 0x4001b009,原来默认值为 0x4001b031。


修改完成以后保存一下 imx6ull-kodo-emmc.dts,网络复位以及时钟引脚驱动就修改好了。


②、修改 fec1 和 fec2 节点的 pinctrl-0 属性

在 imx6ull-kodo-emmc.dts 文件中找到名为“fec1”和“fec2”的这两个节点,修改其中的“pinctrl-0”属性值,修改以后如下所示:


&fec1 {

    pinctrl-names = 'default';

    pinctrl-0 = <&pinctrl_enet1

                 &pinctrl_enet1_reset>;

    phy-mode = 'rmii';

......

    status = 'okay';

};


&fec2 {

    pinctrl-names = 'default';

    pinctrl-0 = <&pinctrl_enet2

                 &pinctrl_enet2_reset>;

    phy-mode = 'rmii';

......

};

第 3~4 行:修改后的 fec1 节点“pinctrl-0”属性值。

第 12~13 行:修改后的 fec2 节点“pinctrl-0”属性值。


③、修改 LAN8720A 的 PHY 地址

在 uboot 移植时, ENET1 的 LAN8720A 地址为 0x0,ENET2 的 LAN8720A

地址为 0x1。在 imx6ull-kodo-emmc.dts 中找到如下代码:


&fec1 {

    pinctrl-names = 'default';

......

    phy-handle = <ðphy0>;

    status = 'okay';

};


&fec2 {

    pinctrl-names = 'default';

......

    phy-handle = <ðphy1>;

    status = 'okay';


    mdio {

        #address-cells = <1>;

        #size-cells = <0>;


        ethphy0: ethernet-phy@0 {

            compatible = 'ethernet-phy-ieee802.3-c22';

            reg = <2>;

        };


        ethphy1: ethernet-phy@1 {

            compatible = 'ethernet-phy-ieee802.3-c22';

            reg = <1>;

        };

    };

};

第 1~6 行:ENET1 对应的设备树节点。

第 8~28 行:ENET2 对应的设备树节点。但是第 14~26 行的 mdio 节点描述了 ENET1 和 ENET2 的 PHY 地址信息。将代码改为如下内容:


&fec1 {

    pinctrl-names = 'default';

    pinctrl-0 = <&pinctrl_enet1

                 &pinctrl_enet1_reset>;

    phy-mode = 'rmii';

    phy-handle = <ðphy0>;

    phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;

    phy-reset-duration = <200>;

    status = 'okay';

};


&fec2 {

    pinctrl-names = 'default';

[1] [2]
关键字:Linux  内核移植 引用地址:【IMX6ULL学习笔记】九、Linux内核移植

上一篇:【IMX6ULL学习笔记】十、Linux字符设备驱动
下一篇:【IMX6ULL学习笔记】八、Linux启动流程

推荐阅读最新更新时间:2026-03-20 10:35

STM32MP157 Linux系统移植开发篇12:Linux内核MIPI LCD驱动移植
本文章为《STM32MP157 Linux系统移植开发篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。针对FS-MP1A开发板,除了Linux系统移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、FreeRTOS系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器
[单片机]
linux内核移植到S5pv210
make s5pv210_defconfig 1.System Type --- (0) S3C UART to use for low-level messages 2.Kernel hacking --- Kernel low-level debugging functions (0) S3C UART to use for low-level debug 3.移植nand驱动 4.Device Drivers --- * Memory Technology Device (MTD) support ---    * Direct char device access to MTD devices   -*- C
[单片机]
Linux移植内核启动过程引导阶段分析
在Linux移植之make uImage编译过程分析中已经提到了uImage是一个压缩的包并且内含压缩程序,可以进行自解压。自解压完成之后内核代码从物理地址为0x30008000处开始运行。下面分析在进入C之前内核做的一些工作,以下是内核启动过程中打印出来的信息,其中Uncompressing Linux就是在自解压代码。make uImage编译的最后也给出了链接脚本arch/arm/kernel/vmlinux.lds,以及链接的顺序arch/arm/kernel/head.o 是第一个。 分析arch/arm/kernel/vmlinux.lds可以知道程序入口的地址是stext,并且是.text.head段 277
[单片机]
<font color='red'>Linux</font><font color='red'>移植</font>之<font color='red'>内核</font>启动过程引导阶段分析
基于tiny4412的Linux内核移植 ---- 調試方法
平臺 Linux-4.4.4 uboot使用的是友善自帶的(爲了支持uImage和設備樹做了稍許修改) 概述 這篇博客主要用於匯總一下調試方法。 正文 1. dnw下載 目前我將uboot燒寫到SD卡中,然後使用dnw將kernel、根文件系統以及設備樹鏡像下載到內存中,爲了提高效率,可以使用下面的方法: 在uboot中添加環境變量: setenv dnw_up 'dnw 0x40600000; dnw 0x41000000; dnw 0x42000000; bootm 0x40600000 0x41000000 0x42000000' 進入uboot終端後,執行如下命令: run d
[单片机]
基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 摘要 上一篇 博文在tiny4412上移植了MMA7660驱动程序,使用的是exynos4
[单片机]
基于tiny4412的<font color='red'>Linux</font><font color='red'>内核</font><font color='red'>移植</font> -- MMA7660驱动<font color='red'>移植</font>(九-2)
linux2.6.18内核S3C2410平台移植笔记
我使用的实验箱是Embest EDUKIT-III,板上资源CPU:SAMSUNG S3C2410A、FLASH:K9F5608U0(Samsung NAND 32MiB),烧录工具:embest flash programmer。因为厂家自带的是2.4的内核,目前学习开发用的基本上都是2.6内核,这两者改动还是比较大的。电话咨询过技术支持后,对方说只想在板子上跑系统的话还是比较好移植的。于是决心自己动手移植内核。不然今后的驱动编写,都没有合适的运行环境,影响进度。所以工欲善其事,必先 利其器,前期的这些准备还是很有必要的。那几天刚好ubuntu10.10发布,满怀期待的我升完级后,结果悲剧了,中文显示变得发虚模糊,主题颜色也极度
[单片机]
linux内核移植之一 linux-4.1.4的zImage生成(Makefile分析)
一 编译过程 仍然以2410的编译说明,执行如下步骤 (1)主Makefile修改变量如下 ARCH := arm CROSS_COMPILE := arm-linux- (2)make s3c2410_defconfig (3)make zImage 最终生成用于uboot启动的内核应该是uImage,uImage是zImage通过uboot的mkimage工具加上一个文件头生成的,这里只分析到zImage。 二 make s3c2410_defconfig分析 主Makefile下有如下定义: %config: scripts_basic outputmakefile FORCE $(Q)$(MAKE) $(build
[单片机]
mini2440 u-boot linux 内核启动,移植较新(Linux3.19)内核至mini2440开发板(一)
s3c24xx-nand s3c2440-nand: Tacls=1, 9ns Twrph0=3 29ns, Twrph1=2 19ns s3c24xx-nand s3c2440-nand: NAND soft ECC nand: device found, Manufacturer ID: 0xec, Chip ID: 0xda nand: Samsung NAND 256MiB 3,3V 8-bit nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64 Creating 5 MTD partitions on nand : 0x000000
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved