Linux驱动(一):环境搭建及介绍

news2024/9/27 9:29:01

目录

  • 前言
  • 一、硬件配置及SDK包
    • 1.硬件核心芯片
    • 2.瑞芯微原厂SDK包
  • 二、环境镜像文件的获取
    • 1.镜像文件的组成及启动流程
    • 2.获取环境所需的镜像文件
      • 2.1 uboot.img
      • 2.2 boot.img
      • 2.3 rootfs.img
      • 2.4 整体编译
  • 三、镜像文件烧录


前言

  自用自用自用,晚上睡觉前复盘用。当然,也欢迎大家参考指正。积极认错,坚决不该(bushi)。

uboot 版本 — 2017.09
kernel 版本 — linux 5.10.110


一、硬件配置及SDK包

1.硬件核心芯片

芯片:RK3588S,是瑞芯微(Rockchip) 推出的一款高性能系统级芯片(SoC),专为高端嵌入式应用设计。
芯片系列:cortex-A

系列应用特点
Cortex-A高性能计算和多媒体应用,主要用于智能手机、平板电脑、智能电视和高性能嵌入式设备。复杂指令集计算(CISC),高性能,拥有多媒体和计算能力
Cortex-M低功耗、实时响应和嵌入式控制,广泛用于微控制器、传感器、家电和汽车电子等领域。精简指令集计算(RISC),快速响应和低延迟,低功耗
Cortex-R实时性能要求极高的嵌入式系统,如汽车控制系统、工业控制和高可靠性应用。精简指令集计算(RISC),高可靠性和容错,优化了实时任务的响应时间和处理能力

CPU 架构:四个 ARM Cortex-A76 核心和四个 ARM Cortex-A55 核心。Cortex-A76 核心提供了强大的计算能力,适合处理复杂的应用程序,而 Cortex-A55 核心则用于处理日常任务,优化功耗和效率。

该芯片性能很强悍,主打处理音视频+AI。

2.瑞芯微原厂SDK包

  SDK 的全称是 "Software Development Kit"就是软件开发工具包,用于帮助开发者在瑞芯微的处理器平台上开发应用。它包括驱动程序、库文件、示例代码、开发文档和工具,旨在简化开发过程,使开发者能够更容易地实现设备功能、进行系统集成和优化应用性能。这个包是实现硬件功能和软件交互的关键工具。

SDK 包的目录结构(部分):

文件名作用
app参考应用程序或预编译应用,帮助理解 SDK 的实际使用
device各个设备配置,存放瑞芯微的对应设备的各种配置文件
kernel整个系统的内核。也是 Linux 开源内核,内核版本为 5.10 版本
prebuilts存放瑞芯微集成在 SDK 上的交叉编译器
tools一些辅助工具和脚本,帮助开发和调试过程
buildroot用于生成嵌入式 Linux 系统的工具
docs原厂提供的各种各样的开发协助文档,里边存储各种所需的开发板文件
external瑞芯微原厂支持一些外扩的包
envsetup.sh配置脚本 ---- 就是别人提前写好的脚本,编译之前需要做适配时,就可以执行这个脚本,他里面存放了很多不同开发板的配置选项

二、环境镜像文件的获取

Linux操作系统的基本构成可以包括 U-Boot、Kernel 和 Rootfs。
U-Boot:这是一个引导加载程序(Bootloader),负责在系统启动时初始化硬件并加载内核。
Kernel:内核是操作系统的核心,负责硬件管理、进程调度、内存管理等基本功能。
Rootfs:根文件系统(Root Filesystem),包含操作系统运行所需的用户空间工具、库、配置文件等。
所以,如果我们想让嵌入式系统跑Linux,只需将这个三个的镜像文件烧录进去即可。

1.镜像文件的组成及启动流程

