【迅为iTOP-4412-linux 系统制作(1)】linux内核移植-5.4并适配设备树

news2024/11/27 0:39:33

准备工作

服务器:Ubuntu 18

sudo apt install gcc-arm-linux-gnueabihf(arm-linux-gnueabihf-gcc (v7.4, 安装方法: sudo apt install gcc-arm-linux-gnueabihf))
sudo apt install flex
sudo apt install bison
sudo apt install u-boot-tools

目标开发板

CPU (Exynos4412,四核Cortex-A9,主频为1.4GHz-1.6GHz)
RAM (1GB 双通道 DDR3)
ROM (8GB EMMC)

内核代码下载

git clone https://github.com/jason416/linux.git

Note:移植好的源码见github仓库的iTop4412分支。

文章目录

  • 准备工作
  • 1 基础知识
    • 源码目录
    • 设备树
  • 2 配置内核
    • 2.1 修改存储介质编号
    • 2.2 编译内核
  • 3 匹配开发板设备树
  • 参考

1 基础知识

linux 系统由 User Space 和 Kernel Space 两部分组成,今天是编译Kernel 部分。现代CPU 通常实现不同的工作模式。

以ARM 为例,ARM 实现了7 种工作模式,不同模式下 CPU 可以执行的指令和访问的寄存器是不同的。

  • 用户模式 usr
  • 系统模式 sys
  • 管理模式 svc
  • 快速终端 fiq
  • 外部中断 irq
  • 数据访问终止 abt
  • 未定义指令异常

x86 是定义了 4种不同级别的权限,

  • Ring0 特权指令,可以访问 IO 设备
  • Ring3 很多限制

用户空间和内核空间是程序执行的两种不同状态,我们可以通过”系统调用“和”硬件中断“来完成用户空间到内核空间的转移。

在这里插入图片描述
Kernel 里面
• System Call Interface (SCI层)
– 为用户空间提供了一套标准的系统调用函数来访问Linux内核。
• Procees Management(PM)
– 进程管理是创建进程(fork、exec),停止进程(kill、exit),并控制他们之
间的通信(signal等)。还包括进程调度,控制活动进程如何共享CPU
• Memory Management(MM)
– 内存管理的主要作用是控制多个进程安全的共享内存区域
• Device Drivers设备驱动
– Linux内核中有大量的代码在设备驱动程序部分,用于控制特定的硬件设
备。
– Linux驱动一般分为网络设备、块设备、字符设备、杂项设备
• 网络协议栈
– 内核网络协议栈为Linux提供了丰富的网络协议实现。
• Virtual File Systems(VFS)
– 虚拟文件系统,隐藏各种文件系统的具体细节,为文件操作提供统一的
接口
– Linux提供了一个大的通用模型,使这个模型包含了所有文件系统功能的
集合(一切皆文件)
在这里插入图片描述

在这里插入图片描述

源码目录

Linux内核源码采用树形结构。功能相关的文件放到不同的子目录下面,使程序更具有可读行。

arch目录是平台目录。内核支持的所有CPU架构,在该目录下都有对应的子目录。每个CPU的子目录,又进一步分解为boot,mm,kernel等子目录,分别控制系统引导,内存管理,系统调用。还有动态调频,主频率设置部分等

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

个人觉得,对于红色标记的一部分是需要重点看的,因为作为开发者需要学会使用它,我们要重点学习只是其中很小的一部
分。对架构有一定的了解,学习的重点是驱动开发相关的知识、函数的调用、驱动的协议、硬件知识。

设备树

什么是设备树

设备树device tree,简称dt在linux中用来做参数的表示和传递。在早期的linux版本其实也有参数的表示和传递的行为,例如uboot给kernel通过bootages传参,只不过那种做法并不太好,而设备树则更巧妙的解决了这种问题。

设备树是一个合集,主要包含了dts(device tree source)设备树源文件、dtc(device tree compiler)设备树编译/反编译/调试工具、dtb(device tree blob)二进制设备树镜像文件,dtb其实就是利用dtc将dts编译后的可执行的二进制文件。即.dtb 文件相当于 bin文件 或者 可执行文件,可由 dtc工具将 .dts 编译成 .dtb 文件。

