根据原厂linux内核进行移植

1.修改顶层makefile

接在顶层 Makefile 文件里面定义 ARCH 和 CROSS_COMPILE 这两个的变量值为 arm 和 arm-linux-gnueabihf-

ARCH ?= arm
CROSS_COMPILE  ?= arm-linux-gnueabihf-
2.配置并编译 Linux 内核

和 uboot 一样,在编译 Linux 内核之前要先配置 Linux 内核。每个板子都有其对应的默认
配置文件,这 些默认配置文件保存 在 arch/arm/configs 目录中,选择合适的xxx_defconfig文件。
执行如下命令配置 Linux 内核:

make clean  #第一次编译 Linux 内核之前先清理一下
make imx_v7_mfg_defconfig #配置 Linux 内核

编译linux内核:

make

Linux 内核编译完成以后会在 arch/arm/boot 目录下生成 zImage 镜像文件,如果使用设备树的话还会在 arch/arm/boot/dts 目录下开发板对应的.dtb(设备树)文件,比如 imx6ull-14x14-evk.dtb就是 NXP 官方的 I.MX6ULL EVK 开发板对应的设备树文件。

3.Linux自启动测试

设置uboot 中的环境变量 bootargs 内容如下:

console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

复制zImage和dtb文件到 Ubuntu 中的 tftp 目录下,因为我们要在 uboot 中使用 tftp 命令将其下载到开发板中,拷贝命令如下:

cp arch/arm/boot/zImage 你的tftp目录 -f
cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb 你的tftp目录 -f

拷贝完成以后就可以测试了,启动开发板,进入 uboot 命令行模式,然后输入如下命令将zImage 和 imx6ull-14x14-evk.dtb 下载到开发板中并启动:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 – 83000000
4.添加默认配置文件

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

cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig
5.添加开发板对应的设备树文件

进入目录 arch/arm/boot/dts 中,复制一份 imx6ull-14x14-evk.dts,然后将其重命名为 imx6ull-alientek-emmc.dts,命令如下:

cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts

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

dtb-$(CONFIG_SOC_IMX6ULL) += \
	imx6ull-14x14-ddr3-arm2.dtb \
	imx6ull-14x14-ddr3-arm2-adc.dtb \
	...
	imx6ull-alientek-emmc.dtb \	#自己的dtb文件
6.编译测试
make clean  #第一次编译 Linux 内核之前先清理一下
make imx_v7_mfg_defconfig #配置 Linux 内核
make

下载到开发板上,现象与原厂linux启动现象一样即可。

7.CPU主频和网络修改

7.1 CPU主频修改
假如我们想让 CPU 一直工作在 528MHz 那该怎么办?很简单,配置 Linux 内核,将调频策略选择为 performance。或者修改 imx_alientek_emmc_defconfig 文件如下:

#CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_INTERACTIVE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y

第 41 行,配置 ondemand 为默认调频策略。
第 42 行,使能 powersave 策略。
第 43 行,使能 userspace 策略。
第 44 行,使能 interactive 策略。
学习的时候为了高性能,大家可以使用 performance 模式。但是在以后的实际产品开发中,从省电的角度考虑

建议使用 ondemand 模式

一来可以省电,二来可以减少发热。
7.2 使能 8 线 线 EMMC
直接修改设备树即可,打开文件 imx6ull-alientek-emmc.dts,修改如下:

&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";
};

7.3 修改网络驱动
7.3.1 修改 LAN8720 复位引脚驱动
ENET1 复位引脚 ENET1_RST 连接在 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。ENET2的复位引脚 ENET2_RST 连接在 I.MX6ULL 的 SNVS_TAMPER8 上。打开设备树文件 imx6ull-alientek-emmc.dts,先将使用了这两个引脚的pin删除,还要删除这个pin复用为gpio时的语句。将 ENET1 的复位 IO 初始化配置添加到 pinctrl_enet1 中,将 ENET2 的复位 IO 初始化配置添加到 pinctrl_enet2 中。

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_TX_CLK__ENET1_REF_CLK1 0x4001b031
		MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0	#ENET1 RESET 
	>;
};
	
pinctrl_enet2: enet2grp {
	fsl,pins = <
		MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0
		MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0
		...
		MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b031
		MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0	#ENET2 RESET
	>;
};

7.3.2 修改 LAN8720A 的 的 PHY地址
在 uboot 移植章节中,我们说过 ENET1 的 LAN8720A 地址为 0x0,ENET2 的 LAN8720A
地址为 0x1。打开imx6ull-alientek-emmc.dts,在ethphy0子节点和ethphy1子节点对应修改。存一下 imx6ull-alientek-emmc.dts 文件。然后使用“make dtbs”命令重新编译一下设备树。
7.3.3 修改 fec_main.c 文件
要 在 I.MX6ULL 上 使 用 LAN8720A , 需 要 修 改 一 下 Linux 内 核 源 码 , 打 开
drivers/net/ethernet/freescale/fec_main.c,找到函数 fec_probe,在 fec_probe 中加入如下代码:

/* 设置 MX6UL_PAD_ENET1_TX_CLK 和 MX6UL_PAD_ENET2_TX_CLK
* 这两个 IO 的复用寄存器的 SION 位为 1。
*/
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);

7.3.4 配置 Linux 内核,使能 LAN8720 驱动
输入命令“make menuconfig”,打开图形化配置界面,选择使能 LAN8720A 的驱动,路径
如下:

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

选择将“Drivers for SMSC PHYs”编译到 Linux 内核中,因此“<>”里面变为了“*”。LAN8720A 是 SMSC 公司出品的,因此勾选这个以后就会编译 LAN8720 驱动,配置好以后退出配置界面,然后重新编译一下 Linux 内核。
7.3.5 网络驱动测试
修改好设备树和 Linux 内核以后重新编译一下,得到新的 zImage 镜像文件和 imx6ull-alientek-emmc.dtb 设备树文件,使用网线将 I.MX6U-ALPHA 开发板的两个网口与路由器或者电脑连接起来,最后使用新的文件启动 Linux 内核。分别在两个网口插网线使用ping命令测试是否能通。

8.通过图形界面保存配置文件

图形界面中会有“< Save >”选项,然后按下回车键,打开文件名输入对话框,输入要保存的文件名,可以带路径,一般是相对路径(相对于 Linux 内核源码根目录)。比如我们要将新的配置文件保存到目录 arch/arm/configs 下,文件名为imx_alientek_emmc_defconfig,也就是用新的配置文件替换掉老的默认配置文件。

Linux 内核启动以后需要根文件系统,如果没有根文件系统的话肯定会崩溃,所以确定 Linux内核移植成功以后就要开始根文件系统的构建。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值