linux|移植nxp官方linux内核到imx6ull开发板(4.1.15)(代码片段)

Mculover666 Mculover666     2023-01-29     820

关键词:

一、NXP官方linux内核

1. 下载

NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc

这里为了保持版本统一,使用正点原子资料包中提供的原厂linuxlinux-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

内核启动成功。

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        0x70a1
                             MX6ULL_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>;
		;
	;

接着将复位引脚加入到 pinctrl_enet1 的代码中:

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	0x4001b031
		MX6UL_PAD_SNVS_TAMPER7__GOIO5_IO07	0x10B0
	>;
;

接着将复位引脚加入到 pinctrl_enet2 的代码中:

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	0x4001b031
		MX6UL_PAD_SNVS_TAMPER8__GOIO5_IO08	0x10B0
	>;
;

接着搜索fec,添加网络驱动复位引脚使用,添加后的代码如下:

&fec1 
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1>;
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <200>;
	status = "okay";
;

&fec2 
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <200>;
	status = "okay";

	mdio 
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@2 
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <2>;
		;

		ethphy1: ethernet-phy@1 
			compatible = "ethernet-phy-ieee802.3-c22";
			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主机测试:

至此,网络驱动修改成功。

正点原子i.mx6u-mini移植篇kernel移植过程详解(代码片段)

...、下载Linux内核这里使用NXP官方提供的Linux源码,将其移植到正点原子I.MX6U-MINI开发板上。NXP官方原版Liux源码路径为:1、例程源码->4、NXP官方原版Uboot和Linux->linux-imx-rel_imx4.1.15_2.1.0_ga.tar.bz2。在ubunut中的/home/zhiguoxin/linu... 查看详情

移植linux内核到i.mx6ull过程(代码片段)

...;星标公众号,不错过精彩内容转自|Mculover666本文描述移植NXP官方linux5.4内核到i.MX6ULL开发板。一、NXP官方linux内核1.下载NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。选择该分支下载zip包即可,... 查看详情

移植linux内核到i.mx6ull过程(代码片段)

...;星标公众号,不错过精彩内容转自|Mculover666本文描述移植NXP官方linux5.4内核到i.MX6ULL开发板。一、NXP官方linux内核1.下载NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。选择该分支下载zip包即可,... 查看详情

uboot|移植nxp官方uboot到imx6ull开发板(2016.03)(代码片段)

一、NXP官方uboot1.下载NXP官方uboot仓库地址为:https://github.com/Freescale/u-boot-fslc。这里为了保持版本统一,使用正点原子资料包中提供的原厂linux:uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2(版本是2016.03)。2.编译设置 查看详情

linux内核移植

...#xff0c;本章我们就来学习一下如何将NXP官方提供的Linux内核移植到正点原子的I.MX6U-ALPHA开发板上。通过本章的学习,我们将掌握如何将半导体厂商提供的LinuxBSP包移植到我们自己的平台上。 查看详情

uboot|移植nxp官方uboot到imx6ull开发板(2016.03)(代码片段)

一、NXP官方uboot1.下载NXP官方uboot仓库地址为:https://github.com/Freescale/u-boot-fslc。这里为了保持版本统一,使用正点原子资料包中提供的原厂linux:uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2(版本是2016.03)。2.编译设置临时... 查看详情

linux系统移植:nxp官板uboot移植(代码片段)

文章目录Linux系统移植:NXP官板uboot移植一、获取官板U-Boot二、编译下载U-Boot源码三、官方驱动验证Linux系统移植:NXP官板uboot移植移植NXP的IMX6ULL官板U-Boot到原子的开发板一、获取官板U-Boot去NXP官网下载评估板的U-Boot,... 查看详情

linux系统移植:内核获取和编译(代码片段)

文章目录Linux系统移植:内核获取和编译一、获取Linux内核二、Linux内核编译Linux系统移植:内核获取和编译一、获取Linux内核Linux由Linux基金会管理与发布,Linux官网为https://www.kernel.org,选取合适的版本来使用就行... 查看详情

stm32mp157系统移植|移植st官方5.10内核到小熊派开发板(代码片段)

Linux内核移植流程移植Linux内核到一个新的板子上时,需要以下步骤:(1)选择一个硬件设计接近的板子,基于此板相关文件开始移植(2)拷贝单板配置文件(arch/arm/configs)(3)拷贝设... 查看详情

stm32mp157系统移植|移植st官方5.10内核到小熊派开发板(代码片段)

Linux内核移植流程移植Linux内核到一个新的板子上时,需要以下步骤:(1)选择一个硬件设计接近的板子,基于此板相关文件开始移植(2)拷贝单板配置文件(arch/arm/configs)(3)拷贝设... 查看详情

正点原子i.mx6u-mini移植篇kernel移植过程详解(代码片段)

...eInsight工程这里我们使用NXP官方提供的Linux源码,将其移植到正点原子I.MX6U-ALPHA开发板上。NXP官方原版Liux源码已经放到了开发板光盘中,路径为:1、例程源码->4、NXP官方原版Uboot和Linux->linux-imx-relimx4.1.15_2.1.0_ga.tar.... 查看详情

linux内核移植初探(代码片段)

内核移植的梯度:初级:根据芯片公司的参考配置,编译开发板内核并了解执行过程中极:添加内核驱动的方式方法高级:修改或添加BSP包linux内核特性:可移植性强、支持的硬件平台广泛;超强的网络功能;多任务多用户系统... 查看详情

arm(imx6u)裸机官方sdk移植(代码片段)

参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译作者:一只青木呀发布时间:2020-08-1111:20:17网址:https://blog.csdn.net/weixin_45309916/article/details/107930284目录1、I.MX6ULL官方SDK包简介2、 查看详情

imx6ull学习笔记(11)——获取和编译官方sdk(代码片段)

一、简介SDK(SoftwareDevelopmentKit)是NXP针对其官方评估板的软件开发包,可以在NXP的官网下载得到。SDK中包含了固件库和各种程序范例。这个SDK包提供了Windows和Linux两种版本,分别针对主机系统是Windows和Linux。二、... 查看详情

imx6ull学习笔记(11)——获取和编译官方sdk(代码片段)

一、简介SDK(SoftwareDevelopmentKit)是NXP针对其官方评估板的软件开发包,可以在NXP的官网下载得到。SDK中包含了固件库和各种程序范例。这个SDK包提供了Windows和Linux两种版本,分别针对主机系统是Windows和Linux。二、... 查看详情

linux基于imx6ull移植buildroot(代码片段)

文章目录1.Buildroot简介2.获取buildroot源码3.编译环境配置4.通过buildroot编译imx6ull5.修改默认配置适配imx6ullbootloader6.修改默认配置适配imx6ullkernel8.编译烧录验证1.Buildroot简介Buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Bui... 查看详情

虹软人脸识别——官方qtdemo移植到linux(代码片段)

...开Linux版本的SDK里面没有发现Demo,于是想着把Windows的Demo移植到Linux。这篇文章记录了移植的过程,Linux用的是Ubuntu20.04(使用虚拟机VMwareWorkstation15Player) 查看详情

linux内核移植入门(代码片段)

...的设备节点4.测试图参考资料基本概念linux内核特性:1.可移植性,支持的硬件平台广泛2.超强的网络功能3.多任务多用户系统4.模块化的设计五大子系统:1.进程管理子系统2.内存管理子系统3.文件系统子系统4.网络协议子系统5.设备管... 查看详情