【 Intel/Altera FPGA技术实战 】Stratix 10 SOC U-Boot & ATF (Arm Trusted Firmware) Build(六)

一、前言

上节我们已经大致介绍了Stratix 10 SOC的Boot机制,在此基础上提出了Boot方式的选择方法,Boot系统架构的设计建议,软件开发、调试的所需文件/依赖等。

而我们GHRD(Golden Hardware Reference Design)工程自定义设计的开发调试是通过JTAG加载实现的,就需要软件生成JTAG加载所需的文件/依赖,那么我们就先来准备软件开发、调试的所需文件/依赖。

我们之前通过Quartus工具综合 + 实现已生成sof(1)文件,这里还需要HPS FSBL(2)文件,然后再把sof(1)文件和HPS FSBL(2)文件打包成HPS SOF(3)文件,HPS SOF(3)文件才能用于JTAG加载启动。

由上图可知,需要通过HPS Bootloader源码编译生成HPS FSBL(2)文件,这里与之前的FPGA器件通过Quartus工具的BSP Generator生成FSBL的方式不同,优势在于:之前的生成FSBL的方式需要依托于EDA工具高度定制,每板需要一个镜像;而Stratix 10和Agilex器件使用开源的U-boot源码,一个镜像可以适配多个板。

接下来向大家step by step的展示HPS FSBL的编译过程,编译过程中会遇到一些问题,让我们一起来解决,希望对大家后续的开发有帮助。

二、准备
1. EDA工具:Quartus Prime Pro 25.1(或其他版本,建议25.1以上)
2. Linux 操作系统:建议 ubuntu 22.04
3. 或者 Windows 操作系统:建议 Windows 11 安装 WSL,具体搭建方式请参考:【 Intel/Altera FPGA技术实战 】Stratix 10 SOC GHRD工程搭建(一)_altera fpga windows开发 平台搭建-ZEEKLOG博客
三、U-Boot编译
1. U-Boot Build流程具体请参考:Building Bootloader for Stratix10 | Documentation | RocketBoards.org,大致如下图所示;
2. 在GitHub下载U-Boot源码;

U-Boot源码下载链接:GitHub - altera-fpga/u-boot-socfpga: Official Intel SOCFPGA U-Boot repository. Note: (1) A "RC" labeled branch is for internal active development use and customer early access without official customer support. (2) Latest stable branch (no RC labeled) is strongly recommended for development and production use outside of Intel. (3) See doc/README.socfpga for Quartus and Device support.

3. 使用下面命令下载 & Setup 交叉编译工具链,注意此时aarch64-none-linux-gnu-安装在linux根目录下:
wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel\ /gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz tar xf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz rm -f gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz export PATH=`pwd`/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
4. 解压后切换到U-Boot源码路径,并设置编译工具链环境变量:
cd /mnt/g/Stratix10_uboot/u-boot-socfpga-socfpga_v2025.07/ export PATH=/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH export CROSS_COMPILE=aarch64-none-linux-gnu-
5. 配置Stratix 10通用defconfig;
make socfpga_stratix10_defconfig

其实就是把./configs/socfpga_stratix10_defconfig文件内的配置信息刷到U-Boot根目录下的generated_defconfig文件,请查看下图中,执行make socfpga_stratix10_defconfig命令后,两个config文件完全相同;

6. 使用下面命令编译U-Boot,可以自动生成SPL和U-Boot;
make -j
7. 编译过程可能会提示没有gcc或者python等依赖,使用下面命令安装;
sudo apt update sudo apt install build-essential sudo apt install python3
8. 编译过程出现make[1]: warning: Clock skew detected. Your build may be incomplete,是因为Makefile的修改时间大于系统的当前时间,这里是WSL系统时间同步问题,如果是Vmware虚拟机运行Linux应该不会出现该问题;
9. 查询WSL系统的当前时间,比Windows系统时间慢了2分钟;
10. 安装后台同步时间的服务chrony,并查询系统控制状态确认chrony已激活 & 运行;
sudo apt update sudo apt install chrony sudo systemctl status chrony
11. 再次查询WSL系统的当前时间,与Windows系统时间相同;
12. 重新编译U-Boot,warning已经消除,但是又报错提示:Image 'u-boot' is missing external blobs and is non-functional: blob-ext,Image 'u-boot' has faked external blobs and is non-functional: bl31.bin;

