I.MX6U嵌入式Linux驱动——系统移植之Linux 内核

正点原子开发板Linux内核移植

顶层Makefile控制着Linux内核的编译流程。Linux内核获取:https://www.kernel.org

1、Linux内核编译

注意:这里时编译移植好的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 就是设备树文件。

2、顶层Makefile详解

此过程与uboot类似,后面有时间了再分析再写。

3、Linux 内核启动流程

此过程与uboot类似,但是比uboot要复杂的多,后面有时间了再分析再写。

4、Linux内核移植

4.1、NXP官方开发板Linux内核编译

4.1.1、修改顶层 Makefile

打开顶层Makefile文件,定义ARCH 和 CROSS_COMPILE 这两个变量值

ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-

4.1.2、配置并编译 Linux 内核

默认配置文件保存在 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)。

4.1.3、Linux 内核启动测试

将编译得到的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

4.2、在 Linux 中添加自己的开发板

4.2.1、添加开发板默认配置文件

将 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”这一行,将其屏蔽掉.。

4.2.2、添加开发板对应的设备树文件

进入目录 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

4.2.3、 编译测试

创建一个编译脚本,文件名字为: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

4.3、CPU 主频修改

确保 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

4.3、修改 EMMC 驱动

4.3.1、使能 8 线 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;
741 			status = "okay";
742 		};

4.3.2、关闭 EMMC 1.8V 供电选项

防止内核在运行的时候用 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 		};

4.4、修改网络驱动

4.4.1、修改 LAN8720 的复位以及网络时钟引脚驱动

打开设备树文件imx6ull-alientek-emmc.dts

pinctrl_spi4: spi4grp {
...
}
spi4{
...
}
删除 GPIO5_IO08、GPIO5_IO07相关的代码

找到“iomuxc_snvs”的节点,在此节点下添加网络ENET1、ENET2复位引脚信息,
找到 pinctrl_enet1: enet1grp ,ENET1 和 ENET2 的网络时钟引脚配置。

4.4.2、修改 fec1 和 fec2 节点的 pinctrl-0 属性

找到“fec1”和“fec2”这两个节点,修改其中的“pinctrl-0”属性值。

4.4.3、修改 LAN8720A 的 PHY 地址

在"fec2"中修改。

4.4.4、修改 fec_main.c 文件

要 在 I.MX6ULL 上使用 LAN8720A , 需 要 修 改 一 下 Linux 内 核 源 码 , 打 开
drivers/net/ethernet/freescale/fec_main.c,找到函数 fec_probe。

4.4.5、配置 Linux 内核,使能 LAN8720 驱动

输入命令“make menuconfig”,打开图形化配置界面,选择使能 LAN8720A 的驱动。

4.4.6、修改 smsc.c 文件

是在 uboot 中需要对LAN8720A 进行一次软复位,要设置 LAN8720A 的 BMCR(寄存器地址为 0)寄存器 bit15 为 1。因此,在 Linux 中也需要对 LAN8720A 进行一次软复位。
LAN8720A 的驱动文件是 drivers/net/phy/smsc.c,在此文件中有个叫做 smsc_phy_reset 的函数。

4.4.7、网络驱动测试

启动以后使用“ifconfig”命令查看一下当前活动的网卡有哪些?

/ # ifconfig -a       //查看当前活动的网卡
/ # ifconfig eth0 up  //打开eth0这个网卡
/ # ping 主机IP
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值