【linux-kernel内核移植记录-踩坑以及注意事项】

目录

  • 1. 环境介绍
  • 2.编译原厂的kernel
    • 2.1 通过tftp挂载原厂linux内核
  • 3. 修改对应的驱动
    • 3.1 修改CPU频率
    • 3.2 修改MMC
    • 3.3 修改网络驱动
  • 4. 总结

1. 环境介绍

  • ubuntu版本16.04
  • I.MX6ULL开发板,阿尔法
  • uboot正常启动,能ping通ubuntu,可通过tftpboot进行网络下载,校准了DDR
  • 使用NXP原厂的内核进行修改:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

2.编译原厂的kernel

  上节已经移植完毕uboot,链接,接下来就是对linux内核的移植,对于内核的移植有大神就会对linux内核进行裁剪,但是由于刚开始学习,对于内核的移植先保证能正常启动和运行,对于后续的剪裁和优化就先暂时丢弃;

  • tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2:对压缩包进行解压;
  • 和uboot编译类似,创建一个shell脚本文件my.sh,内容如下:

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig
make ARCH=arm CROSS_COMPILE=arm-iinux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8

  • ./my.sh:运行脚本进行第一次的编译
  • 给顶层Makefile文件夹加上这两句内容,以后的编译只用使用make -j8就行了

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

  • 编译结果如下:

2.1 通过tftp挂载原厂linux内核

  • setenv bootcmd 'tftpboot 0x80800000 zImage;tftpboot 0x83000000 imx6ull-14x14-evk.dtb;bootz 0x80800000 - 0x83000000'
  • saveenv
  • run bootcmd

  结果如下图所示:成功进入进入内核。但是缺少,根文件系统;


  假设我们把根文件系统已经放在了mmc中的mmcblk1p2中我们进行设置下面的命令:

  • setenv bootargs console=ttymxc0,115200 root=/dev/mmcblk1p2 rw:出现下面的错误:uboot传递给内核的参数bootargs需添加rootwait,避免sd卡驱动加载完成前就从sd卡加载文件系统
  • setenv bootargs console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

  • 添加完毕的结果如下:

3. 修改对应的驱动

  在进行uboot移植时我们并没有过多的进行驱动的修复,例如屏幕驱动我们就没有修改,我们只修改了网络驱动,现在我们看看进入Linux内核完毕后网络是否正常,结果如下图:

3.1 修改CPU频率

  刚进入系统时,我们的cpu的工作频率是792MHZ满频率运行,我们要进行设置,使cpu工作为自动负载的模式


  修改如下,两种修改方式,一种是通过defconfig文件,一种是图形化界面进行修改,这里使用图形化界面进行修改;

  1. make menuconfig:运行这个命令,打开配置界面:

  1. 进入下图对应的目录,并选择默认的cpu频率的配置,退出后运行make -j8,然后编译 Linux内核,一定不要清理工程!否则的话我们刚刚的设置就会被清理掉。编译完成以后使用新的zImage 重启 Linux,查看当前 CPU 的工作频率和调频策略,把生成的zImage文件下载的板子中

  1. 配置完毕,把新的zImage加载到板子中可以发现,cpu已经工作在了onmend模式下;重要的事情说三遍,可以把保存好的配置文件给备份一份;
  2. 一定不要清理工程!否则的话我们刚刚的设置就会被清理掉!
  3. 一定不要清理工程!否则的话我们刚刚的设置就会被清理掉!
  4. 一定不要清理工程!否则的话我们刚刚的设置就会被清理掉!

3.2 修改MMC

  我使用的开发板核心板上的 EMMC 采用的 8 位数据线,原理图如图所示:


  Linux 内核驱动里面 EMMC 默认是 4 线模式的,4 线模式肯定没有 8 线模式的速度快,所以本节我们将 EMMC 的驱动修改为 8 线模式。修改方法很简单,直接修改设备树即可,打开文
件 imx6ull-14x14-evk.dts,找到如下所示内容修改如下:

&usdhc2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_usdhc2_8bit>;
	pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
	pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
	bus-width=<8>;
	non-removable;
	no-1-8-v;/*关闭1.8V  供电*/
	status = "okay";
	// 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";
};

3.3 修改网络驱动

  每个人的设备引脚不一样,修改的地方也不一样,不具备参考性,我使用的是正点原子的IMX6ULL开发板,因此详细修改过程可以参考正点原子的嵌入式linux驱动开发指南,对于正点原子的驱动的修改如下:ENET1 复位引脚 ENET1_RST 连接在 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。ENET2的复位引脚 ENET2_RST 连接在 I.MX6ULL 的 SNVS_TAMPER8 上;我这里移植uboot和移植linux内核时均未添加自己的板卡信息,均是在原板级文件上进行修改;

  1. 第一处修改的地方在imx6ull-14x14-evk.dts文件中:修改如下:
pinctrl_spi4: spi4grp {
       fsl,pins = <
       MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10        0x70a1
       MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11        0x70a1
 /*    MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07      0x70a1 */
 /*    MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08      0x80000000 */
                 >;
 };
  1. 第二处修改也是在这个文件中,也就是把和IO07和IO08引脚有关的全部改掉;
	spi4 {
		compatible = "spi-gpio";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_spi4>;
	/*	pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; */
		status = "okay";
		gpio-sck = <&gpio5 11 0>;
		gpio-mosi = <&gpio5 10 0>;
	/*	cs-gpios = <&gpio5 7 0>; */
		num-chipselects = <1>;
		#address-cells = <1>;
		#size-cells = <0>;
  1. 第三处修改也是在这个文件中,添加PHY的复位引脚;也就是下面的内容:
		pinctrl_enet1: enet1grp {
			fsl,pins = <
				MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN	0x1b0b0
				MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER	0x1b0b0
				MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00	0x1b0b0
				MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01	0x1b0b0
				MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN	0x1b0b0
				MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00	0x1b0b0
				MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01	0x1b0b0
				MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1	0x4001b031
				/*加上下面这句*/
				MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07		0x10B0
			>;
		};

		pinctrl_enet2: enet2grp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO07__ENET2_MDC		0x1b0b0
				MX6UL_PAD_GPIO1_IO06__ENET2_MDIO	0x1b0b0
				MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN	0x1b0b0
				MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER	0x1b0b0
				MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00	0x1b0b0
				MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01	0x1b0b0
				MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN	0x1b0b0
				MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00	0x1b0b0
				MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01	0x1b0b0
				MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2	0x4001b031
				/*加上下面这句*/
				MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08		0x10B0
			>;
		};
  1. 第四处修改也是在这个文件中,添加PHY复位节点,修改内容如下:
&iomuxc_snvs {
	pinctrl-names = "default_snvs";
        pinctrl-0 = <&pinctrl_hog_2>;
        imx6ul-evk {
        
		/*添加下面两个复位节点*/
		pinctrl_enet1_reset: enet1resetgrp {

 			fsl,pins = <MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0>;
 		};
		pinctrl_enet2_reset: enet2resetgrp {
 			fsl,pins = <MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0>;
 		};
...........................
  1. 第五处修改也是在这个文件中,修改如下:
&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1
				 &pinctrl_enet1_reset>;/* 添加内容 */
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	status = "okay";
};

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2
				 &pinctrl_enet2_reset>; /*添加内容*/
  1. 第六处修改也是在这个文件中,修改的PHY的地址,修改如下:
mdio {
		#address-cells = <1>;
		#size-cells = <0>;
		/*修改phy的地址*/
		ethphy0: ethernet-phy@0 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <0>;
		};

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <1>;
		};
	};
  1. 第七处修改如下,要 在 I.MX6ULL 上 使 用 LAN8720A ,需要修改一下Linux内核源码 ,打开drivers/net/ethernet/freescale/fec_main.c,找到函数 fec_probe,在fec_probe 中加入如下代码:
