Linux--内核移植(二)移植流程及驱动修改

本文来总结一下如何将 NXP 官方提供的 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板上。

一、官方开发板内核测试

NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的,所以我们肯定是以 I.MX6ULL EVK 开发板为参考,然后将 Linux 内核移植到 I.MX6U-ALPHA 开发板上的。

1.修改顶层Makefile

修改顶层 Makefile ,直接在顶层 Makefile 文件里面定义 ARCH CROSS_COMPILE 这两个的变量值为 arm 和 arm-linux-gnueabihf-。这样在编译的时候就不用输入很长的命令了

2.配置并编译官方内核

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
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、启动测试

将编译出来的zImage和imx6ull-14x14-evk.dtb复制到Ubuntu中的tftp目录下,之后会通过uboot 的tftp命令将其下载到开发板中。

在测试之前确保uboot中的环境变量bootargs内容如下(在UBOOT命令模式下使用print指令查看):

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

如果不是的话,可以使用如下指令设置一下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

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

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

可以看到内核启动了

4、根文件系统缺失的错误

Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由uboot的bootargs环境变量指定, bootargs会传递给Linux内核作为命令行参数 。 比如之前设置的root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2中,即EMMC的分区2中。

因为上一篇的测试时,EMMC的分区2中烧写好了根文件系统,所以设置root=/dev/mmcblk1p2,并且内核正常启动。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现什么问题?

这个问题是很常见的,我们在实际的工作中开发一个产品,这个产品的第一版硬件出来以后我们是没有对应的根文件系统可用的,必须要自己做根文件系统。

我们将uboot中的bootargs环境变量改为“console=ttymxc0,115200” ,也就是不填写root的内容了,命令如下:

setenv bootargs 'console=ttymxc0,115200' 
saveenv         

修改完成以后重新从网络启动,可以看到也是先启动了内核:

但启动以后会有类似如下的错误:

最后会有下面这一行:

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

提示内核崩溃,因为VFS(虚拟文件系统)不能挂载根文件系统,目录不存在。即使目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。这个就是根文件系统缺失导致的内核崩溃,但是内核是启动了的,只是根文件系统不存在而已。

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

在上一节中我们通过编译 NXP 官方 I.MX6ULL EVK 开发板对应的 Linux 内核,发现其可以在正点原子的 EMMC 版本开发板启动,所以我们就参考 I.MX6ULL EVK 开发板的设置,在 Linux 内核中添加正点原子的 I.MX6U-ALPHA 开发板。

1 参照官方配置文件添加开发板默认配置文件

arch/arm/configs目录下的imx_v7_mfg_defconfig重新复制一份 , 命名为自己开发板,如imx_myboard_defconfig

之后配置此开发板的内核命令就可以是:

make imx_myboard_defconfig

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

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

然后还需要修改文件arch/arm/boot/dts/Makefile,找到 dtb-$(CONFIG_SOC_IMX6ULL)配置项,在此配置项中加入“imx6ull-myboard.dtb” :

这样编译Linux的时候就可以从imx6ull-myboard.dts 编译出 imx6ull-myboard.dtb 文件了。

总结一下以上的修改主要包括:

主要就是对文件复制一份并重命名,(配置文件中可能还需修改,比如说屏蔽掉CONFIG_ARCH_MULTI_V6=y”这一行,这一行是V6架构的相关选项),还要修改Makefile文件,添加设备树配置。

三、编译测试

新建一个build_myboard.sh,写入如下内容:

#!/bin/sh 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_defconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
2 行,清理工程。
3 行,使用默认配置文件 来配置 Linux 内核。
4 行,打开 Linux 的图形配置界面,如果不需要每次都打开图形配置界面可以删除此行。
5 行,编译 Linux
执行 shell 脚本build_myboard.sh 编译 Linux 内核,命令如下:
chmod 777 build_myboard.sh //给予可执行权限
./build_myboard.sh //执行 shell 脚本编译内核
编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录
下生成 imx6ull-myboard.dtb 文件。将这两个文件拷贝到 tftp 目录下,然后重启开发板,在uboot 命令模式中使用 tftp 命令下载这两个文件并启动,命令如下:
tftp 80800000 zImage
tftp 83000000 imx6ull-myboard.dtb
bootz 80800000 83000000

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

修改驱动之前,要先保证板子能正常启动,所以表明根文件系统也要处理好,此时自己的根文件系统还没移植,所以在这先使用emmc中现成的根文件系统。

开始设置bootcmd、bootargs环境变量,bootcmd设置默认从网络启动

Setenv  bootcmd   'tftp 80800000 zImage;tftp 83000000 imx6ull-myboard.dtb ;bootz 80800000 – 83000000;'

setenv bootargs 'console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw'

在这里可能自己的emmc的驱动会有问题,需要先照着原板设备树节点修改自己的设备树。

一)EMMC驱动修改

1 、使能 8 线 EMMC 驱动