出现该错误的原因是U-Boot编译需要ATF支持,但缺少关键的二进制blob文件(bl31.bin),bl31.bin是ATF的Stage 3-1镜像,负责提供安全监控调用(SMC)、PSCI电源管理等服务,U-Boot 的FIT(Flattened Image Tree)镜像在build时需要把 bl31.bin打包进去,但找不到该文件,故Binman(U-Boot 的镜像打包工具)报错并中止编译;

四、ATF编译
1. 由上面log可知需要编译ATF生成bl31.bin,在GitHub下载ATF源码;

ATF源码下载链接:GitHub - altera-fpga/arm-trusted-firmware: Official Intel SOCFPGA Arm-TF repository. Note: (1) A "RC" labeled branch is for internal active development use and customer early access without official customer support. (2) Latest stable branch (no RC labeled) is strongly recommended for development and production use outside of Intel. (3) See README for Quartus and Device support.

2. 解压后切换到ATF源码路径,设置编译工具链环境变量,并检查交叉编译工具链是否ok;
cd /mnt/g/Stratix10_uboot/arm-trusted-firmware-socfpga_v2.13.0/ export PATH=/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH export CROSS_COMPILE=aarch64-none-linux-gnu- aarch64-none-linux-gnu-gcc --version
3. 使用下面命令编译ATF;
make PLAT=stratix10 clean make PLAT=stratix10 all
4. 在./build/stratix10/release路径下成功编译bl2.bin,bl31.bin;
五、U-Boot & bl31.bin编译
1. 切换到U-Boot源码路径,把刚才编译好的bl31.bin复制到U-Boot根目录;
cp /mnt/g/Stratix10_uboot/arm-trusted-firmware-socfpga_v2.13.0/build/stratix10/release/bl31.bin /
2. 使用下面命令重新编译U-Boot;
PATH=/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH export CROSS_COMPILE=aarch64-none-linux-gnu- aarch64-none-linux-gnu-gcc --version make distclean make -j
3. 下图中可以看到在spl/路径下生成u-boot-spl.bin,u-boot-spl-dtb.bin和u-boot-spl-dtb.hex文件,最后OFCHK .config检查配置并正常退出,说明U-Boot编译成功;
4. 使用下面命令查看,U-Boot根目录下FIT镜像u-boot.itb是否包含bl31.bin和u-boot,Image 1 (atf)子镜像就是bl31.bin,说明bl31.bin已打包ok;
./tools/dumpimage -l u-boot.itb
5. 查看生成的u-boot文件;
  1. U-Boot根目录下:u-boot文件是ELF(Executable and Linkable Format)格式的u-boot,是一种可执行文件格式,主要用于开发调试;而u-boot.itb文件是FIT格式的u-boot,是把内核、设备树等封装在一起的镜像,主要用于固化部署,u-boot.itb就是上节中我们提到的HPS SSBL文件;
  2. spl/路径下:u-boot-spl.bin就是上节中我们提到的HPS FSBL文件,该BIN格式文件用于烧录到flash;
6. 我们再来回忆一下Stratix 10 SoC中HPS的Boot流程(为简化流程,这里省掉了FPGA配置),其中HPS FSBL文件主要用于初始化,具体请参考:【 Intel/Altera FPGA技术实战 】Stratix 10 SOC 系统 Boot 概述(五)-ZEEKLOG博客
  1. Power On;
  2. SDM先加载HPS EMIF IO,再加载HPS FSBL(u-boot-spl.bin)到HPS的片上RAM的0x00000000地址,最后释放HPS的复位;
  3. HPS执行FSBL(初始化DRAM、时钟、外设等),再从启动介质加载SSBL(u-boot.itb)到HPS侧DRAM;
  4. HPS跳转执行SSBL;
  5. SSBL加载Linux Kernel/Application;
