目录
一、驱动编程
会分为两个部分
1. 底层驱动编程
在底层驱动编程中,会有两个核心
环境搭建 --- Linux 操作系统
底层驱动开发方法
字符设备文件 --- 依附于系统运行
2.后期上层的音视频开发
编译 SDK、裸机启动流程、烧录固件
驱动编程的环境要求
至少 ubuntu 需要 80G 的内存 ,编译的时候最好用 4G 的运行内存
1.1 运行内存修改
首先需要将虚拟机关机
1.2 设置管理员密码
sudo passwd root
二、SDK 的编译
2.1 SDK 含义
软件开发工具包(Software Development Kit,SDK)一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。
常见的名词 SDK、API、OTG 等
在嵌入式开发中,SDK 一般情况下为.tar.??文件,如果是在找不到,就问厂家,SDK 在当前的驱动开发中是一个简化了环境搭建过程的方式
开发者只需要使用极少的操作就可以完成一个完整操作系统镜像的生成
好与坏 :
好在于:操作简单
不好在于:对于硬件设备要求较高
官方给的参考虚拟机硬件环境 --- 8 核+16G+200G
在这样的硬件环境下,才勉强能够编译成功,另外不好在于对于环境的更改,刚上手可能比较迷茫
2.2 获取 SDK
确保网络连接
2.3 安装一系列的依赖库
编译环境的时候,会依赖一部分其它的库
例如:在编译 mysql 程序的时候,就要依赖 libmysqlclient-dev
2.4 解压 SDK
tar -xf 包的名字
sync //sync同步数据
2.5 释放缓冲区
sudo rm ~/.cache/vmware/ -r
df -h
SDK 中的重要内容
buildroot:文件系统制作工具
build.sh:这个是最直观的接触的编译文件
shell 脚本 --- 将一堆指令集合成为一个指令
kernel:内核文件夹 --- 用来编译程序
设备树
prebuilts:存放了交叉编译工具
rockdev:存放编译完成的镜像
2.6 编译 SDK
设置临时交换分区
作用在于:尽可能避免编译出错
要求物理内存>=4G
选 5 然后输入: ./build.sh
编译的内容,主要为:
uboot,内核,文件系统 --- 这三者是一个操作系统的重要组成部分
uboot 启动引导程序 --- 作用相当于 --- BIOS
内核:Linux 下的核心部件
文件系统:系统的组成部分之一
内核和文件系统都是操作系统的重要组成部分
2.7 编译问题
问题原因:硬件资源不足以支持编译的工具 解决:1、每次报错都重新执行
问题原因:中文路径
解决方式:1、可以先尝试将 SDK 整个文件夹 mv 到没有中文路径的文件夹中,然后重新编译
2、如果不行,那么就将 SDK 文件夹删除,然后将 SDK 压缩包放到没有中文路径的地方进行解压,重新编译
2.8 编译完成的标志
三、底层驱动编程
3.1概念
Linux 下一切皆文件
键盘是一个文件:/dev/input/event1
鼠标是一个文件:/dev/input/event2
屏幕是一个文件:/dev/fb0
对于我们来说,系统编程是使用了系统的文件接口
驱动编程要求我们自己去写一个文件的文件接口
而这个文件叫字符设备文件 --- c
字符设备文件对应的就是接入系统的一个硬件设备,换句话说:驱动编程是将一个硬件设备描述成为一个文件,系统通过操作这个文件进而操作硬件设备/获取硬件设备信息,我们是需要去描述这个文件接口
四、裸机启动流程
4.1概念
BL 的含义 --- BootLoader → 引导加载
BL0
存在于芯片的 IROM --- 内部静态存储
这里的程序不可访问,不可更改
由芯片厂商提供
不同于 MCU --- MCU 的 IROM是(内部 Flash)
烧录 hex 文件的时候 --- 写
板子运行的时候 --- 读
主要先去失能系统中的各种外设:看门狗,中断,数据缓冲区等等
然后初始化:IRQ 和 SVC 栈空间,初始化 ZI(已经初始化的变量)和 RW(没有初始化的变量),获取复位状态,设备时钟分频和倍频,判断启动方式,检测 BL1 的完整性和安全性,跳转到 BL1 阶段运行
BL1
从芯片的 IROM 出来到新的存储介质去运行 --- 硬盘,SD 卡
BL0 和 BL1 阶段的程序非常相似
由芯片厂商提供,不可修改 --- 正常情况下只会给你一个.bin 文件
初始化 IRQ 和 SVC 栈,判断低功耗,判断启动方式,检测 BL2 阶段的完整性和安全性,跳转到 BL2 阶段运行
BL2
可以由开发者去裁剪
uboot --- 简单理解为 BIOS,用于引导系统
初始化时钟 --- 2.4GHz,初始化内存 --- DRAM(速度更快,空间更大)
搬运内核到 DRAM 中运行 --- 系统是运行在运存中,存储在应判断
初始化 IRQ 和 SVC 栈,设置时钟主频,初始化 DRAM,判断启动方式,将系统搬运到 DRAM 中运行
BL2 阶段真正的程序就是 uboot
uboot 搬运的是内核,内核最终再去挂载文件系统,文件系统运行之后再去执行应用程序 --- 完整的系统才算启动
五、硬件环境
使用的芯片是 --- RK3588s
8 核 64 位处理器 --- 4 大核 A76 + 4 小核 A55
主频 --- 2.4GHz
4G+32G
六、超级终端的安装
安装在 windows 下
只需要更改路径 --- 路径最好不要在 C 盘,不要有中文
七、固件烧录
7.1 驱动安装
是为了能够正确的识别板子
7.2 固件下载
配置文件的作用:规划了 uboot,内核,文件系统需要存放的位置 --- 地址信息
不同的板子的地址信息是不同的
parameter.txt 是一个链接文件,需要找到他的源文件
7.3 挂起虚拟机
板子,双端 USB 的蓝色线,电源
双端 USB 的蓝色线接在板子上的 USB3.0 接口(唯一一个蓝色的)
板子有三个模式
ADB 模式
调试模式 --- 板子正常运行的模式
在这个模式下可以运行自己的程序
LOADER 模式
烧录单个固件
例如:单独烧录内核
但是对于 RK3588s --- 可以在 LOADER 模式下烧录整体的镜像
MASKRAM 模式
烧录整体固件的模式
今天用来烧录 --- update.img
八、板子的调试
8.1 安装 ADB 插件
adb shell --- 将当前终端作为嵌入式设备的终端
在板子的终端之下,几乎所有的 Linux 指令都可以用
板子和 ubuntu 的架构不同,双方的可执行程序在彼此的系统上无法运行,所以就需要交叉编译工具
adb push ubuntu 下的文件 到 板子终端的路径
将 ubuntu 下的文件传输至板子终端的路径
当出现下述错误,说明生成可执行程序的交叉编译工具不对
8.1 配置交叉编译工具
添加交叉编译工具路径
export PATH=$PATH:/home/lll/driver/RK3588S/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
如果执行这个语句出错,那么就说明刚才加的语句有问题
重启虚拟机
8.2 找不到方舟