正点原子 EMMC 版本核心板上的 EMMC 采用的 8 位数据线,Linux 内核驱动里面 EMMC 默认是 4 线模式的,4 线模式肯定没有 8 线模式的速度快,所以我们将 EMMC 的驱动修改为 8 线模式。修改方法很简单,直接修改设备树即可,打开文件 imx6ull-myboard.dtb,把emmc设备节点更换成原厂的8bit的。

2 、关闭 EMMC 1.8V 供电选项
此时 EMMC 工作电压是 3.3V 的,因此我们要在emmc设备节点中添加“ no-1-8-v”选项,
也就是关闭 1.8V 这个功能选项。防止内核在
运行的时候用 1.8V 去驱动 EMMC ,导致 EMMC 驱动出现问题

二)CPU主频修改

设置 I.MX6U-ALPHA 开发板工作在 792MHz
可以在内核图形化界面配置, 进入如下路径:
CPU Power Management
-> CPU Frequency scaling
-> Default CPUFreq governor
选择“ performance”即可,选择以后退出图形化配置界面,然后编译 Linux内核,一定不要清理工程!否则的话我们刚刚的设置就会被清理掉。编译完成以后使用新的Image 重启 Linux,查看当前 CPU 的工作频率和调频策略。我们学习的时候为了高性能,大家可以使用 performance 模式。但是在以后的实际产品开发中,从省电的角度考虑,建议大家使用 ondemand 模式,一来可以省电,二来可以减少发热。

三)网络驱动修改

正点原子开发板的网络和 NXP 官方的网络硬件上 不同,网络 PHY 芯片由 KSZ8081 换为了 LAN8720A ,两个网络 PHY 芯片的复位 IO 也不同。
所以 Linux 内核自带的网络驱动是驱动不起来 I.MX6U-ALPHA 开发板上的网络的,需要做修改。
1 、修改 LAN8720 的复位以及网络时钟引脚驱动
2 、修改 设备树中 fec1 fec2 节点的 pinctrl-0 属性
3 、修改设备树中  LAN8720A PHY 地址
4、 修改 fec_main.c 文件
        要 在 I.MX6ULL 上使用 LAN8720A , 需 要 修 改 一 下 Linux 内 核 源 码
5、图形化 配置 Linux 内核,使能 LAN8720 驱动
6 、网络驱动测试
修改好设备树和 Linux 内核以后重新编译一下,得到新的 zImage 镜像文件和 设备树文件,使用网线将 I.MX6U-ALPHA 开发板的两个网口与路由器或者电脑连接起来,最后使用新的文件启动 Linux 内核。启动以后使用“ ifconfig ”命令查看一下当前活动的网卡有哪些。

资料来源:i.MX6ULL嵌入式Linux开发3-Kernel移植 - 知乎 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/568357.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DFS与回溯专题:路径总和问题

DFS与回溯专题:路径总和问题 一、路径总和 题目链接: 112.路径总和 题目描述 代码思路 对二叉树进行dfs搜索,递归计算每条路径的节点值之和,当某个节点的左右子节点都为空时,说明已经搜索完成某一条路径&#xff0…

中北大学软件学院操作系统实验二进程调度算法

实验时间 2024年 4 月13日14时至16时 学时数 2 1.实验名称 实验二进程调度算法 2.实验目的 (1)加深对进程的概念及进程调度算法的理解; (2)在了解和掌握进程调度算法的基础上,编制进程调度算法通用程序,将调试结果显示在计算机屏幕上&am…

Android Perfetto 监控应用启动耗时

Perfetto 是一个 Google 开发的用于安卓系统性能监控和调试的工具,它旨在提供实时数据收集和可视化功能,帮助我们分析和优化应用程序的性能表现。Perfetto 可以捕获系统事件、CPU、内存、网络、GPU 等性能指标数据,并将其记录为轻量级的 Trac…

BBS前后端混合项目--03

展示 static/bootstrp # bootstrap.min.css /*!* Bootstrap v3.4.1 (https://getbootstrap.com/)* Copyright 2011-2019 Twitter, Inc.* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*! normalize.css v3.0.3 | MIT License | github.com/n…

C语言学习/复习29--内存操作函数memcpy/memmove/memset/memcmp

一、内存操作函数 1.memcpy()函数 注意事项1:复制的数目以字节为单位 注意事项2:一定要保证有足够空间复制 模拟实现1 拷贝字符案例:由于拷贝时函数本事就以字节为单位拷贝所以该例子也可用于其他类型数据的拷贝。 模拟实现2 将自身的…

diffusion model 简单demo

参考自: Probabilistic Diffusion Model概率扩散模型理论与完整PyTorch代码详细解读 diffusion 简单demo 扩散模型之DDPM Diffusion model 原理剖析 张振虎-扩散概率模型 生成扩散模型漫谈(一):DDPM 拆楼 建楼 核心公式和逻辑 …