7. SPL源码中有详细的FSBL初始化流程(SPL源码绝对路径:./arch/arm/mach-socfpga/spl_s10.c),请参考已注释的SPL源码;
// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2016-2023 Intel Corporation <www.intel.com> * */ #include <hang.h> #include <init.h> #include <log.h> #include <asm/global_data.h> #include <asm/io.h> #include <asm/utils.h> #include <debug_uart.h> #include <image.h> #include <spl.h> #include <asm/arch/clock_manager.h> #include <asm/arch/firewall.h> #include <asm/arch/mailbox_s10.h> #include <asm/arch/misc.h> #include <asm/arch/reset_manager.h> #include <asm/arch/smmu_s10.h> #include <asm/arch/system_manager.h> #include <wdt.h> #include <dm/uclass.h> DECLARE_GLOBAL_DATA_PTR; void board_init_f(ulong dummy) { // 初始化运行环境 const struct cm_config *cm_default_cfg = cm_get_default_config(); int ret; struct udevice *dev; ret = spl_early_init(); // 初始化 SPL 内存池、malloc if (ret) hang(); // 获取Stratix 10外设基地址,包括时钟、复位、系统管理等寄存器 socfpga_get_managers_addr(); /* Ensure watchdog is paused when debugging is happening */ writel(SYSMGR_WDDBG_PAUSE_ALL_CPU, socfpga_get_sysmgr_addr() + SYSMGR_SOC64_WDDBG); // 配置看门狗 /* * Enable watchdog as early as possible before initializing other * component. */ if (CONFIG_IS_ENABLED(WDT)) // 配置看门狗 initr_watchdog(); /* ensure all processors are not released prior Linux boot */ writeq(0, CPU_RELEASE_ADDR); // 清除 CPU 释放寄存器,确保所有核在reset // 初始化定时器 socfpga_per_reset(SOCFPGA_RESET(OSC1TIMER0), 0); timer_init(); // 初始化FSBL和SDM之间通信的Mailbox,FSBL获取SDM侧QSPI flash访问控制权的请求通道 mbox_init(); mbox_hps_stage_notify(HPS_EXECUTION_STATE_FSBL); // 引脚复用初始化,根据Platform Designer中HPS外设IO配置进行初始化 sysmgr_pinmux_init(); /* configuring the HPS clocks */ cm_basic_init(cm_default_cfg); // HPS时钟系统初始化,包括HPS,DRAM和HPS外设等时钟 // 调试UART初始化,建议开发调试阶段开启 #ifdef CONFIG_DEBUG_UART socfpga_per_reset(SOCFPGA_RESET(UART0), 0); debug_uart_init(); #endif preloader_console_init(); // 控制台注册,使用printf/puts函数可以输出log print_reset_info(); // 显示上次复位原因(POR, WDOG, 软件复位等),用于调试 cm_print_clock_quick_summary(); // 打印关键时钟频率(CPU, DDR, OSC1 等),用于调试 // 初始化Security Register & Firewall ret = uclass_get_device_by_name(UCLASS_NOP, "socfpga-secreg", &dev); if (ret) { printf("Firewall & secure settings init failed: %d\n", ret); hang(); } // 初始化DRAM,包括DRAM PHY/controller initial/calibration + tarining #if CONFIG_IS_ENABLED(ALTERA_SDRAM) ret = uclass_get_device(UCLASS_RAM, 0, &dev); if (ret) { debug("DRAM init failed: %d\n", ret); hang(); } #endif // 初始化QSPI #ifdef CONFIG_CADENCE_QSPI mbox_qspi_open(); #endif }
8. 前言中用于JTAG加载启动的HPS SOF文件(3),是由sof(1)文件和HPS FSBL Hex(2)文件打包生成的,而U-Boot编译生成的HPS FSBL(u-boot-spl.bin)文件不能直接用于打包,需要用ELF格式的u-boot-spl文件转换出HEX格式的u-boot-spl.hex;
9. 使用下面命令把HPS FSBL(u-boot-spl.bin)文件转换为HEX文件;
aarch64-none-linux-gnu-objcopy -O ihex spl/u-boot-spl spl/u-boot-spl.hex
10. 查看已生成HPS FSBL HEX文件,接下来我们就可以打包HPS SOF文件(3),再用JTAG愉快的加载启动了。

Read more

1200PLC与爱普生机器人modbus_TCP通讯

1200PLC与爱普生机器人modbus_TCP通讯

1.前言 首先申明一下我的硬件信息 机器人:C4-A601S 控制器:RC700 PLC:西门子S7-1200(CPU:1217C/DC/DC/DC) 2.控制器IP地址查看及修改 在配置控制器相关信息时需要先用网线连接PC与机器人控制器连接,爱普生机器人出厂设定网址为192.168.0.1(我这里是之前修改过了) 若默认没有显示以太网连接,点击右侧的增加,选择“通过以太网连接到控制器”后点击确定 如果控制器网址被修改过了,不知道是多少,可以用一根PC线,一头接在控制器的“开发用PC连接专用USB端口”另一头接在电脑USB口 这时候再在通讯处选择USB连接就可以通上了 现在就可以在“系统配置”处看到控制器的IP地址以及相关信息了,如果有需要也可以直接在这修改IP地址。 3.机器人控制器配置 网线连接好后开始配置通讯相关信息 1.控制设备 控制设备修改为远程I/O 2.现场总线 现场总线类型修改为“Modbus TCP”