在这里插入图片描述
由上图所示:

  1. update.img镜像文件是由uboot.img、boot.img和rootfs.img三个镜像文件集合而成,里面存放的就是驱动编程所需的开发环境。
  2. Linux系统在板子上开始上电运行时,硬件里的厂商写的固有代码BL0会首先运行,之后就是uboot引导程序开始运行,uboot引导程序类似于bios,会唤醒系统**kernel核心(boot)开始运行,核心运行后,会带动根文件系统(rootfs)**运行。

这里简单介绍一下BL0:在这里插入图片描述
IROM (Internal ROM):芯片内部固化存储代码的存储器
BL0:固化在芯片iROM中的启动代码。 作用:初始化PPL和时钟,设置看门狗,关闭中断和看门狗,初始化堆和栈;判断硬件的启动方式,去不同的启动方式的启动设备里面加载BL1。

2.获取环境所需的镜像文件

2.1 uboot.img

在这里插入图片描述

  uboot.img使用uboot编译生成的镜像文件。U-Boot(Universal Boot Loader)译为“通用引导加载程序”,是一个广泛使用的开源引导程序,主要用于嵌入式系统的启动过程。
  uboot.img的获取主要依赖于瑞芯微官方SDK包中的u-boot文件夹。我们需要使用该文件夹去编译生成适配当前芯片的uboot。
  首先,我们要选配置文件(开发板是哪个就选哪个)。配置文件一般都在存放在 uboot/configs中,其中,所有的配置文件均是以 配置名_defconfig 结尾。
在这里插入图片描述
配置命令操作:
make + 配置文件 即可快速的配置 uboot
由于我使用的开发板是rk3588,所以我的配置命令操作就为:
make rk3588_defconfig
配置完成后,指定架构和编译器进行编译即可。
命令:make -> x86 架构和 gcc 编译器

我的如下:

make ARCH=arm64 CROSS_COMPILE=/home/zht/RK3588S/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-

如果编译的时候找不到这个交叉编译工具,就把该编译器的路径导入到etc/profile初始化脚本文件中。
注意:更改初始化脚本文件后,需要重新启动虚拟机才能生效。

这里也可以使用官方写好脚本去编译,但没有上述方法通用。
./make.sh rk3588 ----- rk3588_defconfig

最后,生成文件一般都在u-boot文件夹中。每个厂商移植的 uboot 生成的文件名字都不一样,具体看厂商的帮助文档。
大部分的 uboot 最终生成文件一般是 u-boot.bin、u-boot.img、uboot.img这三种。

2.2 boot.img

  boot.img是有kernel编译生成的镜像文件,Linux内核(kernel)是操作系统的核心部分,几乎管理着操作系统的所有的功能。

内核的五大功能:

功能作用
进程管理控制进程的创建、调度、终止以及进程间的通信,确保多任务处理的高效和稳定。
内存管理负责分配和回收系统内存,包括虚拟内存管理、分页和分段,以优化内存使用和系统性能。
文件系统管理提供文件和目录的管理,包括读写操作、权限控制和文件系统的抽象,支持多种文件系统格式。
设备驱动管理控制和管理硬件设备,提供通用接口让应用程序与硬件交互,支持不同类型的设备驱动。
网络管理实现网络协议栈,处理网络通信,包括数据包的发送和接收,支持各种网络协议和设备。

瑞芯微官方 SDK包里内核文件的介绍(部分):
arch : 存放的是一些和架构有关的文件夹,例如x86,arm,arm64等。
arch/arm64/boot/dts :设备树 --用于描述硬件设备的结构和配置,使得内核可以在启动时正确识别和初始化硬件。

xxx.dts :用于定义设备树的结构和配置相当于C 语言的.c 文件。
xxx.dtsi :设备树的头文件 相当于 C 语言的.h 文件
xxx.dtb:设备树编译生成的二进制文件 相当于 C 语言的 xxx.o 文件
Kconfig:Kconfig 文件用于配置Linux内核和模块的构建选项。它定义了内核选项的菜单结构、可配置项、默认值和依赖关系,支持用户通过 make menuconfig、make xconfig 等工具自定义内核配置。
因为内核的文件是居多的几万个文件,一个个操作十分麻烦,而通过Kconfig就可以轻松的管理这几万个文件了。
  内核是通过图形化界面的方式去管理的,图形化界面工具里的所有的选项都是来自于每一个目录下的每一个 Kconfig。

