i.MX6ULL系统移植 | 移植NXP官方linux4.1.15内核
更新时间 | 更新内容 |
---|---|
2021-11-15 | 初稿完成 |
2022-07-28 | 更新网络驱动移植部分 |
一、NXP官方linux内核
1. 下载
NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc。
这里为了保持版本统一,使用正点原子资料包中提供的原厂linux:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
(版本是4.1.15)。
2. 编译
安装lzop库:
sudo apt-get install lzop
设置临时环境变量:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
清理构建:
make distclean
查看arch/arm/configs目录下imx6ull相关的单板:
mfg标识表示可以使用NXP的MfgTool工具烧写,所以使用imx_v7_mfg_defconfig
配置文件:
make imx_v7_mfg_defconfig
配置好之后编译:
make
编译成功后,进入arch/arm/boot
目录可以看到编译出的linux镜像,其中zImage是经过压缩后的镜像:
在dts目录下是编译出的设备树文件:
3. 下载到开发板
将内核镜像和设备树文件拷贝到tftp根目录中:
cp zImage ~/tftp_root/
cp dts/imx6ull-14x14-evk.dtb ~/tftp_root/
接下来在开发板上进入uboot,确保bootargs环境变量的值如下:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
加载这两个文件:
setenv bootargs 'bootargs=console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
启动内核:
bootz 80800000 - 83000000
4. 启动结果分析
因为EMMC中有出厂烧写的文件系统,所以Linux内核成功挂载了根文件系统,启动成功,但是也有一些问题:
- LCD屏幕无显示;
- 网卡eth0报错,但是可以获取到ip,可以ping通主机;
接下来,我们就基于NXP官方提供的linux,针对正点原子imx6ull开发板进行一些配置参数的修改,修复LCD和网络问题。
二、移植linux内核
1. 新建单板
(1)新建单板配置文件
进入 arch/arm/configs 目录,复制一份新的单板文件:
cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_atk_emmc_defconfig
(2)新建设备树文件
进入 arch/arm/boot/dts 目录,复制一份新的设备树文件:
cd arch/arm/boot/dts/
cp imx6ull-14x14-evk.dts imx6ull-atk-emmc.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-9x9-evk.dtb \imx6ull-atk-emmc.dtb \imx6ull-9x9-evk-btwifi.dtb \imx6ull-9x9-evk-ldo.dtb
(3)编译测试
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make clean
make imx_atk_emmc_defconfig
make
(4)烧写测试
编译完成后将zImage和设备树文件拷贝到tftp根目录,加载:
tftp 80800000 zImage
tftp 83000000 imx6ull-atk-emmc.dtb
bootz 80800000 - 83000000
内核启动成功:
但是启动后,没有挂载到根文件系统,宕机:
解决方法,uboot中bootargs环境变量出错,重新设置:
set bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
2. 修改网络驱动
(1)修改LAN8720A的复位引脚驱动
修改设备树文件arch/arm/boot/dts/imx6ull-atk-emmc.dts
,搜索 GPIO5_IO07、GPIO5_IO08,发现已被spi4使用,删除这两行后,代码如下:
pinctrl_spi4: spi4grp {fsl,pins = <MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1>;};
接着再找到spi4,删除与这两个GPIO相关的代码,删除后如下:
spi4 {compatible = "spi-gpio";pinctrl-names = "default";pinctrl-0 = <&pinctrl_spi4>;status = "okay";gpio-sck = <&gpio5 11 0>;gpio-mosi = <&gpio5 10 0>;num-chipselects = <1>;#address-cells = <1>;#size-cells = <0>;gpio_spi: gpio_spi@0 {compatible = "fairchild,74hc595";gpio-controller;#gpio-cells = <2>;reg = <0>;registers-number = <1>;registers-default = /bits/ 8 <0x57>;spi-max-frequency = <100000>;};};
SNVS引脚要分开设置pinctrl。
接着将fec1和fec2的复位引脚加入到 iomuxc_snvs 节点的代码中:
pinctrl_fec1_reset: fec1_resetgrp {fsl,pins = <MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x79>;
};pinctrl_fec2_reset: fec2_resetgrp {fsl,pins = <MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x79>;
};
接着搜索fec,添加网络驱动复位引脚使用,添加后的代码如下:
&fec1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_enet1 &pinctrl_fec1_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";pinctrl-0 = <&pinctrl_enet2 &pinctrl_fec2_reset>;phy-mode = "rmii";phy-handle = <ðphy1>;phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;phy-reset-duration = <200>;status = "okay";mdio {#address-cells = <1>;#size-cells = <0>;ethphy0: ethernet-phy@0 {compatible = "ethernet-phy-ieee802.3-c22";smsc,disable-energy-detect;reg = <0>;};ethphy1: ethernet-phy@1 {compatible = "ethernet-phy-ieee802.3-c22";smsc,disable-energy-detect;reg = <1>;};};
};
(2)修改LAN8720的PHY地址
修改设备树文件arch/arm/boot/dts/imx6ull-atk-emmc.dts
,搜索 fec,修改mdio节点中的值:
mdio {#address-cells = <1>;#size-cells = <0>;ethphy0: ethernet-phy@0 {compatible = "ethernet-phy-ieee802.3-c22";smsc,disable-energy-detect;reg = <0>;};ethphy1: ethernet-phy@1 {compatible = "ethernet-phy-ieee802.3-c22";smsc,disable-energy-detect;reg = <1>;};
};
至此,设备树修改完成。
(3)修改fec_main.c文件
修改drivers/net/ethernet/freescale/fec_main.c
文件,找到函数fec_probe,在函数开头添加如下代码:
void __iomem *IMX6U_ENET1_TX_CLK;
void __iomem *IMX6U_ENET2_TX_CLK;IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);
writel(0X14, IMX6U_ENET1_TX_CLK);IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);
writel(0X14, IMX6U_ENET2_TX_CLK);fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
(4)修改PHY驱动源码
修改drivers/net/phy/smsc.c
文件,添加两个头文件:
#include <linux/of_gpio.h>
#include <linux/io.h>
然后找到smsc_phy_reset
函数,修改之后如下:
static int smsc_phy_reset(struct phy_device *phydev)
{int err, phy_reset;int msec = 1;struct device_node *np;int timeout = 50000;if (phydev->addr == 0) {np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@02188000");} else if (phydev->addr = 1) {np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@020b4000");}if (!np) {return -EINVAL;}/* A sane reset duration should not be longer than 1s */err = of_property_read_u32(np, "phy-reset-duration", &msec);if (!err && msec > 1000)msec = 1;phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);if (!gpio_is_valid(phy_reset))return;gpio_direction_output(phy_reset, 0);gpio_set_value(phy_reset, 0);msleep(msec);gpio_set_value(phy_reset, 1);int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);if (rc < 0)return rc;/* If the SMSC PHY is in power down mode, then set it* in all capable mode before using it.*/if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) {/* set "all capable" mode and reset the phy */rc |= MII_LAN83C185_MODE_ALL;phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);}phy_write(phydev, MII_BMCR, BMCR_RESET);/* wait end of reset (max 500 ms) */do {udelay(10);if (timeout-- == 0)return -1;rc = phy_read(phydev, MII_BMCR);} while (rc & BMCR_RESET);return 0;
}
(5)配置Linux内核,使能LAN8720驱动
make imx_atk_emmc_defconfig
make menuconfig
报错:
fatal error: curses.h: No such file or directory
安装库来解决:
sudo apt-get install libncurses5-dev
使能Device Drivers\Network device support\ PHY Device support and infrastructure\Drivers for SMSC PHYs
:
保存到.config,然后退出。
(6)编译测试
重新编译内核,烧写内核和设备树,测试网络驱动。
ping主机测试:
至此,网络驱动修改成功。
(7)解决网络一直up/down的问题。
正常启动后,一直打印如下两行:
fec 20b4000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
经过正点原子论坛查找,找到问题解决方案(http://www.openedv.com/thread-310222-1-1.html)。
修改设备树``中的LCD节点内容如下:
pinctrl_lcdif_dat: lcdifdatgrp {fsl,pins = <MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x49MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x49MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x49MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x49MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x49MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x49MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x49MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x51MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x49MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x49MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x49MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x49MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x49MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x49MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x49MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x51MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x49MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x49MX6UL_PAD_LCD_DATA18__LCDIF_DATA18 0x49MX6UL_PAD_LCD_DATA19__LCDIF_DATA19 0x49MX6UL_PAD_LCD_DATA20__LCDIF_DATA20 0x49MX6UL_PAD_LCD_DATA21__LCDIF_DATA21 0x49MX6UL_PAD_LCD_DATA22__LCDIF_DATA22 0x49MX6UL_PAD_LCD_DATA23__LCDIF_DATA23 0x51>;};pinctrl_lcdif_ctrl: lcdifctrlgrp {fsl,pins = <MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x49MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x49MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x49MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x49>;};
重新编译烧写后,问题解决:
i.MX6ULL系统移植 | 移植NXP官方linux4.1.15内核相关推荐
- 【Linux系统移植】NXP 官方开发板 kernel内核 编译与烧录
1.下载 NXP 官方 I.MX6ULL EVK 开发板的kernel :linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 2.使用 FileZilla Client ...
- I.MX6开发板移植Linux4.1.15内核之TSC2007触摸屏设备树信息的添加
之前写过一篇3.0.35内核移植关于TSC2007触摸屏驱动移植的文章.里面对TSC2007.c驱动程序的分析比较清晰,点击链接查看:点击链接查看 本篇文章,主要记录在4.1.15内核移植的过程中,对 ...
- IMX6移植Linux4.1.15内核时需要添加矩阵按键的设备树信息
之前在Linux3.0.35内核移植过按键的信息,请点击链接查看:3.0.35内核移植 本篇文章记录在IMX6开发板移植4.1.15内核时,添加矩阵按键的设备树信息. 1.具体添加的设备树信息 下面是 ...
- LINUX系统开启故障排错及linux-4.16.8内核编译安装,虚拟机实验(非生产环境)...
Centos6启动 POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs -- ...
- i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0
目录 开发环境 设置交叉编译工具链 下载NXP官方维护的内核 使用官方配置编译 使用4.9.88版本的设备树 通过网络下载内核镜像以及设备树 使用之前写在emmc中的根文件系统 添加自己的板子 使用n ...
- i.MX6ULL移植NXP官方uboot2020.04_5.4.47_2.2.0
目录 开发环境 设置交叉编译工具链 下载nxp的uboot 移植uboot 编译uboot 烧写uboot镜像 建立自己的单板文件配置 解决适配问题 适配 lan8720a 网卡 查看公版原理图 查看 ...
- i.MX6ULL系统移植:uboot移植1 - 编译官方uboot
NXP官方uboot编译,主要参考<i.MX Porting Guide>文档.按文档中方法进行编译测试. 一.下载NXP 官方uboot uboot-imx-rel_imx_4.1.15 ...
- Uboot专题(一)—— 移植NXP官方Uboot(2016.03版本)
linux系列目录: linux系统移植篇(二)-- Uboot使用介绍 Uboot专题(一)-- 移植NXP官方Uboot(2016.03版本) 文章目录 一.编译NXP官方uboot 1.获取ub ...
- [I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A(对比原子和NXP官方测试板的网络芯片LAN8720A , KSZ8081 (也是飞凌)唯独复位引脚不同595芯片也涉及改动)
I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部MAC+外部 PHY 芯片的方案. I.MX6UL/ULL 有两个网络接 ...
最新文章
- android ndk怎样加载o文件_JNI初探之NDK 开发环境配置
- [Google API](5)筛选结果
- 一个算法同时解决两大CV任务,让目标检测和实例分割互相帮助,地平线实习生论文被AAAI 2020收录...
- Fastjson 1.2.66 版本发布,继续加固安全!
- CUDA tool URL
- 使用ado直接连接mysql_使用ADO直接连Mysql ,不经过ODBC
- boost::function_types::is_callable_builtin用法的测试程序
- AbstractListView源码分析6
- [转]java 组播
- 【51nod 1154】 回文串划分
- vue之vue-cookies
- 信用报告OCR服务 助力授信审核快人一步
- 淘宝天猫购物优惠券系统开发,java后端(ssm)+Android 原生APP,对接淘宝开放平台
- 战神引擎清理数据教程[保留跟不保留账号
- python+openCV滑动条的使用
- 重新定义团队 谷歌的自由精神对所有公司都适用
- 编程语言php加密与解密的方法
- eclipse java1.8_不同版本Eclipse对JDK版本要求
- ISP——Gamma Correction
- 关于pycharm的常见问题