精华内容
下载资源
问答
  • linux内核移植步骤
    2021-05-10 18:04:16

    嵌入式linux内核移植步骤,五份文档之一

    手把手教你移植linux内核---------OK6410(四)

    OK6410--DM9000网卡驱动移植:

    在linux的内核中已经带有了DM9000的网卡驱动,所以网卡驱动我们不需要再去写或者移植了,只需要添加一个平台信息就可以。

    首先在linux-3.3.5/arch/arm/mach-s3c64xx/mach-ok6410.c里面添加都文件#include

    在linux-3.3.5/arch/arm/mach-s3c64xx/mach-ok6410.c里面添加dm9000的平台信息:

    [cpp]

    1. #define S3C64XX_PA_DM9000 (0x18000000)

    2. #define S3C64XX_SZ_DM9000 SZ_1M

    3. static struct resource ok6410_dm9000_resources[] = {

    4. [0] = {

    5. .start= S3C64XX_PA_DM9000,

    6. .end= S3C64XX_PA_DM9000 + 3,

    7. .flags= IORESOURCE_MEM,

    8. },

    9. [1] = {

    10. .start= S3C64XX_PA_DM9000 + 4,

    11. .end= S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,

    12. .flags= IORESOURCE_MEM,

    13. },

    14. [2] = {

    15. .start= IRQ_EINT(7),

    16. .end= IRQ_EINT(7),

    17. .flags= IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,

    18. },

    19. };

    20.

    21. static struct dm9000_plat_data ok6410_dm9000_platdata = {

    22. .flags= DM9000_PLATF_16BITONLY,

    23. .dev_addr= { 0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 },

    24. };

    25.

    26. static struct platform_device ok6410_device_dm9000 = {

    27. .name= "dm9000",

    28. .id= 0,

    29. .num_resources= ARRAY_SIZE(ok6410_dm9000_resources),

    30. .resource= ok6410_dm9000_resources,

    31. .dev= {

    32. .platform_data = &ok6410_dm9000_platdata,

    33. }

    34. };

    更多相关内容
  • linux内核移植步骤

    2021-01-06 05:10:49
    1.解压内核源码  tar -jxvf linux-xxx.tar.bz2  或者  tar -zxvf linux-xxxx.tar.gz 2.清除之前的配置 clean – 清大部分生成的文件, 但是保留配置文件, 以及可以保证足够编译模块的信息。 mrproper – 清所有...
  • linux内核版本 3.14 资料包: 1、将linux-3.14.tar.xz拷贝到ubuntu中下解压并进入Linux-3.14 tar xvf linux-3.14.tar.xz cd linux-3.14 接着修改内核顶层目录下的Makefile vim Makefile 导入默认配置 ...

    环境:ubuntu20.04

    开发板:fs4412

    linux内核版本 3.14

    资料包:

    Linux内核移植,u-boot引导程序,跟文件系统-嵌入式文档类资源-CSDN下载Linux内核移植,u-boot引导程序,跟文件系统更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/daizhichaoaa/84056813

    1、将linux-3.14.tar.xz拷贝到ubuntu中下解压并进入Linux-3.14

    tar  xvf  linux-3.14.tar.xz
    cd  linux-3.14
    

    接着修改内核顶层目录下的Makefile

    vim Makefile

    导入默认配置

    make  exynos_defconfig
    

     配置内核

    make  menuconfig

    注:如果出现问题,先执行安装命令,另外终端窗口也要调大点,不然显示不出也会报错

    sudo apt-get install libncurses5-dev
    

    然后看到

     

    退出,接着编译内核,可能会出现如果编译过程中提示缺少mkimage工具,需将前天编译的uboot源码中的tools/mkimage拷贝到ubuntu/usr/bin目录下

    cp  u-boot-2013.01/tools/mkimage  /usr/bin
    make  uImage

    修改设备树文件生成设备树文件,以参考板origen的设备数文件为参考

    cp arch/arm/boot/dts/exynos4412-origen.dts  arch/arm/boot/dts/exynos4412-fs4412.dts

    添加新文件需修改Makefile才能编译

     vim arch/arm/boot/dts/Makefile

    然后编译树文件

    make dtbs

    拷贝内核和设备树文件到/tftpboot目录下

    cp  arm/arm/boot/uImage  ~/tftpboot
    
    cp  arch/arm/boot/dts/exynos4412-fs4412.dtb  ~/tftpboot/

     修改uboot启动参数(参考tftp那篇文章)

    sudo /etc/init.d/network-manager stop //暂时关闭网络,保留ip
    tftp 41000000 uImage
    tftp 42000000 exynos4412-fs4412.dtb
    pri  //先查看botargs是否已经配置好(ip)
    bootm 41000000 - 42000000

    重启板子查看实验现象

    报错原因:fs4412使用的设备树和origen的不同,网卡设备不同

    展开全文
  • Linux内核移植

    2021-08-03 07:25:40
    文章目录一、创建VSCode工程二、NXP官方开发板linux内核编译1.修改顶层Makefile2.配置并编译linux内核3.linux内核启动测试4.根文件系统缺失错误三、在linux中添加自己的开发板1.添加开发板默认配置文件2.添加开发板...

    一、创建VSCode工程

    NXP 官方原版 Linux 源码已经放到了开发板光盘中,路径为:1、例程源码->4、NXP 官方原版Uboot和Linux->linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2为了和 NXP 官方的名字区分,可 以 使 用 “ mv ” 命 令 对 其 重 命 名 , 我 这 里 将 其 重 命 名 为 “ linux-imx-rel_imx_4.1.15_2.1.0_ga_luatao”,命令如下:

    mv linux-imx-rel_imx_4.1.15_2.1.0_ga linux-imx-rel_imx_4.1.15_2.1.0_ga_luatao
    

    在这里插入图片描述
    拷贝.vscode/settings.json 这个文件到工程。
    在这里插入图片描述
    用vscode打开
    在这里插入图片描述
    NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的,所以我们肯定是以 I.MX6ULL EVK 开发板为参考,然后将 Linux 内核移植到 I.MX6U-ALPHA 开发板上的。

    二、NXP官方开发板linux内核编译

    1.修改顶层Makefile

    修改顶层 Makefile,直接在顶层 Makefile 文件里面定义 ARCH 和 CROSS_COMPILE 这两个的变量值为 arm 和 arm-linux-gnueabihf-,结果如图所示:
    在这里插入图片描述

    2.配置并编译linux内核

    和 uboot 一样,在编译 Linux 内核之前要先配置 Linux 内核。每个板子都有其对应的默认配置文件,这 些默认配置文件保存 在 arch/arm/configs 目录中。 imx_v7_defconfig 和imx_v7_mfg_defconfig 都可作为 I.MX6ULL EVK 开发板所使用的默认配置文件。但是这里建议使用 imx_v7_mfg_defconfig 这个默认配置文件,首先此配置文件默认支持 I.MX6UL 这款芯片,而且重要的一点就是此文件编译出来的 zImage 可以通过 NXP 官方提供的 MfgTool 工具烧写!!imx_v7_mfg_defconfig 中的“mfg”的意思就是 MfgTool。

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

    在这里插入图片描述

    make -j4
    

    编译时间测试19:45–19:58大概十三分钟左右
    在这里插入图片描述
    Linux 内核编译完成以后会在 arch/arm/boot 目录下生成 zImage 镜像文件,如果使用设备树的话还会在 arch/arm/boot/dts 目录下开发板对应的.dtb(设备树)文件,比如 imx6ull-14x14-evk.dtb就是 NXP 官方的 I.MX6ULL EVK 开发板对应的设备树文件。至此我们得到两个文件:

    ①、Linux 内核镜像文件:zImage。
    ②、NXP 官方 I.MX6ULL EVK 开发板对应的设备树文件:imx6ull-14x14-evk.dtb。

    3.linux内核启动测试

    我们编译好linux内核之后,需要测试一下。
    在测试之前确保 uboot 中的环境变量 bootargs 内容如下:

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

    在这里插入图片描述
    将上一小节编译出来的 zImage 和 imx6ull-14x14-evk.dtb 复制到 Ubuntu 中的 tftp 目录下,因为我们要在 uboot 中使用 tftp 命令将其下载到开发板中,

    cp arch/arm/boot/zImage ../../../tftpboot/ 
    cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb ../../../tftpboot/
    

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

    tftp 80800000 zImage
    tftp 83000000 imx6ull-14x14-evk.dtb
    

    在这里插入图片描述
    启动运行

    bootz 80800000 - 83000000
    

    在这里插入图片描述
    此时 Linux 内核已经启动了,如果 EMMC 中的根文件系统存在,我们就可以进入到 Linux 系统里面使用命令进行操作如图
    在这里插入图片描述

    4.根文件系统缺失错误

    Linux 内核启动以后是需要根文件系统的,根文件系统存在哪里是由 uboot 的 bootargs 环境变 量 指 定 , bootargs 会 传 递 给 Linux 内 核 作 为 命 令 行 参 数 。
    root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2 中,也就是 EMMC 的分区 2中。这是因为正点原子的 EMMC 版本开发板出厂的时候已经 EMMC 的分区 2 中烧写好了根文件系统,所以设置 root=/dev/mmcblk1p2。

    如果我们没有根文件系统,启动之后会报错

    Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

    就是提示内核崩溃,因为 VFS(虚拟文件系统)不能挂载根文件系统,因为根文件系统目录不存在。

    三、在linux中添加自己的开发板

    所以我们就参考 I.MX6ULL EVK 开发板的设置,在 Linux 内核中添加正点原子的 I.MX6U-ALPHA 开发板。

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

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

    cd arch/arm/configs
    cp imx_v7_mfg_defconfig imx_luatao_emmc_defconfig
    

    在这里插入图片描述
    以后就可以使用如下命令来配置正点原子 EMMC 版开发板对应的 Linux 内核了:

    make imx_luatao_emmc_defconfig
    

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

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

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

    在这里插入图片描述
    .dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件。

    imx6ull-alientek-emmc.dts创 建 好 以 后 我 们 还 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 “ dtb-$(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“imx6ull-luatao-emmc.dtb” ,如下所示:

    在这里插入图片描述
    这样编译 Linux 的时候就可以从 imx6ull-alientek-emmc.dts 编译出 imx6ull-alientek-emmc.dtb 文件了

    3.编译测试

    接 下 接 编 译 测 试 一 下 , 我 们 可 以 创 建 一 个 编 译 脚 本 ,
    imx6ull_luatao_emmc.sh,脚本内容如下:

    #!/bin/sh
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_luatao_emmc_defconfig
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j4
    

    在这里插入图片描述
    执行 shell 脚本 imx6ull_luatao_emmc.sh 编译 Linux 内核
    执行时间测试20:23-20:37 大概14分钟
    在这里插入图片描述
    编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录下生成 imx6ull-luatao-emmc.dtb 文件。将这两个文件拷贝到 tftp 目录下,
    在这里插入图片描述
    然后重启开发板,在uboot 命令模式中使用 tftp 命令下载这两个文件并启动,命令如下:

    tftp 80800000 zImage
    tftp 83000000 imx6ull-luatao-emmc.dtb
    bootz 80800000 - 83000000
    

    在这里插入图片描述
    Linux 内核启动成功,说明我们已经在 NXP 提供的 Linux 内核源码中添加了正点原子MX6UL-ALPHA 开发板

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

    设置从网络启动linux内核和设备树

    setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
    setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-luatao-emmc.dtb; bootz 80800000 - 83000000'
    saveenv
    

    1.CPU主频修改

    正点原子 I.MX6U-ALPHA 开发板所使用的 I.MX6ULL 芯片主频都是 792MHz 的,也就是NXP 官方宣传的 800MHz 版本。

    1.设置 I.MX6U-ALPHA 开发板工作在 792MHz

    确保 EMMC 中的根文件系统可用!然后重新启动开发板,进入终端(可以输入命令)输入如下命令查看 cpu 信息:

    cat /proc/cpuinfo
    

    在这里插入图片描述
    中有 BogoMIPS 这一条,此时 BogoMIPS 为 12.00,BogoMIPS 是 Linux 系统中衡量处理器运行速度的一个“尺子”,处理器性能越强,主频越高,BogoMIPS 值就越大。BogoMIPS 只是粗略的计算 CPU 性能,并不十分准确。但是我们可以通过 BogoMIPS 值来大致的判断当前处理器的性能。

    上图中并没有看到当前 CPU 的工作频率,那我们就转变另一种方法查看当前 CPU 的工作频率。进入到目录/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 在各频率下的运行时间以及变频次数。

    使用如下命令查看当前 CPU 频率:

    cat cpuinfo_cur_freq
    

    在这里插入图片描述
    其他的值如下:

    scaling_available_frequencies = 198000 396000 528000 792000
    cat scaling_governor = Performance

    在这里插入图片描述
    Performance 最高性能,直接用最高频率,不考虑耗电模式。

    查看 stats 目录下的 time_in_state 文件可以看到 CPU 在各频率下的工作时间,命令如下:

    cat /sys/bus/cpu/devices/cpu0/cpufreq/stats/time_in_state
    

    在这里插入图片描述
    假如我们想让 CPU 一直工作在 792MHz 那该怎么办?很简单,配置 Linux 内核,将调频策略选择为 performance。或者修改imx_luatao_emmc_defconfig 文件,
    在这里插入图片描述
    我们再来看一下如何通过图形化界面配置 Linux 内核的 CPU 调频策略,输入“make menuconfig”打开 Linux 内核的图形化配置界面,
    在这里插入图片描述

    进入如下路径:
    CPU Power Management
    -> CPU Frequency scaling
    -> Default CPUFreq governor
    打开默认调频策略选择界面,选择“performance”

    在这里插入图片描述
    选择以后退出图形化配置界面,然后编译 Linux内核,一定不要清理工程!否则的话我们刚刚的设置就会被清理掉。编译完成以后使用新的zImage 重启 Linux,查看当前 CPU 的工作频率和调频策略。

    但是在以后的实际产品开发中,从省电的角度考虑,建议大家使用 ondemand 模式,一来可以省电,二来可以减少发热。

    2.超频至 700MHz

    放弃,不推荐

    2.使能8线EMMC驱动

    正点原子 EMMC 版本核心板上的 EMMC 采用的 8 位数据线,
    在这里插入图片描述
    Linux 内核驱动里面 EMMC 默认是 4 线模式的,4 线模式肯定没有 8 线模式的速度快,所以本节我们将 EMMC 的驱动修改为 8 线模式。修改方法很简单,直接修改设备树即可,打开文件 imx6ull-luatao-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";
     };
    

    修改完成以后保存一下 imx6ull-luatao-emmc.dts,然后使用命令“make dtbs”重新编译一下设备树,编译完成以后使用新的设备树重启 Linux 系统即可。

    3.修改网络驱动

    因为在后面学习 Linux 驱动开发的时候要用到网络调试驱动,所以必须要把网络驱动调试好。在讲解 uboot 移植的时候就已经说过了,正点原子开发板的网络和 NXP 官方的网络硬件上不同,网络 PHY 芯片由 KSZ8081 换为了 LAN8720A,两个网络 PHY 芯片的复位 IO 也不同。所以 Linux 内核自带的网络驱动是驱动不起来 I.MX6U-ALPHA 开发板上的网络的,需要做修改。

    1.修改 LAN8720 的复位以及网络时钟

    ENET1 复位引脚 ENET1_RST 连接在 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。ENET2的复位引脚 ENET2_RST 连接在 I.MX6ULL 的 SNVS_TAMPER8 上。打开设备树文件 imx6ull-luatao-emmc.dts,找到如下代码:

    在这里插入图片描述
    第 588 和 589 行就是初始化 SNVS_TAMPER7 和 SNVS_TAMPER8 这两个引脚的,不过看样子好像是作为了 SPI4 的 IO,这不是我们想要的,所以将 588 和 589 这两行删除掉!删除掉以后继续在 imx6ull-alientek-emmc.dts 中找到如下所示代码:
    在这里插入图片描述
    第 129 行,设置 GPIO5_IO08 为 SPI4 的一个功能引脚(我也不清楚具体作为什么功能用),而 GPIO5_IO08 就是 SNVS_TAMPER8 的 GPIO 功能引脚。第 133 行,设置 GPIO5_IO07 作为 SPI4 的片选引脚,而 GPIO5_IO07 就是 SNVS_TAMPER7的 GPIO 功能引脚。

    现在我们需要 GPIO5_IO07 和 GPIO5_IO08 分别作为 ENET1 和 ENET2 的复位引脚,而不是 SPI4 的什么功能引脚,因此将示例代码 37.4.3.2 中的第 129 行和第 133 行处的代码删除掉!!否则会干扰到网络复位脚!

    在这里插入图片描述
    在 imx6ull-luatao-emmc.dts 里面找到名为“iomuxc_snvs”的节点(就是直接搜索),然后在此节点下添加网络复位引脚信息,添加完成以后的“iomuxc_snvs”的节点内容如下
    在这里插入图片描述
    最后还需要修改一下 ENET1 和 ENET2 的网络时钟引脚配置,继续在 imx6ull-luatao-emmc.dts 中找到如下所示代码:
    在这里插入图片描述
    在这里插入图片描述
    修改完成以后记得保存一下 imx6ull-luatao-emmc.dts,网络复位以及时钟引脚驱动就修改好了。

    2.修改 fec1 和 和 fec2 节点的 pinctrl-0 属性

    在 imx6ull-luatao-emmc.dts 文件中找到名为“fec1”和“fec2”的这两个节点,修改其中的“pinctrl-0”属性值,修改以后如下所示
    在这里插入图片描述
    在这里插入图片描述

    3.修改 LAN8720A 的 的 PHY 地址

    在 uboot 移植章节中,我们说过 ENET1 的 LAN8720A 地址为 0x0,ENET2 的 LAN8720A地址为 0x1。在 imx6ull-luatao-emmc.dts 中找到如下代码:
    在这里插入图片描述
    在这里插入图片描述

    phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <200>;
    
    	phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
    	phy-reset-duration = <200>;
    

    在这里插入图片描述
    在这里插入图片描述
    第 177 和 178 行,添加了 ENET1 网络复位引脚所使用的 IO 为 GPIO5_IO07,低电平有效。复位低电平信号持续时间为 200ms
    第 188 和 189 行,ENET2 网络复位引脚所使用的 IO 为 GPIO5_IO08,同样低电平有效,持续时间同样为 200ms。第 198 和 204 行,“smsc,disable-energy-detect”表明 PHY 芯片是 SMSC 公司的,这样 Linux内核就会找到 SMSC 公司的 PHY 芯片驱动来驱动 LAN8720A。
    第 196 行,注意“ethernet-phy@”后面的数字是 PHY 的地址,ENET1 的 PHY 地址为 0,所以“@”后面是 0(默认为 2)。第 199 行,reg 的值也表示 PHY 地址,ENET1 的 PHY 地址为 0,所以 reg=0。至此,LAN8720A 的 PHY 地址就改好了,保存一下 imx6ull-luatao-emmc.dts 文件。然后
    使用“make dtbs”命令重新编译一下设备树。

    4.修改 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);
    fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
    

    在这里插入图片描述
    第 3455~3462 就是新加入的代码,如果要在 I.MX6ULL 上使用LAN8720A 就需要设置ENET1 和 ENET2 的 TX_CLK 引脚复位寄存器的 SION 位为 1。

    5.配置 Linux 内核,使能 LAN8720

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

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

    在这里插入图片描述

    6.修改 smsc.c

    在 Linux 中也需要对 LAN8720A 进行一次软复位。
    首先需要找到 LAN8720A 的驱动文件,LAN8720A 的驱动文件是 drivers/net/phy/smsc.c,在此文件中有个叫做 smsc_phy_reset 的函数,看名字都知道这是 SMSC PHY 的复位函数,因此,LAN8720A 肯定也会使用到这个复位函数,修改此函数的内容,修改以后的 smsc_phy_reset函数内容如下所示

    1 static int smsc_phy_reset(struct phy_device *phydev)
    2 {
    3 int err, phy_reset;
    4 int msec = 1;
    5 struct device_node *np;
    6 int timeout = 50000;
    7 if(phydev->addr == 0) /* FEC1 */ {
    8 np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@
    02188000");
    9 if(np == NULL) {
    10 return -EINVAL;
    11 }
    12 }
    13
    14 if(phydev->addr == 1) /* FEC2 */ {
    15 np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@
    020b4000");
    16 if(np == NULL) {
    17 return -EINVAL;
    18 }
    19 }
    20
    21 err = of_property_read_u32(np, "phy-reset-duration", &msec);
    22 /* A sane reset duration should not be longer than 1s */
    23 if (!err && msec > 1000)
    24 msec = 1;
    25 phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
    26 if (!gpio_is_valid(phy_reset))
    27 return;
    28
    29 gpio_direction_output(phy_reset, 0);
    30 gpio_set_value(phy_reset, 0);
    31 msleep(msec);
    32 gpio_set_value(phy_reset, 1);
    33
    34 int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);
    35 if (rc < 0)
    36 return rc;
    37
    38 /* If the SMSC PHY is in power down mode, then set it
    39 * in all capable mode before using it.
    40 */
    41 if ((rc & MII_LAN83C185_MODE_MASK) ==
    MII_LAN83C185_MODE_POWERDOWN) {
    42
    43 /* set "all capable" mode and reset the phy */
    44 rc |= MII_LAN83C185_MODE_ALL;
    45 phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);
    46 }
    47
    48 phy_write(phydev, MII_BMCR, BMCR_RESET);
    49 /* wait end of reset (max 500 ms) */
    50
    51 do {
    52 udelay(10);
    53 if (timeout-- == 0)
    54 return -1;
    55 rc = phy_read(phydev, MII_BMCR);
    56 } while (rc & BMCR_RESET);
    57 return 0;
    58 }
    

    第 7~12 行,获取 FEC1 网卡对应的设备节点。
    第 14~19 行,获取 FEC2 网卡对应的设备节点。
    第 21 行,从设备树中获取“phy-reset-duration”属性信息,也就是复位时间。
    第 25 行,从设备树中获取“phy-reset-gpios”属性信息,也就是复位 IO。
    第 29~32 行,设置 PHY 的复位 IO,复位 LAN8720A。
    第 41~48 行,以前的 smsc_phy_reset 函数会判断 LAN8720 是否处于 Powerdown 模式,只有处于 Powerdown 模式的时候才会软复位 LAN8720。这里我们将软复位代码移出来,这样每次调用smsc_phy_reset 函数 LAN8720A 都会被软复位。

    最后我们还需要在 drivers/net/phy/smsc.c 文件中添加两个头文件,因为修改后的smsc_phy_reset 函数用到了 gpio_direction_output 和 gpio_set_value 这两个函数,需要添加的头文件如下所示:

    #include <linux/of_gpio.h>
    #include <linux/io.h>
    

    在这里插入图片描述

    7.网络驱动测试

    修改好设备树和 Linux 内核以后重新编译一下,得到新的 zImage 镜像文件和 imx6ull-luatao-emmc.dtb 设备树文件,使用网线将 I.MX6U-ALPHA 开发板的两个网口与路由器或者电脑连接起来,最后使用新的文件启动 Linux 内核。启动以后使用“ifconfig”命令查看一下当前活动的网卡有哪些,结果如图所示
    在这里插入图片描述
    可以看出,ping 成功,说明网络驱动修改成功!我们在后面的构建根文件系统和 Linux 驱动开发中就可以使用网络调试代码啦。

    4.保存修改后的图像化配置文件

    在修改网络驱动的时候我们通过图形界面使能了 LAN8720A 的驱动,使能以后会在.config中存在如下代码:

    CONFIG_SMSC_PHY=y
    

    当 CONFIG_SMSC_PHY=y 的时候就会编译 smsc.c 这个文件,smsc.c 就是 LAN8720A 的驱动文件。但是当我们执行“make clean”清理工程以后.config 文件就会被删除掉,因此我们所有的配置内容都会丢失,结果就是前功尽弃,一“删”回到解放前!

    所以我们在配置完图形界面以后经过测试没有问题,就必须要保存一下配置文件。保存配置的方法有两个。

    1.直接另存为.config

    既然图形化界面配置后的配置项保存在.config 中,那么就简单粗暴,直接将.config 文件另存为 imx_luatao_emmc_defconfig,然后其复制到 arch/arm/configs 目录下,替换以前的imx_luatao_emmc_defconfig。这样以后执行“make imx_luatao_emmc_defconfig”重新配置Linux 内核的时候就会使用新的配置文件,默认就会使能 LAN8720A 的驱动。

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

    相比于第 1 种直接另存为.config 文件,第 2 种方法就很“文雅”
    在图形界面中保存配置文件,在图形界面中会有“< Save >”选项
    在这里插入图片描述
    通过键盘的“→”键,移动到“< Save >”选项,然后按下回车键,打开文件名输入对话框,
    在这里插入图片描述
    在图中输入要保存的文件名,可以带路径,一般是相对路径(相对于 Linux 内核源码根目录)。比如我们要将新的配置文件保存到目录arch/arm/configs 下,文件名为imx_luatao_emmc_defconfig,也就是用新的配置文件替换掉老的默认配置文件。那么我们在图中输入“arch/arm/configs/imx_luatao_emmc_defconfig”即可,

    设置好文件名以后选择下方的“< Ok >”按钮,保存文件并退出。

    总结移植步骤

    ①、在 Linux 内核中查找可以参考的板子,一般都是半导体厂商自己做的开发板。
    ②、编译出参考板子对应的 zImage 和.dtb 文件。
    ③、使用参考板子的 zImage 文件和.dtb 文件在我们所使用的板子上启动 Linux 内核,看能否启动。
    ④、如果能启动的话就万事大吉,如果不能启动那就悲剧了,需要调试 Linux 内核。不过一般都会参考半导体官方的开发板设计自己的硬件,所以大部分情况下都会启动起来。启动Linux 内核用到的外设不多,一般就 DRAM(Uboot 都初始化好的)和串口。作为终端使用的串口一般都会参考半导体厂商的 Demo 板。
    ⑤、修改相应的驱动,像 NAND Flash、EMMC、SD 卡等驱动官方的 Linux 内核都是已经提供好了,基本不会出问题。重点是网络驱动,因为 Linux 驱动开发一般都要通过网络调试代码,所以一定要确保网络驱动工作正常。如果是处理器内部 MAC+外部 PHY 这种网络方案的话,一般网络驱动都很好处理,因为在 Linux 内核中是有外部 PHY 通用驱动的。只要设置好复位引脚、PHY 地址信息基本上都可以驱动起来。
    ⑥、Linux 内核启动以后需要根文件系统,如果没有根文件系统的话肯定会崩溃,所以确定 Linux内核移植成功以后就要开始根文件系统的构建。

    展开全文
  • 如何将自己的linux板卡信息添加到linux内核呢? 本章,我也是通过修改第三方半导体厂商开发板提供的 Linux BSP 包移植到我们自己的平台上。我选择的是nxp厂商官方的evk开发板,使用他们官方的内核修改为自己板卡的...

    如何将自己的linux板卡信息添加到linux内核呢?

    本章,我也是通过修改第三方半导体厂商开发板提供的 Linux BSP 包移植到我们自己的平台上。我选择的是nxp厂商官方的evk开发板,使用他们官方的内核修改为自己板卡的内核。

    添加开发板默认配置文件

    在编译linux内核之前,也要像编译uboot一样,需要先用配置文件设置好参数,这里我选择复制imx_v7_mfg_defconfig文件,因为通过这个文件配置出来的内核可以使用nxp提供的一个mfgtool工具进行烧录下载,非常方便。
    将 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 , 命 名 为imx_myboard_emmc_defconfig
    在这里插入图片描述
    之后就可以通过命令:make imx_myboard_emmc_defconfig来配置我们自己板卡对应的linux内核了。

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

    进入目录 arch/arm/boot/dts 中,复制一份 imx6ull-14x14-evk.dts,然后将其重命名为 imx6ull-myboard-emmc.dts
    在这里插入图片描述

    dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件。imx6ull-myboard-emmc.dts创 建 好 以 后 我 们 还 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 “ dtb-$(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“imx6ull-myboard-emmc.dtb”
    在这里插入图片描述
    这样编译 Linux 的时候就可以从 imx6ull-myboard_emmc.dts 编译出 imx6ull-alientek-emmc.dtb 文件了。

    编译测试

    接 下 接 编 译 测 试 一 下 , 我 们 可 以 创 建 一 个 编 译 脚 本 ,imx6ull_myboard_emmc.sh:
    在这里插入图片描述
    四个步骤分别为:清理工程、配置linux内核、图形化配置linux内核、编译。
    编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录下生成 imx6ull-myboard-emmc.dtb 文件。这两个就是我们需要烧录进开发板的linux镜像以及设备树文件了。

    移植Linux内核的基本步骤

    关于 Linux 内核的移植就讲解到这里,简单总结一下移植步骤:
    ①、在 Linux 内核中查找可以参考的板子,一般都是半导体厂商自己做的开发板。
    ②、编译出参考板子对应的 zImage 和.dtb 文件。
    ③、使用参考板子的 zImage 文件和.dtb 文件在我们所使用的板子上启动 Linux 内核,看能否启动。
    ④、如果能启动的话就万事大吉,如果不能启动那就悲剧了,需要调试 Linux 内核。不过一般都会参考半导体官方的开发板设计自己的硬件,所以大部分情况下都会启动起来。启动Linux 内核用到的外设不多,一般就 DRAM(Uboot 都初始化好的)和串口。作为终端使用的串口一般都会参考半导体厂商的 Demo 板。
    ⑤、修改相应的驱动,像 NAND Flash、 EMMC、 SD 卡等驱动官方的 Linux 内核都是已经提供好了,基本不会出问题。重点是网络驱动,因为 Linux 驱动开发一般都要通过网络调试代码,所以一定要确保网络驱动工作正常。如果是处理器内部 MAC+外部 PHY 这种网络方案的话,一般网络驱动都很好处理,因为在 Linux 内核中是有外部 PHY 通用驱动的。只要设置好复位引脚、 PHY 地址信息基本上都可以驱动起来。
    ⑥、 Linux 内核启动以后需要根文件系统

    展开全文
  • 嵌入式linux内核裁剪与移植步骤教程

    千次阅读 2020-12-29 07:56:04
    嵌入式linux内核裁剪与移植步骤教程1 嵌入式linux操作系统Linux为嵌入操作系统提供了一个极有吸引力的选择,它是个和Unix相似、以核心为基础、全内存保护、多任务、多进程的操作系统。可以支持广泛的计算机硬件,...
  • Linux 内核移植步骤

    2018-08-03 15:20:42
    Vi Makefile 修改arch, ... 移植linux内核, 首先需要一个基本的配置(哪些模块有, 哪些功能有) 怎么得到基本配置 : arch/arm/configs 目录下有很多arm 处理器的默认配置 Make exynos_defconfig 等同于 ...
  • Linux内核移植 获取源码和修改Makefile 先从NXP获取官方源码,添加到自定义的目录下,然后解压 tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 修改顶层Makefile,也就是内核根目录下的Makefile。给ARCH和...
  • linux内核启动流程分析及移植步骤(需要Mindjet MindManager软件打开)
  • <Linux开发>系统移植 -之- linux内核移植过程详细记录(第一部分) 本章主要讲解linux内核和设备树的移植。硬件环境则是正点原子Linux开发板。 本系列讲解过程,及作者实操过程,均参考正点原子Linux开发指南。 ....
  • Linux系统移植|内核移植

    千次阅读 2021-10-26 16:44:56
    内核移植
  • s3c2440A linux内核移植步骤 s3c2440A linux内核移植步骤 s3c2440A linux内核移植步骤 s3c2440A linux内核移植步骤 s3c2440A linux内核移植步骤

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,656
精华内容 10,262
关键字:

linux内核移植步骤