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

目录

  • 前言
  • 一、硬件配置及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.rhkb.cn/news/413063.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8个平面设计必备素材网站,免费下载。

平面设计师应该去哪里找免费可商用素材网站&#xff1f;我推荐这8个&#xff0c;赶紧收藏好。 1、菜鸟图库 菜鸟图库-免费设计素材下载 菜鸟图库是一个非常大的素材库&#xff0c;站内包含设计、办公、自媒体、图片、电商等各行业素材。网站还为新手设计师提供免费的素材&…

查看显卡cuda版本

1.命令行窗口 打开cmd&#xff0c;输入下列语句 nvidia-smi 如下图红框所示&#xff1a; 2.查看cuda版本&#xff0c;打开英伟达控制面板&#xff0c;桌面右键或者系统右下角&#xff0c;然后点击系统信息&#xff0c;之后点击组件

获取当前计算机的处理器架构platform.machine()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 获取当前计算机的处理器架构 platform.machine() 选择题 关于以下代码的输出结果说法正确的是&#xff1f; import platform print("【执行】print(platform.machine())") prin…

成都高温限电:当电动汽车「无电可充」

8月末的成都&#xff0c;因为高温限电了。 近几日&#xff0c;成都市气象台连续发布了高温红色预警信号。据新华社报道&#xff0c;8月21日&#xff0c;四川电网用电负荷两次创下历史新高&#xff0c;最高达6797万千瓦&#xff0c;较去年最大用电负荷增长近13%&#xff0c;电力…

代码随想录day1数组/字符串总结

二分法 按左闭右闭的区间处理 适合已经完成排序的&#xff0c;找target数——减少暴力遍历 元素移动类题目 两种方法&#xff1a; 1、双指针 移动规则不同&#xff1a; 移动条件不同\fast一次跳两步&#xff0c;slow一次一步 适合解决元素移动/排序/查找 链表中找环 f…

打手机检测算法源码样本展示打手机检测算法实际应用场景介绍

打手机检测算法是一种利用计算机视觉技术来监测和识别人们在特定区域如驾驶舱、考场或其他敏感区域非法使用手机的行为。这种算法对于提高安全性和确保规则的遵守具有重要意义。以下是关于打手机检测算法源码及其实际应用的详细阐述&#xff1a; 1. 算法实现 - 深度学习框架&a…

【北森-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

力扣134-加油站(java题解)

题目链接&#xff1a;134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法&#xff1a;局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最优&#xff0c;并…

源代码编译,Apache DolphinScheduler前后端分离部署解决方案

转载自神龙大侠 生产环境部署方案 在企业线上生产环境中&#xff0c;普遍的做法是至少实施两套环境。 测试环境线上环境 测试环境用于验证代码的正确性&#xff0c;当测试环境验证ok后才会部署线上环境。 鉴于CI/CD应用的普遍性&#xff0c;源代码一键部署是必要的。 本文…

【王树森】RNN模型与NLP应用(7/9):机器翻译与Seq2Seq模型(个人向笔记)

Machine Translation Data 做机器学习任务的第一步都是处理数据&#xff0c;我们首先需要准备机器翻译的数据。由于我们是学习用途&#xff0c;因此拿一个小规模数据集即可&#xff1a;http://www.manythings.org/anki/下面的数据集中&#xff1a;一个英语句子对应多个德语句子…

Sinc Function介绍

1、定义 Sinc函数全称&#xff1a;sine cardinal&#xff0c;也称作是sampling function&#xff08;采样函数&#xff09;。 2、分类 &#xff08;1&#xff09;归一化sinc函数&#xff1a; 这种定义在信号处理中被广泛采用&#xff0c;其中 x 是一个无量纲的变量&#xff0c;…

鸿蒙开发5.0【基于Swiper的页面布局】

场景一&#xff1a;Swiper页面支持自定义动画 方案&#xff1a; 给Swiper组件设置.nextMargin(50).prevMargin(50)属性。 给Swiper组件添加onChange事件&#xff0c;设置当前this.currentIndexindex&#xff0c;当currentIndex为首页或者尾页时&#xff0c;设置上一张以及下一…

生产环境中变态开启devtools(强制)

写到最前面 首先&#xff0c;你已经下载了google的插件【vue devtools】&#xff0c;不知道怎么下载&#xff0c;留言博主 如果你想看的项目中的vuetools插件打开是这样的 Vue.js is detected on this page. Devtools inspection is not available because it’s in product…

Unet改进14:添加SEAttention||减少冗余计算和同时存储访问

本文内容:在不同位置添加SEAttention注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 卷积算子是卷积神经网络(cnn)的核心组成部分,它使网络能够通过融合每层局部接受域内的空间和通道信息来构建信息特征。之前的广泛研究已经调查了这种关系的…

大模型之二十九-语音识别Whisper推理加速

在上一篇博客《大模型之二十八-语音识别Whisper进阶》中我们留了一个尾巴&#xff0c;就是在流式场景以及如何提升推理速度。 流式场景 流式场景分两种&#xff0c;一种是伪流式一种是真流式&#xff0c;伪流式就是bilibili或者YouTub&#xff0c;终端用户在观看视频的时候&a…

人工智能再次进化 善用AI提升营运效率

人工智能无疑为我们的生活带来不少便利&#xff0c;也为商界和社会发展作出了重大贡献。事实上&#xff0c;它的起源最早可以追溯到70年前&#xff0c;只可惜过往的 AI 技术尚未如现时般成熟&#xff0c;可以做到的事也远比现在少&#xff1b;直至近期的 AI 技术取得了重大突破…

人工智能领域正经历模型规模变革,小型语言模型(SLM)崛起,挑战“规模至上”观念。

在人工智能领域&#xff0c;一场关于模型规模的深刻变革正在悄然发生。长久以来&#xff0c;科技巨头们热衷于庞大语言模型&#xff08;LLM&#xff09;的开发竞赛&#xff0c;但如今&#xff0c;小型语言模型&#xff08;SLM&#xff09;正以其独特的优势逐步崭露头角&#xf…

【qt】qss使用

1.按钮设置颜色 ui->pushButton->setStyleSheet("QPushButton { color : red;}");也可以通过rgb来设置 ff表示红色拉满&#xff0c;gb为0当然是红色 这只是针对pushbutton对象的控件设置的&#xff0c;如果我想设置所有的按钮空间都是一个颜色 这是通过设置界…

dubbo:dubbo服务负载均衡、集群容错、服务降级、服务直连配置详解(五)

文章目录 0. 引言1. dubbo负载均衡1.1 负载均衡算法1.2. dubbo负载均衡使用1.3 自定义负载均衡策略 2. dubbo服务容错2.1 8种服务容错策略2.2 自定义容错策略 3. dubbo服务降级&#xff08;mock&#xff09;4. dubbo服务直连5. 总结 0. 引言 之前我们讲解了dubbo的基本使用&am…

使用 AI进行绘画初体验

大家好啊&#xff0c;我是董董灿。 AI 绘画的效果是真的不错&#xff0c;最近在查找AI相关技术文章时&#xff0c;总是会时不时的发现一些好玩的 AI 应用&#xff0c;而且大多数都是免费的。 今天就给大家介绍如何使用 MidJourney 来完成 AI 绘画的网站。 MidJourney 本身是…