一、在 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 内核启动成功:
二、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';
上一篇:【IMX6ULL学习笔记】十、Linux字符设备驱动
下一篇:【IMX6ULL学习笔记】八、Linux启动流程
推荐阅读最新更新时间:2026-03-20 10:35
- 使用 ON Semiconductor 的 FAN2518S 的参考设计
- LTC1530S8、3.3V/3A 稳压器
- 使用 ON Semiconductor 的 ADP3167 的参考设计
- 使用 Analog Devices 的 LT3420EDD 的参考设计
- 基于Kinetis® M的低成本单相电表参考设计
- LTC3708、具有上升/下降轨跟踪功能的 2.5V/15A 和 1.2V/15A 稳压器
- NXQ1TXH5插件板
- 应变仪仪表放大器
- WRL-13287,基于 ESP8266 802.11 无线局域网的 SparkFun Wi-Fi Shield
- 4.1W、3-LED 通用 LED 照明驱动器




Linux技术手册
【2025 DigiKey创意大赛】 学伴智盒 - 代码
智能机械臂
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号