ipc:进程调度相关代码
mm:内存管理
Documentation:帮助文档
net:网络协议
lib:库
scripts:编译相关脚本工具
tools:编译相关工具
drivers:设备驱动
drivers/char — 他里边主要是存放咱们编写的字符设备驱动的代码
fs:管理文件系统的内容
COPYING:版本模块的一些介绍
CREDITS:光荣板信息(也就是哪些对内核做过贡献)
MAINTAINERS:记录了内核的每一个部分有哪些人员在维护

内核镜像的获取
  想要获取内核的镜像文件,需要按照当前需求对内核进行配置和裁剪。配置和裁剪内核是为了优化内核镜像的大小性能。通过选择合适的选项和剔除不必要的功能,可以减少内核的体积、提高启动速度,并减少内存占用,使得内核更适合特定硬件和应用场景。这样可以提升系统的整体效率响应能力
在这里插入图片描述

  这里内核提供了一个图像化裁剪配置工具 menuconfig。它提供了一个基于文本的界面,允许用户通过选择和取消选择选项来配置内核功能。
只需在内核中输入make menuconfig即可启动。

menuconfig工具选项讲解:
[ ]:他是一个二值选项,按空格或输入y出现 * 号就代表选择上了。
<>:他是一个三值选项,和[ ]相比多了一个M选项,代表动态编译这个功能。

动态编译生成镜像时,会单独生成一个可执行文件,需要手动添加到内核中,多用于测试。
静态编译生成镜像后会直接集成到内核镜像中。

清空配置信息
make distclean 清空编译内容 还原内核配置的最原始状态
make distclean ARCH=arm

内核配置文件路径:
SDK/kernel/arch/arm64/configs/rockchip_linux_defconfig

选型配置命令格式
make 配置文件 ARCH=arm64
例程:make rockchip_linux_defconfig ARCH=arm64

内核编译命令:
make ARCH=arm64
CROSS_COMPILE=/home/lyx/RK3588S/prebuilts/gcc/linuxx86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linuxgnu/bin/aarch64-none-linux-gnu-
  所有版本的内核都可以通过 make menuconfig ARCH=arm64即可进入内核配置界面

内核最原始的生成的镜像是:
32bit 的芯片: arch/arm/boot/zImage(uImage)
64bit 的芯片: arch/arm64/boot/zImage(uImage)
最原始的内核生成的设备树文件:
32bit 的芯片: arch/arm/boot/dts/xxxxxx.dtb
64bit 的芯片: arch/arm64/boot/dts/rockchip/xxxxxx.dtb
瑞芯微修改过内核使用脚本将内核镜像 + 设备树二进制文件合成了一个文件 boot.img在内核的最开始的目录。

2.3 rootfs.img

在这里插入图片描述

上图是Linux下的根文件系统(Root Filesystem)整体文件结构,下图是部分文件的作用。