自适应STFT及其在地震时间行程自动拾取中的应用【附MATLAB代码】

文章来源:微信公众号:EW Frontie 摘要 在本文中,首先,我们提出的方法来产生高分辨率的短时傅里叶变换,通过计算最佳瞬时窗口长度。其次,利用生成的时频图提取瞬时走时属性,实现地震同相轴走时的…

vmstat命令详解

一、参数信息 vmstat 命令是用于报告虚拟内存统计信息的工具,常用于 Unix/Linux 系统上。它可以提供关于系统资源使用情况的详细信息,包括 CPU、内存、虚拟内存、磁盘、系统调用等方面的统计数据。以下是常见的 vmstat 命令参数的详解: vms…

k8s学习(三十六)centos下离线部署kubernetes1.30(单主节点)

文章目录 服务器准备工作一、升级操作系统内核1 查看操作系统和内核版本2 下载内核离线升级包3 升级内核4 确认内核版本 二、修改主机名/hosts文件1 修改主机名2 修改hosts文件 三、关闭防火墙四、关闭SELINUX配置五、时间同步1 下载NTP2 卸载3 安装4 配置4.1 主节点配置4.2 从…

2024商业地产五一劳动节健康大会朋克养生市集活动策划方案

2024商业地产五一劳动节健康大会朋克养生市集(带薪健康 快乐打工主题)活动策划方案 活动策划信息: 方案页码:53页 文件格式:PPT 方案简介: 打工不养生 赚钱养医生 期待已久的五一假期, …

WebSocket的原理、作用、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 WebSocket是什么WebSocket的原理WebSocket的作用全双工和半双工客户端【浏览器】API服务端 【Java】APIWebSocket的生命周期WebSocket的常见注解SpringBoot简单代码示例 WebSocket是什么 WebSocket是一种 通信协议 ,它在 客户端和服务器之间建立了一个双向…

开发环境中的调试视图(IDEA)

当程序员写完一个代码时必然要运行这个代码,但是一个没有异常的代码却未必满足我们的要求,因此就要求程序员对已经写好的代码进行调试操作。在之前,如果我们要看某一个程序是否满足我们的需求,一般情况下会对程序运行的结果进行打…

java泛型介绍

Java 泛型是 JDK 5 引入的一个特性,它允许我们在定义类、接口和方法时使用类型参数,从而使代码更加灵活和类型安全。泛型的主要目的是在编译期提供类型参数,让程序员能够在编译期间就捕获类型错误,而不是在运行时才发现。这样做提…

C语言学习/复习30--结构体的声明/初始化/typedef改名/内存对齐大小计算

一、自定义数据类型 二、结构体 1.结构体的定义(与数组相对比) 2.结构体全局/局部变量的定义 3.typedef对结构体改名 4.匿名结构体类型的声明 注意事项1: 匿名后必须立即创建结构体变量 、 5.结构体与链表节点定义 注意事项1&…

Python基础07-高级列表推导式和Lambda函数

在Python中,列表推导式和Lambda函数是处理数据的强大工具。本文将介绍如何使用嵌套列表推导式、带有条件的列表推导式、多可迭代对象的列表推导式、Lambda函数、在列表推导式中使用Lambda函数、用于展平嵌套列表的列表推导式、对元素应用函数、使用Lambda函数与Map和…

Arena-Hard:开源高质量大模型评估基准

开发一个安全、准确的大模型评估基准通常需要包含三个重要内容:1)稳定识别模型的能力;2)反映真实世界使用情况中的人类偏好;3)经常更新以避免过拟合或测试集泄漏。 但传统的基准测试通常是静态的或闭源的&…

程序员缓解工作压力小技巧

文章目录 1. 规划时间和任务2. 学会放松和调节情绪3. 培养兴趣爱好4. 保持健康的生活方式总结 当面对程序员这样需要高度精神集中和持续创新的工作时,缓解工作压力是至关重要的。下面分享一些我个人的经验和方法,希望能对大家有所帮助: 1. 规…

如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 - 第507篇

历史文章 AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇 日赚800,利用淘宝/闲鱼进行AI音乐售卖实操 - 第506篇 导读 在使用AI生成音乐(AI写歌)的时候,你是不是有这样的困惑: &…

线性模型算法

简介 本文章介绍机器学习中的线性模型有关内容,我将尽可能做到详细得介绍线性模型的所有相关内容 前置 什么是回归 回归的就是整合+预测 回归处理的问题可以预测: 预测房价 销售额的预测 设定贷款额度 可以根据事物的相关特征预测出对…

模型部署的艺术:让深度学习模型跃入生产现实

模型部署的艺术:让深度学习模型跃入生产现实 1 引言 1.1 部署的意义:为何部署是项目成功的关键 在深度学习项目的生命周期中,模型的部署是其成败的关键之一。通常,一个模型从概念构思、数据收集、训练到优化,最终目的…