首页 > 系统相关 >Linux驱动(一):环境搭建及介绍

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

时间:2024-08-30 18:22:52浏览次数:11  
标签:文件 uboot img boot 编译 内核 Linux 驱动 搭建

目录


前言

  自用自用自用,晚上睡觉前复盘用。当然,也欢迎大家参考指正。积极认错,坚决不该(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模式,重新进行镜像烧录。


标签:文件,uboot,img,boot,编译,内核,Linux,驱动,搭建
From: https://blog.csdn.net/Jokerblank/article/details/141604383

相关文章

  • 智慧监管:地理信息与遥感技术驱动下的社会治理新纪元
    在信息化浪潮席卷全球的今天,智慧监管已成为推动社会治理现代化的关键力量。本文将深入剖析智慧监管的概念、技术基础、应用场景及其对社会发展的深远影响,探讨如何在新时代背景下,利用地理信息与遥感技术构建更加智慧、高效的监管体系。智慧监管:定义与核心理念智慧......
  • 构建智慧人才档案,驱动未来发展新引擎 —— 解锁人才管理新篇章
    在这个日新月异的时代,人才已成为企业最宝贵的资源,是推动社会进步和企业持续发展的核心动力。如何高效、精准地管理人才,让每一位员工的潜能得以最大化释放,成为了每一个组织面临的重大课题。 人才档案报表不仅仅是一份简单的信息汇总,它是基于大数据与人工智能技术,对每位员工的基......
  • Linux操作文件和文件夹的常用基础命令
    文件和文件夹的查看ls:列出当前目录中的文件和文件夹。ls-l:以长格式列出文件信息,包括权限、所有者、大小、修改时间等。ls-a:显示隐藏文件(以.开头的文件)。ls-h:以人类可读的格式显示文件大小。文件和文件夹的创建touchfilename:创建一个新的空文件。mkdirdirname:......
  • 使用devpi-server搭建pypi本地缓存服务器
    使用缓存机制可以显著减少对外部源的请求量,从而提高下载速度,并降低被源站封禁的风险。下面详细解释如何在本地服务器上设置和使用pip缓存机制。缓存机制的基本原理缓存机制的原理是在本地服务器上保存已经下载过的Python包,当其他服务器请求同样的包时,本地服务器可以直接提供,......
  • 运维系列&AI系列&Lenovo-G双系统系列(前传-装之前搜索的):Ubuntu Linux开机黑屏的永久解
    UbuntuLinux开机黑屏的永久解决办法UbuntuLinux开机黑屏的永久解决办法问题:开机之后,没有图形界面,也无法使用命令窗口界面。解决办法1解决办法2:永久解决它底下评论问题一:请问黑屏了进不去,要怎样才能输入你说的这些呢作者回答其他人回答其他人回答问题二:我是能听见进到......
  • Linux之shell脚本变量
    变量是脚本种的一种重要的属性,它可以存储值,这就大大的增加了脚本的灵活性使得脚本的应用更为广泛。自定义变量变量名=值(等号两边不能有空格)在linux内可以定义变量然后用$引用如果要在调用后面加字符之类的则可以使用${变量名}字符环境变量系统帮你定义好的变量例如US......
  • Linux 高可用仲裁设备配置
    RedHatEnterpriseLinux7.4完全支持配置作为集群的第三方设备的独立仲裁设备。它的主要用途是允许集群保持比标准仲裁规则允许更多的节点故障。建议在具有偶数节点的集群中使用仲裁设备。对于双节点群集,使用仲裁设备可以更好地决定在脑裂情况下保留哪些节点。在配置仲裁设备,......
  • Linux
    1.用户管理1.1用户管理指令增加1)增加useradduseradd选项说明-u指定用户uid-s指定命令解释器,默认是/bin/bash-M不创建家目录[root@hmk888~]#useradd-u1314-s/sbin/nologin-Mmysqlpasswd修改密码passwd选项说明--stdin非交互设......
  • Linux驱动学习之PWM
    PWM介绍他就是一个总周期不变占空比可调制的方波!PWM的基础知识占空比:有效电平/周期周期:周期不用多说,高中正弦,余弦波都学过。分辨率:最小占空比(如把周期分为10份,那分辨率就是10%)Linux下的pwmLinux内核已经集成了pwm底层部分初始化,我们所要做的就是利用他给的接口,设置......
  • Linux驱动学习之input子系统
    简介input子系统就是管理输入的子系统,和pinctrl、gpio子系统一样,都是Linux内核针对某一类设备而创建的框架。按键、鼠标、键盘、触摸屏等都属于输入设备,linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了......