嵌入式平台快速开发-Tftp 服务器搭建与配置
写在开头经常在嵌入式开发板做研发的人都知道,在编译机编译出产物后,如何在开发板上使用是一个比较繁琐的问题,一个比较简单易行的方法是准备一个 SD 卡,将内容通过读卡器写到 SD 卡里,然后插入到开发板上使用。
这样的流程虽然很简单易行,但对 SD 卡的反复拔插对 SD 插槽寿命是一个极大的考验。且如果需要在短期内依次做出大量的修改,反复拷贝/插入SD卡也是一种折磨的体验。
本文就是为了解决这个问题,通过在主机建立 Tftp 服务器,用网线连接开发板与主机,每次启动时开发板可以直接下载主机的编译产物来使用。
物理配置使用网线将 PC 与 开发板连在一起。
PC 配置
主机的版本 Ubuntu 22.04
安装 TFTP 服务器软件包 12sudo apt-get updatesudo apt-get install tftpd-hpa tftp-hpa
创建 TFTP 根目录并设置权限,这里以在用户目录下 TFTP 目录为例。 123mkdir -p ~/tftpsudo chown -R $USER:$USER ~/tftpsudo chmod -R 755 ~/tftp
编辑 tft ...
ZCU102提升-USB 实际测试
写在开头接上篇,研究完 ZCU102 USB 理论后,进行在 Hvisor 上进行 USB 直通的尝试。
设备树修改在现有能够正常在 ZCU102 上工作的精简设备树进行修改,加入 USB 及其关联设备的设备树节点。关系图如下:
可见引入一个 USB 会同时引入很多设备。这使得此次尝试变得复杂起来。
Hvisor 修改为前述所有新增设备在 Hvisor 中配置直通区域和中断号。
Qemu 测试自行编译的内核测试使用自行编译的内核测试,成功启动 RootLinux,但 USB 为启动,提示 USB 驱动因为前置驱动未启动而被挂起。排查过配置本身后怀疑自行编译内核缺少相关驱动,换为 BSP 中自带的内核进行测试。
BSP 内核测试使用 BSP 中自带的内核进行测试,成功启动 RootLinux,且内核日志有了正确的 USB 启动信息。
上板测试有了 Qemu 测试的经验,直接在板上使用 BSP 自带内核进行尝试,发现卡死在内核启动,回档到最开始的精简设备树,可以正常启动。证明此问题由最近对设备树的改动产生。一个个增减设备,最后定位到 Clock-generator,其设备树描述如下: ...
ZCU102提升-USB 理论研究
写在开头最近在研究 ZCU102 的 USB 模块,借此把此 USB 模块及其边缘内容一起研究总结一下。
实物结构ZCU102 的 USB 接口在图中 5 标,其中用红框圈起来的是跳线位置,关于跳线是什么后面会介绍。
USB 接口为不常见的 Micro USB(3.0) Type-B 接口,主要用于移动硬盘盒。
我不是很理解为什么 ZCU102 USB 做成了如此罕见的接口,让使用变得困难,但好在 ZCU102 开发板随箱子附带了 TypeB 转 Type-A 母口的转换器。
USB 模块架构图本篇文章以下图作为主线,分别对每个模块展开研究。
USB MIO
GPIOGPIO 是一种芯片与外部电路相连接的引脚(划重点),全称是 General Purpose Input Output 通用功能输出输出,目的是实现功能复用,其结构如图所示,左边接到外设、右边接到芯片。
功能复用是指:GPIO的引脚可以由CPU配置成不同的工作模式和工作电压,一共有八种工作模式:上拉输入、下拉输入、浮空输入、模拟输入、推挽输出、开漏输出、复用推挽输出、复用开漏输出。
举个例子,在输入功能下,CPU可以 ...
Vue3 + Fastapi 前后端框架搭建
写在开头时隔一年,重走前后端开发路,正好比较有时间,打算好好将开发过程中有价值的点记录一下,对自己也是一种记忆,也方便后来使用相同框架的人快速上手。
Vue3 前端介绍
截止 2025 年 1 月 22 日,Vuetify 3 框架在 github 上有着 40.2 k 的 Star,我在前几年完全没听过这个,可见其这几年发展之快。
笔者了解了一下发现其组件较为全面,社区也比较完善。并且完全开源
搭建从原生的 vite 搭建 vue3 前端我认为是吃力不讨好的,所以直接基于 Vuetify 3 框架的模板来作为前端的 base。
初始化模板非常简单,只需要 npm create vuetify@latest 即可,期间会有一些选项要求配置,例如:1234567891011success Installed "create-vuetify@x.x.x" with binaries: - create-vuetify? Project name (项目名): ❯ vuetify-project //生成应用程序的文件夹? Use TypeScript (使用 Ty ...
基于ubuntu_base构建文件系统
写在开头经常搞 Liunx 的人都知道,文件系统是 Liunx 不可或缺的一部分,难免会遇到需要自己定制一个文件系统的情形,本篇文章就是讲述了基于 ubuntu_base 来定制一个文件系统的方法。
环境准备
如果想要构建的文件系统和构建时所用的平台不一样,则需要创建一个模拟环境,创建也很简单,安装 qemu-user-static 即可。例如apt install qemu-user-static。
获取 ubuntu_base,直接从官网下载即可,如果访问异常就挂一个代理,至于版本选择,一般情况选新不选旧,但也要结合你的实际情况。
配置根文件系统以 ubuntu-base-24.04.1-base-arm64 为例:
解压根文件系统: tar -xvf ubuntu-base-24.04.1-base-arm64 -C 目标文件夹
为根文件系统配置网络: cp /etc/resolv.conf ubuntu-base-24.04.1-base-arm64/etc/resolv.conf
更换 apt 的软件源: sudo vim ubuntu-base-24.04.1-ba ...
扩充ext4镜像的几种方法
写在开头使用 ext4 镜像作为文件系统时,如果需要向其中添加某些大型文件,则可能会遇到镜像空间不足的问题,本篇尝试对此给出几种解决方案。
无大小对齐要求的扩容如果对最终的大小没有对齐要求,则可以直接采用如下方式:
创建一个空的镜像,需求扩容多大创建多大:dd if=/dev/zero of=blank.ext4 bs=1M count=需求大小
将额外的空白文件追加到镜像文件中:cat blank.ext4 >> myimage.ext4
修复文件系统:e2fsck -f myimage.ext4
调整文件系统大小:resize2fs myimage.ext4
有大小对齐要求的扩容操作如果对最终的大小有对齐要求,则推荐创建一个指定大小的空的ext4新镜像,将旧镜像内容复制到新的镜像中:
创建一个空的镜像,需求扩容多大创建多大:dd if=/dev/zero of=myimage.ext4 bs=1M count=需求大小
在空镜像上建立ext4文件系统:mkfs.ext4 myimage.ext4
将空镜像、旧镜像挂载:1234mkdir myimagesudo m ...
uboot-FIT-image 学习
背景FIT image 是嵌入式常用的 bootloader 为了响应 ARM Unify Kernel 而推出的一种镜像格式,其本质是内核、设备树、文件系统合并成一个文件的镜像,并且其中可能包含多个内核、设备树、文件系统等。Unify Kernel 是指将同一内核运行在不同的硬件平台之上。即编译 Linux 内核无需指定具体架构和SOC,其如何兼容不同开发板、平台由 DTB 完成。Bootloader 在启动时,根据硬件环境、选择不同的 DTB 文件,即可使 Linux Kernel 运行在不同的硬件平台上。
FIT-image 简介正如上所说,为了支持 ARM 的 Unify Kernel 构想,需求 Bootloader 提供选择不同 DTB 的能力,过去我们一般都是自行通过 FATLOAD 将需要的 DTB 加载到内存的指定位置,然后通过 BOOTM {Kernel_addr} - {DTB_addr} 来完成这项工作的。
Uboot 为了简化这种过程,推出了全新的 Image 格式 —— FIT uimage,来自动化上述过程。其中 FIT 是指 Flattened Ima ...
ARM-Trusted-Firmware 学习
前言在 ARMv8 之后,Uboot 在启动前需要先进行 ATF 的初始化,为了充分了解启动过程,对 ATF 进行了一波学习,总结在此篇文章中。
ATF 概念安全是操作系统领域这些年经常提到的话题,TF(Trusted Firmware)是 ARM 为了提升安全在 ARMv8 引入的安全解决方案,其包括了启动和运行过程中的特权级划分。由于 TF 是 ARM 引入,所以也叫 ATF,其实现上有两种 Profile,对 arm-a 系列的 TF-A,对 arm-m 系列的 TF-M,由于 a 系列使用较多的原因经常不区分 ATF 和 TF-A。
其作用是细化了特权级,帮助进行安全侧与非安全侧的切换,如下图所示,EL3 即为 ATF 的一部分。
在实现上,EL0 和 EL1 是 ATF 必须实现的,EL2 和 EL3 可选。EL0-EL2 每一个层次又可以分为安全和非安全两部分,EL3 只有安全模式一种。
ATF 的作用是建立一套从启动到执行的信任链,借此提高 ARM 架构的安全性。
ATF 功能过去的 ATF 只是为了电源管理,以及 Trust_zone 的切换,现在随着技术的不断发展, ...
ATF Uboot Linux 交叉编译命令留档
交叉工具链配置1234# 下载需要的交叉编译链# 解压到目录# 加入环境变量 /etc/profileeg: export PATH=$PATH:/home/hangqi-ren/tools/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:/home/hangqi-ren/qemu/qemu-7.2.12/build
Uboot 编译1234567# 拉取 2022.10 版本的 Uboot 且只拉取最新的 Commit.git clone https://github.com/u-boot/u-boot.git --depth 1\ --branch v2022.10# 生成 .config 文件make qemu_arm64_defconfig# 交叉编译make -j$(nproc) CROSS_COMPILE=aarch64-none-linux-gnu-
Linux 编译1234567891011121314# 官网下载 Linux 任意版本源码https://cdn.kernel.org# 使用默认配置mak ...
ARM-Gicv2 第四章学习
第四章标题是编程模型
该章主要介绍了寄存器位置、每个寄存器的详细用法。建议当工具章进行查阅使用,所以未进行深入学习,这里放一个 GICV2 文档链接。
Gicv2-Spec