为什么需要设备树

设备树的典型需求就是驱动,我们知道,在内核驱动中通常分为函数(操作方法)和数据,.c用来写函数,.h用来描述寄存器地址或者要写入寄存器的数据。随着芯片越来越多,如果我们把可能用到的各种芯片都写一个.c和.h,那么我们的内核就会有大量的这种芯片驱动的文件,把内核变成一个大胖子,且根本不可能囊括所有芯片。显然这套方法已经无法满足需求,所以就发明了设备树,来解决这个问题。

设备树基本工作原理

基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。在内核内部专门集成了设备树编译器生成代码,内核编译时先编译内核中用来编译设备树的编译器源码,生成一个设备树专用编译器,新编译器将驱动的数据编译成二进制文件dtb,在移植系统时则需要给设备树一个独立地址段。

boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。

2 配置内核

进入内核源码目录

~/linux-5.4$ ls
arch   COPYING  Documentation  include  Kbuild   lib          Makefile  README   security  usr
block  CREDITS  drivers        init     Kconfig  LICENSES     mm        samples  sound     virt
certs  crypto   fs             ipc      kernel   MAINTAINERS  net       scripts  tools

生成默认配置

~/linuux-5.4$ make exynos_defconfig

官方提供了所有三星系列的默认配置,需要先生成一个exynos的配置为基础,再上面再修改成跟板子一致的配置选项即可。
为了避免每次都需要指定ARCH和CROSS_COMPILE变量,可以直接在顶层Makefile直接指定好,如下所示:

选择系统类型
    System Type  --->
    	[*] Samsung EXYNOS  --->
    		--- Samsung EXYNOS
    		[ ]   SAMSUNG EXYNOS3
    		[*]   SAMSUNG EXYNOS4
    		[ ]   SAMSUNG EXYNOS5
    			  *** EXYNOS SoCs ***                                                        
				  -*-   SAMSUNG EXYNOS4210                                                        
				  [*]   SAMSUNG EXYNOS4412  

配置调试串口 - 设置为UART2

    Kernel hacking  --->
    	[*] Kernel low-level debugging functions (read help!)
				Kernel low-level debugging port (Use Samsung S3C UART 2 for low-level debug)  --->    


开启串口调试驱动

    Device Drivers  ---> 
    	Character devices  --->
    		Serial drivers  --->
    			<*> Samsung SoC serial support
    			[*]   Samsung SoC serial debug
    			[*]   Support for console on Samsung SoC serial port

开启DM96XX网卡驱动

    Device Drivers  --->
    	[*] Network device support  --->
    		<*>   USB Network Adapters  --->
    			<*>     Davicom DM96xx based USB 10/100 ethernet devices


设置内核压缩模式为LZMA(非必须,可减小文件大小)

    General setup  --->
    	()  Build ID Salt
    	    Kernel compression mode (LZMA)  --->


2.1 修改存储介质编号

我们刷写uboot 后,需要查看存储介质的编号。
修改

arch/arm/configs/iTop-4412_scp_defconfig

vim打开,查找

/mmcblk

修改mmcblk0p2
在这里插入图片描述
修改后
在这里修改后插入图片描述

文件系统为只读
修改 arch/arm/configs/iTop-4412_scp_defconfig,
文件中搜索root .在这里插入图片描述在root=/dev/mmcblk1p2 后面添加 rw,表示文件系统可读可写,否则只能读,就不能新建文件夹和文件.

2.2 编译内核

~/linux-5.4$ make uImage LOADADDR=0x40008000 -j$(nproc)
...
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  UIMAGE  arch/arm/boot/uImage
Image Name:   Linux-5.4.47
Created:      Sun Jun 21 22:41:40 2020
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    5337464 Bytes = 5212.37 KiB = 5.09 MiB
Load Address: 40008000
Entry Point:  40008000
  Kernel: arch/arm/boot/uImage is ready


为什么内核启动地址是0x40008000?
在内核目录 /Document/arm/Booting文档中有说明如下:

5. Calling the kernel image

Existing boot loaders: MANDATORY
New boot loaders: MANDATORY

