单片机
返回首页

Linux4.1.15内核移植-imx6ull

2025-02-27 来源:cnblogs

一、Linux内核编译

1、修改顶层Makefile


第252行修改:


ARCH ?= arm

CROSS_COMPLIE ?= arm-linux-gnueabihf-


2、配置并编译Linux内核


make clean

make imx_v7_mfg_defconfig

 


3、Linux内核启动测试

  1、确保以下变量配置

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

  2、将zImage和设备树文件拷贝到tftp服务器目录下

  3、下载内核与设备树文件到开发板中,并启动内核


tftp 80800000 zImage

tftp 83000000 imx6ull-14x14-evk.dtb

bootz 80800000 – 83000000

  4、前面环境变量root指定的是根文件系统


二、添加自己的开发板

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

    cd arch/arm/configs

    cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig

    然后就可以直接使用 make imx_alientek_emmc_defconfig来编译内核

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

    cd arch/arm/boot/dts

    cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts

    然后需要在arch/arm/boot/dts/Makefile中找到dtb-$(CONFIG_SOC_IMX6ULL),并在此配置中添加imx6ull-alientek-emmc.dtb

  3、编译测试

    编写imx6ull_alientek_emmc.sh脚本


#!/bin/sh

#清理

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

#使用默认配置imx_alientek_emmc_defconfig

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig

#打开图形配置界面

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

#编译Linux

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16


三、CPU主频和网络驱动修改

1、CPU主频修改

  cat /proc/cpuinfo #查看CPU信息

  其中BogoMIPS数值用来衡量处理器运行速度。


  目录/sys/bus/cpu/devices/cpu0/cpufreq下的部分文件记录了CPU频率信息:


cpuinfo_cur_freq:当前 cpu 工作频率,从 CPU 寄存器读取到的工作频率。

cpuinfo_max_freq:处理器所能运行的最高工作频率(单位: KHz)。

cpuinfo_min_freq :处理器所能运行的最低工作频率(单位: KHz)。

cpuinfo_transition_latency:处理器切换频率所需要的时间(单位:ns)。

scaling_available_frequencies:处理器支持的主频率列表(单位: KHz)。

scaling_available_governors:当前内核中支持的所有 governor(调频)类型。

scaling_cur_freq:保存着 cpufreq 模块缓存的当前 CPU 频率,不会对 CPU 硬件寄存器进行检查。

scaling_driver: 该文件保存当前 CPU 所使用的调频驱动。

scaling_governor: governor(调频)策略, Linux 内核一共有 5 中调频策略,

①、 Performance,最高性能,直接用最高频率,不考虑耗电。

②、 Interactive,一开始直接用最高频率,然后根据 CPU 负载慢慢降低。

③、 Powersave,省电模式,通常以最低频率运行,系统性能会受影响,一般不会用这个!

④、 Userspace,可以在用户空间手动调节频率。

⑤、 Ondemand,定时检查负载,然后根据负载来调节频率。负载低的时候降低 CPU 频率,这样省电,负载高的时候提高 CPU 频率,增加性能。

scaling_max_freq: governor(调频)可以调节的最高频率。

cpuinfo_min_freq: governor(调频)可以调节的最低频率。

stats 目录下给出了 CPU 各种运行频率的统计情况,比如 CPU 在各频率下的运行时间以及变频次数。    


  cat /sys/bus/cpu/devices/cpu0/cpufreq/stats/time_in_state #查看CPU在各频率下工作时间

  默认配置文件imx_alientek_emmc_defconfig中:


41 CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y #配置默认调频策略为ONDEMAND

42 CONFIG_CPU_FREQ_GOV_POWERSAVE=y

43 CONFIG_CPU_FREQ_GOV_USERSPACE=y

44 CONFIG_CPU_FREQ_GOV_INTERACTIVE=y

  屏蔽41行,并添加 CONFIG_CPU_FREQ_GOV_ONDEMAND=y

  在目录/sys/devices/system/cpu/cpu0/cpufreq/下查看文件cpuinfo_cur_freq、scaling_governor(当前调频策略)。


  超频至700MHz:只需修改设置树文件中cpu0信息,添加 792000 1225000

  编译设备树命令:

    make dtbs


  2、使能8线EMMC驱动

  Linux内核驱动默认EMMC是4线模式,将其修改为8线。修改设备树文件。


734 &usdhc2 {

735 pinctrl-names = 'default';

736 pinctrl-0 = <&pinctrl_usdhc2>;

737 non-removable;

738 status = 'okay';

739 };

将其修改为一下内容

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


  编译设备树命令:

    make dtbs


  3、修改网络驱动

  NXP官方开发板使用的是KSZ8081,正点原子使用的LAN8720,两款芯片的复位IO不同。需要修改网络驱动。

    1、修改LAN8720的复位引脚驱动

    屏蔽SPI4使用到的SNVS_TAMPER7和SNVS_TAMPER8管脚,也即GPIO5_IO07、GPIO5_IO08

    在ENET1和ENET2中添加两个管脚的配置

    2、修改LAN8720A的PHY地址

    修改&fec1、&fec2的内容,分别添加


    phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;/*网络复位引脚为GPIO5_IO07,低电平有效*/

    phy-reset-duration = <26>;/*复位低电平信号持续时间为26ms*/


    phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;/*网络复位引脚为GPIO5_IO08,低电平有效*/

    phy-reset-duration = <26>;/*复位低电平信号持续时间为26ms*/

    3、修改fec_main.c文件

    打 开drivers/net/ethernet/freescale/fec_main.c,找到函数 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);

复制代码

    设置了ENET1和ENET2的TX_CLK引脚复位寄存器的SION位为1。

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

    -> Device Drivers

      -> Network device support

        -> PHY Device support and infrastructure

          -> Drivers for SMSC PHYs

    5、修改smsc.c文件

     修改drivers/net/phy/smsc.c文件中的smsc_phy_reset函数。使得只要调用该函数就执行软复位。

  6、保存.config文件

    1、直接另存配置好的.config文件

    2、通过图形接面保存配置文件,可使用相对路径(相对Linux内核源码根目录),一般保存在arch/arm/configs/


  以上内容是基于《正点原子I.MX6U嵌入式Linux驱动开发指南V1.0》的第37章进行的摘要。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章