文件名作用
/根目录是文件系统的顶层,所有其他目录都从这个目录派生。它是文件系统的起点。
/bin存放系统启动和运行所需的基本命令和程序,也就是一些二进制可执行文件,如 ls, cp, mv, rm 等。
/boot存放启动加载器(bootloader)和内核文件,如 vmlinuz(压缩内核镜像)和 initrd(初始 RAM 磁盘)。
/dev包含了系统识别的所有设备,设备文件是与硬件设备(如磁盘、打印机、串口等)进行交互的接口。Linux 下一切皆文件 — 你操作任何东西其实都是在操作文件,硬件同时也被抽象为了一个文件,他是一个特殊的文件,设备节点文件
/etc存放系统配置文件和启动脚本,如 passwd(用户信息)、fstab(文件系统表)和 network 配置文件。
/home每个用户的家目录都位于 /home 目录下,如 /home/user1。主要存放普通用户的个人文件和配置。
/lib存放共享库(libraries),这些库是供系统工具和应用程序使用的动态链接库。
/media用于挂载可移动媒体(如 CD-ROM、USB 驱动器)。系统自动挂载设备到这个目录下。
/mnt提供一个临时的挂载点,通常用于手动挂载文件系统。
/opt用于安装第三方应用程序和软件包。如QT、交叉编译器。
/root是超级用户(root)的家目录,和 /home 中的用户目录类似,但它是系统管理员使用的目录。
/sbin存放系统管理员使用的系统二进制文件和工具,这些工具通常用于系统管理和维护,如 fsck, reboot, ifconfig。

  想要制作根文件我们需要使用开源工具Buildroot,使用Buildroot可以极大加速我们构建linux根文件系统的速度。PS:制作根文件系统的三大神器:busybox、buildroot、yocto。
  Buildroot 除了能够制作根文件系统,还能制作kernel和uboot,不过其制作根文件系统制作的最好,其他都是后来附加的功能。
Buildroot的获取—官网下载:https://buildroot.org/

编译文件之前需要安装的必要库

sudo apt-get install gitk git-gui u-boot-tools device-tree-compiler gccaarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev autoconf 
autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make binutils buildessential gcc g++ bash patch gzip gawk bzip2 perl tar cpio python unzip rsync 
file bc wget libncurses5 libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git 
mercurial rsync openssh-client subversion asciidoc w3m dblatex graphviz 
libc6:i386 libssl-dev expect fakeroot cmake flex bison liblz4-tool libtool keychain 
expect-dev

Buildroot启动
buildroot 和 uboot、Linux kernel 一样也支持图形化配置,输入如下命令即可打开图形化配置界:
make menuconfig
剩下就是按需配置生成了。生成完后,该文件会在/output/images下生成一个压缩包,需要用官方给的指令制作生成

2.4 整体编译

  除了上述讲的三个单独编译,我们也可以使用瑞芯微官方给的工具进行整体编译,直接生成update.img。

先配置环境:
./envsetup.sh
启动编译器:
./build.sh lunch
整体编译命令:
./build.sh

PS:其实这里也可以单独编译uboot,kernel和rootfs,不过该方法不通用,仅适用于官方提供工具的情况下。

./build.sh uboot — uboot.img
./build.sh kernel — boot.img / zboot.img
./build.sh rootfs — rootfs.img

三、镜像文件烧录

  文件烧录需要借助第三方工具,此处使用的是瑞芯微官方提供烧写工具,使用烧录工具前记得先安装一下驱动

烧录工具界面介绍:
在这里插入图片描述
1.ADB烧录模式
  一般设备正常时,插线上电后的默认模式就是该模式。在此模式下,我们可以通过终端命令和硬件设备进行交互。
2.LOADER模式
想进入该模式,只需在ADB烧录模式下,点击切换即可。
此模式下,我们可以单独的去烧写 uboot、kernel、rootfs这三个的镜像文件。
但是在烧录之前我们需要导入烧录到的硬件地址,烧录位置的地址文件在rockdev目录下。
在这里插入图片描述
如何导入?
将鼠标放到烧录工具面板上,鼠标右键,点击导入配置即可。

3.MASKROM 模式
想进入该模式,我们需要在LOADER模式下,先点击高级功能,再点击进入Maskrom即可。
在这里插入图片描述
进入到该模式,我们点击升级固件
在这里插入图片描述
此处我们就可以导入update镜像文件进行整体烧录了。

烧录时,不小心将设备烧成砖了怎么办?
  设备上电后,同时按着 reset 和 boot 按键,然后先松开 reset 再松开 boot。此时我们就可以直接进入到Maskrom模式,重新进行镜像烧录。


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

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

相关文章

免费批量Excel文件合并、拆分软件

