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

news2024/7/4 4:37:51

目录

  • 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内核移植过程的关键信息进行了一个介绍和总结,可作为复盘的记录;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用delphi11编写一个基于xls作为数据库的照片展示程序

1、创建xls文档可以参考前一篇博客&#xff0c;并使用wps将文档保存为2003格式xls后缀。 2、在form上面放置adoconnection、adotable、datasource、spinedit、timer、checkbox、image、4个button组件。 image的设置&#xff1a; Image1.Align : alClient; Image1.Center : Tr…

【全开源】答题考试系统源码(FastAdmin+ThinkPHP+Uniapp)

答题考试系统源码&#xff1a;构建高效、安全的在线考试平台 引言 在当今数字化时代&#xff0c;在线考试系统已成为教育机构和企业选拔人才的重要工具。一个稳定、高效、安全的答题考试系统源码是构建这样平台的核心。本文将深入探讨答题考试系统源码的关键要素&#xff0c;…

mysql binlog统一恢复误删数据库、表、数据(没有任何备份)

先将mysql文件夹中的my.ini进行设置 在 [mysqld]下边加上 # mysql-bin 是日志的基本名或前缀名&#xff0c;最后生成的日志文件是mysql-bin.000001类似&#xff0c;重启mysql数字会递增 log_binmysql-bin #binlog格式&#xff0c;statement&#xff0c;row&#xff0c;mixed可…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第28课-avatar玩家3D形象

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第28课-avatar玩家3D形象 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…

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

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

CV之Nougat:Nougat(一种基于神经网络实现OCR功能的视觉转换器模型)的简介、安装和使用方法、案例应用之详细攻略

CV之Nougat&#xff1a;Nougat(一种基于神经网络实现OCR功能的视觉转换器模型)的简介、安装和使用方法、案例应用之详细攻略 目录 相关论文 《Nougat: Neural Optical Understanding for Academic Documents》的翻译与解读 Nougat的简介 Nougat的安装和使用方法 1、安装 …

成犬必备!福派斯鲜肉狗粮,亮毛祛泪痕的神奇功效!

对于成犬来说&#xff0c;选择一款合适且高质量的狗粮至关重要。成犬时期的狗狗正处于身体和生理机能逐渐稳定的阶段&#xff0c;因此&#xff0c;需要选择能够满足其日常营养需求、维持健康状态并有助于长寿的狗粮。理想的狗粮应当包含狗狗所需的各种营养物质&#xff0c;如高…

使用CyberRT写第一个代码, test ok

简介 计算框架是自动驾驶系统中的重中之重,也是整个系统得以高效稳定运行的基础。为了实时地完成感知、决策和执行,系统需要一系列的模块相互紧密配合,高效地执行任务流。由于各种原因,这些模块可能位于不同进程,也可能位于不同机器。这就要求计算框架中具有灵活的、高性…

uniapp+canvas实现逐字手写效果

在移动端使用 UniApp 进行逐字手写的功能。用户可以在一个 inputCanvas 上书写单个字&#xff0c;然后在特定时间后将这个字添加到 outputCanvas 上&#xff0c;形成一个逐字的手写效果。用户还可以保存整幅图像或者撤销上一个添加的字。 初始化 Canvas&#xff1a; 使用 uni.c…

SpringCloud系列(29)--准备使用Hystrix的前期工作,创建服务提供者模块

前言&#xff1a;在上一章节中我们简单的介绍了关于Hystrix的相关知识点&#xff0c;而本节内容则是关于如果去使用Hystrix构建一个支付微服务。 1、创建一个服务提供者模块&#xff0c;命名为cloud-provider-hystrix-payment8001 (1)在父工程下新建模块 (2)选择模块的项目类型…

香橙派华为昇腾CANN架构编译opencv4.9

香橙派华为升腾AI盒子 为啥要编译opencv4.9.0&#xff0c; 因为在4.9.0 中增加了华为昇腾CANN的外接开发库&#xff0c;下图为盒子外观&#xff0c;此次一接到这个盒子&#xff0c;立刻开始开箱操作&#xff0c;首先就是要编译opencv4.9&#xff0c;以前在香橙派3588 的盒子中…

台湾省军事演习路径规划:A*算法在复杂地形中的应用

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

PyTorch 错误 RuntimeError: CUDA error: device-side assert triggered

训练数据的时候出现 RuntimeError:CUDA error:device-side assert triggeredCUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.For debugging consider passing CUDA_LAUNCH_BLOCKING1.Compile with …

使用Python探究OpenAI API

谁没听说过OpenAI?这家人工智能研究实验室因其著名的产品ChatGPT而改变了世界。它改变了AI实施领域&#xff0c;许多公司现在急于成为下一大热点。 尽管竞争激烈&#xff0c;OpenAI仍然是任何生成式AI业务需求的首选公司&#xff0c;因为它拥有最好的模型和持续的支持。该公司…

齐护K210系列教程(三十四)_视觉PID巡线小车

视觉PID巡线小车 1.前言2.简介3.代码讲解3.1初始化3.2.色块查找3.3色块分析3.3.1 区域13.3.2 区域2 3.4 侦测关键点部分3.4.1正常巡线3.4.2 右转路口 3.4.3十字路口3.4. PID计算 4.完整代码5.小车端程序6.参考程序联系我们 1.前言 本课程主要讲述如何使用AIstart_k210主板完成…

C语言——free() 和 delete() 怎样处理指针?

一、问题 从字⾯上理解&#xff0c;free() 是释放&#xff0c;给予⾃由的意思&#xff1b;⽽ delete() 的含义⽐较直接&#xff0c;是删除的意思。这两个函数的⽬的就是不想再与这个指针有任何关联&#xff0c;那么它们到底怎样处理了不再使⽤的指针呢&#xff1f; 二、解答 其…

❤Element的使用element

❤Element的使用 1、input输入框 禁止自动补全和下拉提示 input 输入框在输入后浏览器会记录用户输入的值&#xff0c;在下次输入的时候会将记录的值提示在输入框的下面&#xff0c;当输入框是密码的时候&#xff0c;这样可以看见上次输入的密码&#xff0c;这样用户体验不好…

融资融券大揭秘:两融入门操作最新指南!

#引言# 随着中国资本市场日新月异的发展进程&#xff0c;融资融券交易已崭露头角&#xff0c;成为投资者们瞩目的焦点。作为一种颇具影响力的投资方式&#xff0c;它正逐渐吸引越来越多的投资者关注。本文旨在为大家深入剖析融资融券交易的核心概念、详尽的操作步骤以及必须留意…

数据清洗(ETL)案例实操

文章目录 数据清洗&#xff08;ETL&#xff09;概述案例需求和分析代码实现和结果分析 数据清洗&#xff08;ETL&#xff09;概述 “ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;Extract&#xff09;、转换&…

医院挂号就诊系统的设计与实现

前端使用Vue.js 后端使用SpiringBoot MyBatis 数据使用MySQL 需要项目和论文加企鹅&#xff1a;2583550535 医院挂号就诊系统的设计与实现_哔哩哔哩_bilibili 随着社会的发展&#xff0c;医疗资源分布不均&#xff0c;患者就诊难、排队时间长等问题日益突出&#xff0c;传统的…