fec_probe(struct platform_device *pdev)
{
	struct fec_enet_private *fep;
	struct fec_platform_data *pdata;
	struct net_device *ndev;
	int i, irq, ret = 0;
	struct resource *r;
	const struct of_device_id *of_id;
	static int dev_id;
	struct device_node *np = pdev->dev.of_node, *phy_node;
	int num_tx_qs;
	int num_rx_qs;
	fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
	/*下面是新加入的代码*/
	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);
...................
}
  1. 使能使能 LAN8720 驱动,通过图型化界面进行配置:如下:

  1. 运行make -j8命令进行重新编译,把生成的zImage挂载到系统中进行测试:

4. 总结

  通过上述步骤,成功完成了I.MX6ULL开发板的内核移植与驱动修改,实现了系统的正常启动和基本功能的运行。主要修改内容包括CPU频率设置、EMMC驱动模式以及网络驱动配置。在实践中需要特别注意保持编译配置的持久性,避免清理工程导致配置丢失,这里主要是对自己进行linux内核移植过程的关键信息进行了一个介绍和总结,可作为复盘的记录;

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

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

相关文章

【0007day】总体标准差、样本标准差和无偏估计

文章目录 总体标准差和样本标准差无偏估计无偏性与无偏估计量 总体标准差和样本标准差 一些表示上的差别。 总体标准差 样本标准差 两者的区别 样本方差为什么除以n-1? 这主要是由于样本的方差会低估总体的方差&#xff08;抽样的过程中&#xff0c;按照概率来说&#xff0…

C++面向对象的第二大特性:继承

1.继承的介绍 首先容我先向大家举一个列子: 我这里定义了一个Person的类 class Person { protected:string name;int age;string address;}; 在这个基础上&#xff0c;我要定义一个关于Student , Worker 的类 由于Student Worker都具有Person类中的成员变量 &#xff0c…

【C语言】指针(三)

目录 一、字符指针 1.1 ❥ 使用场景 1.2 ❥ 有关字符串笔试题 二、数组指针 2.1 ❥ 数组指针变量 2.2 ❥ 数组指针类型 2.3 ❥ 数组指针的初始化 三、数组指针的使用 3.1 ❥ 二维数组和数组名的理解 3.2 ❥ 二维数组传参 四、函数指针 4.1 ❥ 函数的地址 4.2 ❥ 函数…

探索亚马逊云科技技术课程:大模型平台与提示工程的应用与优化

上方图片源自亚马逊云科技【生成式 AI 精英速成计划】技术开发技能课程 前言 学习了亚马逊云科技–技术开发技能课程 本课程分为三个部分&#xff0c;了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发&#xff0c;了解各类服务的优势、功能、典型使用案…

借助 CloudFlare 增强站点内容保护防采集

今天在一位站长的帮助下实测了 CloudFlare 增强站点内容保护实现防采集的功能,效果那是杠杠的,如果您的站点原创内容比较多的话,明月强烈建议试试 CloudFlare 这个内容保护,无论是 WordPress 、Typecho 都有非常好的效果,并且几乎没有任何误伤,搜索引擎爬虫蜘蛛更是不会影…