软件介绍 下载地址&#xff1a;https://pan.quark.cn/s/ae860a4e2ccb 1.多个XLS或XLSX格式EXCEL文件合并&#xff0c;合并后可使用数据透视表进行相关操作。 2.自动合并多个EXCEL文件的第一个工作表&#xff0c;并汇总成一张表&#xff0c;可根据所有列标题需要指定需要的列。 …

pdf压缩到指定大小,分享2024年最新7款pdf压缩免费版

pdf是一种全球广泛使用的文件格式&#xff0c;它可以在不损失质量或文本对齐的情况下安全传输文档。然而&#xff0c;许多文件共享应用和网站对于可以上传或分享的pdf文件大小设定了限制。在这种情况下&#xff0c;您可能需要一款可以帮助您减小pdf文件大小的软件。pdf压缩免费…

《汇编语言》第11章——实验11编写子程序

编写一个子程序&#xff0c;包含任意字符&#xff0c;以0结尾的字符串中的小写字母变成大写字母&#xff0c;描述如下。 名称&#xff1a;letterc 功能&#xff1a;将以0结尾的字符串中的小写字母变成大写字母 参数&#xff1a;ds:si指向的字符串首地址 assume cs:codesg d…

本地部署 Google Gemma 开源模型

Google Gemma 是 Google AI 团队开发的基于Transformer的轻量级大语言模型&#xff0c;Gemma 模型已开源并在各种硬件平台上保持良好性能&#xff0c;记录下本地部署过程并在多种情景下使用情况。 一、环境配置 1、下载并安装Ollama 在 Windows 上下载 Ollama &#xff0c;选…

什么牌子的可视耳勺最好用?力荐四款热门品牌!

可视挖耳勺近几年越来越火爆&#xff0c;各种款式层出不穷&#xff0c;在可视挖耳勺的挑选上&#xff0c;我需要提醒大家一定要避雷劣质可视挖耳勺产品&#xff0c;劣质可视挖耳勺产品普遍不做核心性能的反复调教&#xff0c;成像清晰度低、耳勺出现发烫、性能不稳定等问题是时…

web渗透:CSRF漏洞(跨站请求伪造)

目录 CSRF漏洞 深入研究 CSRF攻击常见于哪些类型的网站&#xff1f; 如何通过HTTP Referer头来防范CSRF攻击&#xff1f; 为什么设置Cookie的SameSite属性对预防CSRF有帮助&#xff1f; 导图 CSRF漏洞 CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪…

MySQL——事务与存储过程(一)事务管理(4)事务的隔离级别

数据库是多线程并发访问的&#xff0c;所以很容易出现多个线程同时开启事务的情况&#xff0c;这样就会出现脏读、重复读以及幻读的情况&#xff0c;为了避免这种情况的发生&#xff0c;就需要为事务设置隔离级别。在 MySQL 中&#xff0c;事务有4种隔离级别&#xff0c;接下来…

Linux安装Docker与基本指令

1、什么是Docker Dokcer是一种开源平台&#xff0c;主要用于创建、部署和管理容器化应用程序&#xff0c;它通过将应用程序以及所有的依赖打包到一个轻量级的、可移植的容器中&#xff0c;使得应用可以在任何环境中一致的运行! 1.1、Docker的优点 一致性和可移植性 跨环境一致…

删除微信重复文件的简易工具

去我的个人博客观看&#xff0c;观感更佳哦&#xff0c;&#x1f619;&#x1f619; 前言 !!!!温馨提示&#xff1a;假如你是小白&#xff0c;啥都不懂&#xff0c;请直接跳到文章的最后!!! 原本我是没想写这篇文章&#xff0c;契机是某一天我突然打开微信的存储空间占用才发…

5款手机版的影视解说文案生成器,无须下载更方便!

在这个自媒体的红利时期&#xff0c;影视解说创作占据了内容创作的很大一部分。而影视解说文案则是帮助观众更好地理解和欣赏影视作品的重要点。随着手机的普及&#xff0c;越来越多的人希望能够在手机上方便地生成影视解说文案创作。今天&#xff0c;我们就来介绍5款手机版的影…