There are two options for calling the kernel zImage. If the zImage
is stored in flash, and is linked correctly to be run from flash,
then it is legal for the boot loader to call the zImage in flash
directly.

The zImage may also be placed in system RAM (at any location) and
called there. Note that the kernel uses 16K of RAM below the image
to store page tables. The recommended placement is 32KiB into RAM.
The recommended placement is 32KiB into RAM
建议将内核放到RAM的32KB处,也就是偏移地址为0x8000处。

三星Exynos4412 内存起始地址为0x40000000,即内核地址为0x40008000
在这里插入图片描述

这里需要指定LOADADDR变量,才能生成正确的uImage文件。因为在uboot启动内核时,会先解析uImage中的前64B头信息,定义如下:
在这里插入图片描述

已经能够编译出可以运行的内核

3 匹配开发板设备树

修改

  • 屏蔽掉firmware节点(安全相关,firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。注释掉29到32行的代码)
  • 修改bus_dmc 节点devfreq-events为devfreq-event(因为没有events这个属性,所以我们要把72行的events修改成event)
  • 修改regulators 节点参数(参考原理图中的参数,Exynos4412 芯片的POP和SCP两种封装形式,芯片的电源管理都是低功耗动态三星 S5M8767 电源管理架构。)
  • 解决字符串溢出问题(打开编辑修改exynos4.dtsi文件,注释掉文件中的串口2节点serial_2中的dmas属性)
--- a/arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi
+++ b/arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi
@@ -23,10 +23,12 @@
 		reg = <0x40000000 0x40000000>;
 	};
 
+#if 0
 	firmware@203f000 {
 		compatible = "samsung,secure-firmware";
 		reg = <0x0203F000 0x1000>;
 	};