Adobe Animate AN v24.0.2 安装教程 (动画特效设计及合成工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…

深度神经网络教程(个人总结版)

深度神经网络&#xff08;Deep Neural Networks, DNN&#xff09;是机器学习和人工智能的核心技术之一&#xff0c;已经广泛应用于图像识别、自然语言处理、语音识别、自动驾驶等领域。本文将详细介绍深度神经网络的背景、基本原理、架构、训练方法、优化技巧以及常见应用。 一…

vue通过for循环生成input框后双向绑定失效问题

有些时候页面上有太多的表单元素&#xff0c;一个个的写太过繁琐&#xff0c;拿 input 框举例&#xff0c;众多的 input 框&#xff0c;无非就是输入框前的说明和 input 框的 name 属性不一样 <el-form :inline"true" :model"formInline" size"mi…

Linux-笔记 应用编程函数总结

之前一直没做总结&#xff0c;这里总结一下。 一、文件I/O open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); 例子&#xff1a; int fd; fd open("./test_kondon", O_WRONLY …

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进粒子滤波的锂离子电池剩余寿命预测 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

在使用LabVIEW控制多个串口设备进行数据读取时,读取时间过长

在使用LabVIEW控制多个串口设备进行数据读取时&#xff0c;如果发现数据更新时间超过5秒&#xff0c;可以从以下几个方面进行分析和解决&#xff1a; 1. 串口配置与通信参数 确保每个串口的通信参数&#xff08;波特率、数据位、停止位、校验位等&#xff09;配置正确&#x…

vue的异步操作,钩子函数,和Element组件

目录 使用vue进行异步操作 钩子函数 1.create 2.beforeMount​ 3.mounted​ 4.beforeUpdate​ 5.updated​ 6.beforeUnmount​ 7.unmounted​ Element组件 使用vue进行异步操作 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

扫描链接打开小程序配置-谁看谁迷糊

各位你们怎么理解这个规则&#xff1f;如果再多一条数据&#xff0c;和上面一样&#xff0c;只是测试范围为线上版本&#xff0c;又怎么解读&#xff1f; 反正以我对中文的掌握程度&#xff0c;我认为上面的规则是针对体验版的&#xff0c;符合规则的都跳转到体验版。新增的线上…

「51媒体」如何与媒体建立良好关系?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 与媒体建立良好关系对于企业或个人来说都是一项重要的公关活动。 了解媒体&#xff1a;研究媒体和记者的兴趣&#xff0c;提供相关且有价值的信息。 建立联系&#xff1a;通过专业的方式…

FastCopy

目录 背景: 简介&#xff1a; 原理: 下载地址: 工具的使用: 背景: 简介&#xff1a; FastCopy是一款速度非常快的拷贝软件&#xff0c;软件版本为5.7.1 Fastcopy是日本的最快的文件拷贝工具&#xff0c;磁盘间相互拷贝文件是司空见惯的事情&#xff0c;通常情况…

Vue3实战笔记(41)—自己封装一个计时器Hooks

文章目录 前言计时器钩子总结 前言 在Vue项目中&#xff0c;封装一个计时器挂钩&#xff08;Hook&#xff09;是一种实用的技术&#xff0c;它允许你在组件中方便地管理定时任务&#xff0c;如倒计时、计时器等&#xff0c;而无需在每个使用场景重复编写相同的逻辑代码。 计时…

金职优学:分析央国企面试如何通关?

在当今竞争激烈的就业市场中&#xff0c;中央和国有企业&#xff08;以下简称“央国企”&#xff09;的面试机会对求职者来说是非常有吸引力的。这些企业通常拥有稳定的发展前景、良好的薪酬福利和广阔的职业发展空间。但是&#xff0c;要想成功通过央国企的面试&#xff0c;求…

Python列表,元组,集合,字典详解一篇搞懂

目录 介绍 列表(List) 集合(Set) 字典(Dict) 元组(Tuple) 列表 列表定义 ​编辑 列表切片 列表常用方法 append extend ​编辑 insert ​编辑 remove pop ​编辑 clear ​编辑 列表修改元素 sort 升序 倒序 reverse count ​编辑 index 浅拷贝和深拷贝 …

vue contextPath的思考

先说我这边的情况&#xff0c;目前项目都是前后端分离开发的&#xff0c;上线有种部署方式&#xff0c;常见的就是前后端分开部署&#xff0c;这是比较常见的&#xff0c;我这边因客户原因&#xff0c;打包一起进行部署比较简单&#xff0c;交付技术运维部方便后期其他现场部署…

线性规划库PuLP使用教程

Python求解线性规划——PuLP使用教程 简洁是智慧的灵魂&#xff0c;冗长是肤浅的藻饰。——莎士比亚《哈姆雷特》 文章目录 一、说明二、安装 PuLP 库三、线性规划简介3.1 线性规划3.1.1 高考题目描述3.1.2 基本概念 3.2 整数规划3.2.1 题目描述[3]3.2.2 解题思路 四、求解过程…