Shared memory bank conflicts

共享内存和bank: 在CUDA架构中&#xff0c;共享内存是一个非常快速的内存类型&#xff0c;它位于每个线程块内部并为该线程块内的所有线程提供服务。为了实现高吞吐量的访问&#xff0c;共享内存被划分为多个独立的存储区域&#xff0c;称为“banks”。每个bank可以在单个时钟…

创新微MinewSemi推出基于Nordic nRF54系列芯片 SoC 低功耗蓝牙5.4模组

在物联网技术飞速发展的今天&#xff0c;创新微MinewSemi隆重推出基于Nordic最新nRF54系列芯片SoC的ME54BS01和ME54BS02全新低功耗蓝牙5.4模组。这两款模组的问世&#xff0c;标志着我们在推动物联网设备智能化、高效化道路上的迈出了坚实的一步&#xff0c;展示了对未来技术的…

回归预测|基于卷积神经网络-鲸鱼优化-最小二乘支持向量机的数据回归预测Matlab程序 CNN-WOA-LSSVM

回归预测|基于卷积神经网络-鲸鱼优化-最小二乘支持向量机的数据回归预测Matlab程序 CNN-WOA-LSSVM 文章目录 一、基本原理1. 数据预处理2. 特征提取&#xff08;CNN&#xff09;3. 参数优化&#xff08;WOA&#xff09;4. 模型训练&#xff08;LSSVM&#xff09;5. 模型评估和优…

World of Warcraft [CLASSIC][80][Grandel] Mount with 310% speed

310%速度的坐骑【被感染的始祖幼龙】 永恒之眼&#xff08;3个&#xff09; 纳克萨玛斯&#xff08;9个&#xff09; 10人副本&#xff0c; 白马 &#xff08;DPS N&#xff09;黑马&#xff08;DPS N&#xff09;绿马&#xff08;T N DPS&#xff09;红马&#xff08;T …

诚信为金:揭秘好征信的六大黄金标准,并实践守护好它的五大秘籍

什么是好征信&#xff0c;怎么守护它 咱们平时总听人说“征信”&#xff0c;“征信”到底是个什么东西&#xff0c;但很少人能透彻的了解它。它是一个有点神秘但又挺重要的东西&#xff0c;简单说&#xff0c;它就是咱在金融界的一张“身份证”&#xff0c;记录着咱们的信用表…

【C++ Qt day3】

2、设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。

【2024 CCF编程能力等级认证(GESP)C++ 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 集成开发环境3.3 结构化程序设计3.4 程序的基本语句3.5 程序的基本概念3.6 基本运算3.7 基本数据类型4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…

13.DataLoader 的使用

DataLoader 的使用 dataset&#xff1a;告诉程序中数据集的位置&#xff0c;数据集中索引&#xff0c;数据集中有多少数据&#xff08;想象成一叠扑克牌&#xff09;dataloader&#xff1a;加载器&#xff0c;将数据加载到神经网络中&#xff0c;每次从dataset中取数据&#x…

JAVA中的线程池说明二

目录 1.引入 2.参数解释 3.标准库中提供的四个拒绝策略 1.引入 java.util.concurrent 这个包里面放的很多类都是和并发编程(多线程编程)密切相关&#xff0c;这个包简称JUC&#xff1b;今天我们主要来了解Java线程池的相关知识。 2.参数解释 在这里&#xff0c;我们主要讲…

无痛除毛,告别异味,希喂、有哈、小米宠物空气净化器真实测评

养宠在年轻人生活中逐渐成为一种新的潮流&#xff0c;越来越多的人加入到铲屎官的队伍。其中&#xff0c;养宠最多的品类非猫咪莫属&#xff0c;凭借自身可爱的外表收获人们的芳心。同时猫咪也是宠物中掉毛最严重的&#xff0c;漫天的浮毛在家中不断飘散&#xff0c;带来无尽的…