+#endif
 
 	fixed-rate-clocks {
 		xxti {
@@ -70,7 +72,7 @@
 };
 
 &bus_dmc {
-	devfreq-events = <&ppmu_dmc0_3>, <&ppmu_dmc1_3>;
+	devfreq-event = <&ppmu_dmc0_3>, <&ppmu_dmc1_3>;
 	vdd-supply = <&buck1_reg>;
 	status = "okay";
 };
@@ -167,8 +169,8 @@
 		regulators {
 			ldo1_reg: LDO1 {
 				regulator-name = "VDD_ALIVE";
-				regulator-min-microvolt = <1100000>;
-				regulator-max-microvolt = <1100000>;
+				regulator-min-microvolt = <1000000>;
+				regulator-max-microvolt = <1000000>;
 				regulator-always-on;
 				regulator-boot-on;
 				op_mode = <1>; /* Normal Mode */
@@ -230,8 +232,8 @@
 
 			ldo9_reg: LDO9 {
 				regulator-name = "VDD33_LCD";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
+				regulator-min-microvolt = <3000000>;
+				regulator-max-microvolt = <3000000>;
 				op_mode = <1>; /* Normal Mode */
 			};
 
@@ -252,8 +254,8 @@
 
 			ldo12_reg: LDO12 {
 				regulator-name = "VDD33_UOTG";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
+				regulator-min-microvolt = <3000000>;
+				regulator-max-microvolt = <3000000>;
 				regulator-always-on;
 				op_mode = <1>; /* Normal Mode */
 			};
@@ -300,8 +302,8 @@
 			/* Used by HSIC */
 			ldo18_reg: LDO18 {
 				regulator-name = "VDDIOPERI_28";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
+				regulator-min-microvolt = <2800000>;
+				regulator-max-microvolt = <2800000>;
 				regulator-always-on;
 				op_mode = <1>; /* Normal Mode */
 			};
@@ -313,15 +315,15 @@
 
 			ldo20_reg: LDO20 {
 				regulator-name = "VDD28_CAM";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <2800000>;
+				regulator-min-microvolt = <3000000>;
+				regulator-max-microvolt = <3000000>;
 				op_mode = <1>; /* Normal Mode */
 			};
 
 			ldo21_reg: LDO21 {
 				regulator-name = "VDD28_AF";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <2800000>;
+				regulator-min-microvolt = <3000000>;
+				regulator-max-microvolt = <3000000>;
 				op_mode = <1>; /* Normal Mode */
 			};
 
@@ -341,8 +343,8 @@
 
 			ldo24_reg: LDO24 {
 				regulator-name = "VDD33_A31";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
+				regulator-min-microvolt = <3000000>;
+				regulator-max-microvolt = <3000000>;
 				op_mode = <1>; /* Normal Mode */
 			};
 
@@ -430,8 +432,8 @@
 
 			buck7_reg: BUCK7 {
 				regulator-name = "pvdd_buck7";
-				regulator-min-microvolt = <750000>;
-				regulator-max-microvolt = <2000000>;
+				regulator-min-microvolt = <2050000>;
+				regulator-max-microvolt = <2050000>;
 				regulator-boot-on;
 				regulator-always-on;
 				op_mode = <1>; /* Normal Mode */


注释掉文件中的串口2节点serial_2中的dmas属性
在这里插入图片描述
编译dts

~/linux-5.4$ make dtbs
# make dtbs ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

等待编译结果如下图所示:
即为编译生成的设备树 dtb 文件“exynos4412-itop-elite.dtb” 和内核镜像uImage 。
在这里插入图片描述

参考

https://blog.csdn.net/Jason_416/article/details/106772698
https://blog.csdn.net/Eva20192020/article/details/133752417?spm=1001.2014.3001.5502

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

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

相关文章

算法实验二 矩阵最小路径和 LIS

算法实验课二 矩阵最小路径和 leetcode裸题 最小路径和 给定一个包含非负整数的 *m* x *n* 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&…

Excel 文件底部sheet 如何恢复

偶然打开一个excel文件&#xff0c;惊奇地发现&#xff1a;原来excel文件底部的若干个sheet居然全都看不到了。好神奇啊。 用其它的电脑打开同样的excel文件&#xff0c;发现&#xff1a;其实能看到的。说明这个excel文件并没有被损坏。只要将修改相关设置。就可以再次看…

Mysql底层原理四:B+树索引

B树索引&#xff08;索引的原理&#xff09; 1.前言 前边我们详细唠叨了InnoDB数据⻚的7个组成部分&#xff0c;知道了各个数据⻚可以组成⼀个双向链表&#xff0c;⽽每个数据⻚中的记录会按照主键值从⼩到⼤的顺序组成⼀个单向链 表&#xff0c;每个数据⻚都会为存储在它⾥边…

SpringCloud Alibaba @SentinelResource 注解

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十五篇&#xff0c;即介绍 SpringCloud Alibaba 的 SentinelResource 注解。 二、简介 这个注解用于标…

Agenda家族再升级,跨平台定制化勒索引关注

Agenda勒索也被称为Qilin勒索&#xff0c;该家族的早期版本使用Go 语言编写的&#xff0c;增加了安全分析的难度。其早期版本是针对每位受害者定制的&#xff0c;使用受害者的机密信息&#xff08;例如泄露的帐户和唯一的公司 ID&#xff09;作为附加文件扩展名。针对早期版本A…

TS封装axios并约束请求参数以及响应的类型

封装一个简单的axios src/utils/axiosInstance.ts&#xff1a;其中定义了基本返回数据的类型 import axios, {AxiosInstance,AxiosResponse,AxiosError,AxiosRequestConfig, } from "axios"// 定义基本返回数据类型 export interface ApiResponse<T> {code: …

蓝桥杯-DS18B20温度传感器

一.管脚&芯片&寄存器 1.芯片 2.了解封装以及引脚的用法 3.相关寄存器 报警功能 二&#xff0c;如何使能DS18B20芯片 1.初始化芯片&比赛提供的驱动代码 比赛提供的底层驱动代码 /* # 单总线代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考…

基于R语言lavaan结构方程模型(SEM)实践技术应用

原文链接&#xff1a;基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;实践技术应用https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd…

跨服务器迁移nextcloud数据

背景 阿里云最近做活动,99一年的2U2G的服务器,比我原来的1U1G的服务器不知道高到哪里去了,于是决定迁移服务器数据到另一台主机上。原先的计划是直接做一个自定义镜像,然后复制到另一台主机就行,结果发现旧主机是aliyunOS,新主机不想踩这个坑了,决定换成乌班图,因此决定重新搭…

Mac系统Unity团结引擎打包OpenHomeny项目配置

1、团结引擎下载&#xff1a;直接百度下载即可 2、mac版本的DevEco4.0编辑器下载&#xff1a; widthdevice-width,initial-scale1.0https://docs.openharmony.cn/pages/v4.0/zh-cn/release-notes/OpenHarmony-v4.0-release.md/#%E9%85%8D%E5%A5%97%E5%85%B3%E7%B3%BB3、打开D…

什么是多路复用器滤波器

本章将更深入地介绍多路复用器滤波器&#xff0c;以及它们如何用于各种应用中。您将了解到多路复用器如何帮助设计人员创造出更复杂的无线产品。 了解多路复用器 多路复用器是一组射频(RF)滤波器&#xff0c;它们组合在一起&#xff0c;但不会彼此加载&#xff0c;可以在输出之…

智能化办公时代来临:AI助你解放双手

文章目录 一、AI在办公领域的广泛应用二、AI助力办公效率提升1.自动化流程减少繁琐任务2.智能分析辅助决策制定3.个性化服务提升用户体验 三、AI提升办公效率的未来趋势1.更加智能化的办公场景2.更高效的团队协作3.更全面的数据安全保护 四、应对AI带来的挑战《AI高效工作一本通…

RocketMQ笔记(七)SpringBoot整合RocketMQ发送事务消息

目录 一、简介1.1、流程图1.2、事务消息流程介绍 二、Maven依赖三、生产者3.1、application配置3.2、员工表3.3、实体3.4、持久层3.5、监听器 四、测试4.1、普通消息4.2、事务消息4.2.1、消费者4.2.2、正常提交4.2.3、异常提交 五、其他5.1、接口说明5.2、checkLocalTransactio…

「Qt Widget中文示例指南」如何实现一个分组框

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Group Box&#xff…

python中for与while的区别是什么

Python中for循环和while循环本质上是没有区别的&#xff0c;但是在实际应用上&#xff0c;针对性不太一样。 for主要应用在遍历中&#xff0c;比如&#xff1a; example1&#xff1a; for i in range(10):print(i) 打印结果为&#xff1a; 0 1 2 3 4 5 6 7 8 9 注&#xff1a;…

springboot系列-api接口请求实现

springboot HTTP请求接口实现 基于springboot 2.6.6 代码地址&#xff1a;github仓库地址 更多系列教程请关注公众号’coderlike’ 如果觉得有帮助希望能关注下公众号 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-b…

IP网络对讲广播系统审计

前言 这个系统是前两年在一个内网遇到的&#xff0c;当时顺手试了一个admin登陆之后再没有然后了&#xff0c;最近发现有大佬分享关于这个系统的漏洞&#xff0c;于是就把自己当初看的几个漏洞分享一下&#xff0c;系统比较简单&#xff0c;漏洞点很多&#xff0c;不要做坏事哦…

PaddleVideo:PP-TSM 视频分类

本文记录&#xff1a;使用Paddle框架训练TSM&#xff08;Temporal Shift Module&#xff09; 前提条件&#xff1a;已经安装Paddle和PadleVideo&#xff0c;具体可参考前一篇文章。 1-数据准备&#xff1a; 以UCF101为例&#xff1a;内含13320 个短视频&#xff0c;视频类别&…

uniapp引入微信小程序版本VantUI,使用VantUI的自定义tabbar,并解决自定义tabbar出现闪烁的情况

1.uniapp引入微信小程序版本VantUI 去vant官网下载源码&#xff0c;源码放在github&#xff0c;自行去下载下来 https://vant-contrib.gitee.io/vant-weapp/#/home 在pages.json的globalStyle里面注册组件 "globalStyle": {"navigationBarTextStyle": &qu…

zookeeper源码(12)命令行客户端

zkCli.sh脚本 这个命令行脚本在bin目录下: ZOOBIN="${BASH_SOURCE-$0}" ZOOBIN="$(dirname "${ZOOBIN}")" ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)"# 加载zkEnv.sh脚本 if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; …