配置钉钉龙虾OpenClaw机器人调用OpenMetadata

配置钉钉龙虾OpenClaw机器人调用OpenMetadata

目录 * 一、前言 * 1️⃣钉钉(DingTalk) * 2️⃣OpenClaw * 3️⃣OpenMetadata * 4️⃣MCP(Model Context Protocol) * 二、安装OpenClaw * 三、配置OpenClaw钉钉机器人 * 四、调用OpenMetadata MCP 一、前言 先介绍下这四个工具/协议的定位与核心能力,本文将从零开始配置。 1️⃣钉钉(DingTalk) 阿里巴巴旗下的企业协作平台,2014年上线,是中国市场份额最大的企业即时通讯与办公套件之一。 核心能力包括:即时消息与视频会议、考勤打卡与审批流、企业通讯录、低代码应用搭建(宜搭)、以及近年来整合的 AI 助理功能。它更像一个"企业操作系统",把 HR、OA、协同文档、

【Linux篇章】穿越网络迷雾:揭开 HTTP 应用层协议的终极奥秘!从请求响应到实战编程,从静态网页到动态交互,一文带你全面吃透并征服 HTTP 协议,打造属于你的 Web 通信利刃!

【Linux篇章】穿越网络迷雾:揭开 HTTP 应用层协议的终极奥秘!从请求响应到实战编程,从静态网页到动态交互,一文带你全面吃透并征服 HTTP 协议,打造属于你的 Web 通信利刃!

本篇摘要 本篇将介绍何为HTTP协议,以及它的请求与答复信息的格式(请求行,请求包头,正文等),对一些比较重要的部分来展开讲解,其他不常用的即一概而过,从静态网页到动态网页的过渡,最后底层基于TCP实现简单的HTTP服务器的代码编写构建一个简单的网页(包含对应的跳转,重定向,动态交互等功能),采取边讲解http结构边用代码形成效果展示的形式进行讲解,望有助! 欢迎拜访:点击进入博主主页 本篇主题:探秘HTTP应用层那些事儿! 制作日期:2025.07.21 隶属专栏:点击进入所属Linux专栏 本文将要介绍的内容的大致流程图如下: 一· 认识HTTP * 在互联网世界中, HTTP(HyperText Transfer Protocol, 超文本传输协议) 是一个至关重要的协议。 它定义了客户端(如浏览器) 与服务器之间如何通信, 以交换或传输超文本(如 HTML 文档) 。 * HTTP 协议是客户端与服务器之间通信的基础。 * 客户端通过 HTTP 协议向服务器发送请求, 服务器收到请求后处理并返回响应。 HTTP 协议是一个无连接、

WebGL跨端兼容实战:移动端适配全攻略

WebGL跨端兼容实战:移动端适配全攻略

复杂HTML项目重构实战(多端适配增强版):PC+移动端全兼容,WebGL/Cesium/音视频跨端落地 在之前的重构方案基础上,我们重点补充多端适配与兼容核心内容,覆盖PC(桌面/平板)与移动端(手机/平板)全场景,解决布局适配、WebGL兼容、Cesium移动端性能、音视频跨端策略、交互差异等关键问题,同时更新架构设计、AI辅助体系、面试话术,形成「双框架+全端兼容」的完整重构方案,所有内容与原方案无缝衔接,可直接落地。 一、多端适配核心背景与新增目标 1.1 多端场景痛点 原项目仅针对PC端开发,扩展到移动端后,新增核心痛点如下: 适配模块多端痛点布局适配固定像素布局在移动端错乱、小屏内容拥挤、大屏留白过多,无响应式设计WebGL兼容移动端部分浏览器仅支持WebGL1.0、上下文切后台丢失、渲染性能不足、分辨率不匹配Cesium适配移动端触摸交互缺失、场景FPS过低、地形/模型加载卡顿、容器尺寸无法自适应音视频兼容移动端自动播放受限、