顶层Makefile控制着Linux内核的编译流程。Linux内核获取:https://www.kernel.org
注意:这里时编译移植好的Linux源码。
sudo apt-get install lzop //在 ubuntu 上安装 lzop 库
tar -vxjf linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2 //解压压缩包
新建一个shell脚本,用来编译Linux源码。
//mx6ull_alientek_emmc.sh 文件内容
1 #!/bin/sh
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
运行脚本:
chmod 777 mx6ull_alientek_emmc.sh
./mx6ull_alientek_emmc.sh
编译过后会在 arch/arm/boot 这个目录下生成一个叫做 zImage 的文件;
在 arch/arm/boot/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件。
此过程与uboot类似,后面有时间了再分析再写。
此过程与uboot类似,但是比uboot要复杂的多,后面有时间了再分析再写。
打开顶层Makefile文件,定义ARCH 和 CROSS_COMPILE 这两个变量值
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-
默认配置文件保存在 arch/arm/configs 目录中。在这里使用 imx_v7_mfg_defconfig 这个默认配置文件。原因:第一,支持 I.MX6UL 这款芯片;第二:编译出来的 zImage 可以通过 NXP 官方提供的 MfgTool 工具烧写。
进入Ubuntu终端中:
make clean //第一次编译 Linux 内核之前先清理一下
make imx_v7_mfg_defconfig //配置 Linux 内核
make -j16 //编译 Linux 内核
至此我们得到两个文件:
①、Linux 内核镜像文件:zImage(arch/arm/boot)。
②、NXP官方I.MX6ULL EVK 开发板对应的设备树文件:imx6ull-14x14-evk.dtb(arch/arm/boot/dts)。
将编译得到的zImage和.dtb文件复制到Ubuntu中的tftp目录下:
cp arch/arm/boot/zImage /home/yang/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/yang/linux/tftpboot/ -f
启动开发板,进入uboot命令模式
=> tftp 80800000 zImage
=> tftp 83000000 imx6ull-14x14-evk.dtb
=> bootz 80800000 - 83000000
将 arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 ,命 名 为
imx_alientek_emmc_defconfig。
cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig
打开 imx_alientek_emmc_defconfig 文件,找到“CONFIG_ARCH_MULTI_V6=y”这一行,将其屏蔽掉.。
进入目录 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
修改Makefile文件,添加“imx6ull-alientek-emmc.dtb”
400 dtb-$(CONFIG_SOC_IMX6ULL) += \
401 imx6ull-14x14-ddr3-arm2.dtb \
...
imx6ull-alientek-emmc.dtb
创建一个编译脚本,文件名字为:imx6ull_alientek_emmc.sh
//imx6ull_alientek_emmc.sh 编译脚本
1 #!/bin/sh
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
chmod 777 imx6ull_alientek_emmc.sh //给予可执行权限
./imx6ull_alientek_emmc.sh //执行 shell 脚本编译内核
将编译得到的zImage和.dtb文件复制到Ubuntu中的tftp目录下,启动开发板,进入uboot命令模式,
=> tftp 80800000 zImage
=> tftp 83000000 imx6ull-alientek-emmc.dtb
=> bootz 80800000 - 83000000
确保 EMMC 中的根文件系统可用!然后重新启动开发板,进入终端(可以输入命令)
/ # cat /proc/cpuinfo //查看 cpu 信息
/sys/bus/cpu/devices/cpu0/cpufreq # ls
/sys/bus/cpu/devices/cpu0/cpufreq # cat cpuinfo_cur_freq //查看 cpu 信息
/sys/bus/cpu/devices/cpu0/cpufreq/stats # cat time_in_state //查看CPU在各频率下的工作时间
(1)可以修改 imx_alientek_emmc_defconfig 文件。
//修改调频策略
41 #CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y //默认调频策略,关闭
42 CONFIG_CPU_FREQ_GOV_POWERSAVE=y //使能 powersave 策略。
43 CONFIG_CPU_FREQ_GOV_USERSPACE=y //使能 userspace 策略。
44 CONFIG_CPU_FREQ_GOV_INTERACTIVE=y //使能 interactive 策略。
45 CONFIG_CPU_FREQ_GOV_ONDEMAND=y //
/sys/bus/cpu/devices/cpu0/cpufreq # ls
/sys/bus/cpu/devices/cpu0/cpufreq # cat scaling_governor //查看 cpu 信息
performance
(2)可以图形化界面配置CPU 调频策略
CPU Power Management
-> CPU Frequency scaling
-> Default CPUFreq governor
直接修改设备树即可,
//imx6ull-alientek-emmc.dts 代码段
734 &usdhc2 {
735 pinctrl-names = "default", "state_100mhz", "state_200mhz";
736 pinctrl-0 = <&pinctrl_usdhc2_8bit>;
737 pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
738 pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
739 bus-width = <8>;
740 non-removable;
741 status = "okay";
742 };
防止内核在运行的时候用 1.8V 去驱动 EMMC,导致 EMMC 驱动出现问题。
//imx6ull-alientek-emmc.dts 代码段
734 &usdhc2 {
735 pinctrl-names = "default", "state_100mhz", "state_200mhz";
736 pinctrl-0 = <&pinctrl_usdhc2_8bit>;
737 pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
738 pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
739 bus-width = <8>;
740 non-removable;
no-1-8-v;
741 status = "okay";
742 };
打开设备树文件imx6ull-alientek-emmc.dts
pinctrl_spi4: spi4grp {
...
}
spi4{
...
}
删除 GPIO5_IO08、GPIO5_IO07相关的代码
找到“iomuxc_snvs”的节点,在此节点下添加网络ENET1、ENET2复位引脚信息,
找到 pinctrl_enet1: enet1grp ,ENET1 和 ENET2 的网络时钟引脚配置。
找到“fec1”和“fec2”这两个节点,修改其中的“pinctrl-0”属性值。
在"fec2"中修改。
要 在 I.MX6ULL 上使用 LAN8720A , 需 要 修 改 一 下 Linux 内 核 源 码 , 打 开
drivers/net/ethernet/freescale/fec_main.c,找到函数 fec_probe。
输入命令“make menuconfig”,打开图形化配置界面,选择使能 LAN8720A 的驱动。
是在 uboot 中需要对LAN8720A 进行一次软复位,要设置 LAN8720A 的 BMCR(寄存器地址为 0)寄存器 bit15 为 1。因此,在 Linux 中也需要对 LAN8720A 进行一次软复位。
LAN8720A 的驱动文件是 drivers/net/phy/smsc.c,在此文件中有个叫做 smsc_phy_reset 的函数。
启动以后使用“ifconfig”命令查看一下当前活动的网卡有哪些?
/ # ifconfig -a //查看当前活动的网卡
/ # ifconfig eth0 up //打开eth0这个网卡
/ # ping 主机IP