Zephyr 在 Andes ADP-XC7K AE350 FPGA 开发板上的移植与烧录调试全指南
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
导读
ADP-XC7K AE350 是 Andes(晶心科技)面向 AndesCore 处理器与 AndeShape SoC 平台 IP 验证推出的 FPGA 开发与原型验证板卡,运行 Zephyr 的 AE350 平台以 60MHz 的 32/64 位 RISC-V 内核为计算核心。本文以 boards/andestech/adp_xc7k_ae350/doc/index.rst 为骨架,结合仓库中的设备树、Kconfig 与 defconfig 源码,完整讲解该板卡的硬件资源、引脚映射、系统时钟与串口配置,并给出从构建、AICE 连接、ICEman 启动到 RAM 加载与 XIP 烧写的全流程命令,帮助你在 ADP-XC7K 系列板上快速跑通 Zephyr 应用。
平台与板卡概览
ADP-XC7K AE350 板卡是 AndeShape AE350 平台在 ADP-XC7K 系列 FPGA 开发板上的落地形态。AE350 是一个 RISC-V 平台,可集成 AndesCore CPU 以及一组基础外设 IP。ADP-XC7K 系列本身就是用于评估多种 AndesCore 处理器与 AndeShape SoC 平台 IP 的 FPGA 开发与原型验证板。
仓库中该板卡的核心文件包括:
- 设备树源文件:adp_xc7k_ae350.dts(默认 PLIC 中断版本)与 adp_xc7k_ae350_clic.dts(CLIC 中断版本),二者共用 adp_xc7k_ae350_common.dtsi;
- 板级标识文件:adp_xc7k_ae350.yaml;
- 默认配置:adp_xc7k_ae350_defconfig 与 adp_xc7k_ae350_clic_defconfig;
- 板级 Kconfig:Kconfig.adp_xc7k 与 Kconfig.defconfig;
- 板级清单:board.yml。
其中board.yml明确了板卡标识adp_xc7k、SoC 为ae350,并存在一个clic变体;对应到构建时的板名即为adp_xc7k/ae350与adp_xc7k/ae350/clic。两块物理板卡分别是绿色 PCB 的 ADP-XC7K160 与红色 PCB 的 ADP-XC7K410,其板载照片见 adp_xc7k160.jpg 与 adp_xc7k410.jpg。
硬件资源一览
ADP-XC7K AE350 平台集成了 1~4 个 32/64 位 60MHz RISC-V CPU(AndeStar v5 架构)、DSP、1GB RAM、Cache、SPI Flash、以太网控制器等外设,主要硬件组件如下:
| 组件 | 规格 |
|---|---|
| CPU | 1~4 核 32/64 位 60MHz AndeStar v5 RISC-V |
| 内存 | 1GB 板载 SDRAM |
| 存储 | 2MB SPI Flash(其中 1MB 可用于 XIP) |
| 通信接口 | UART、I2C、SPI、GPIO、PWM、DMA、10/100 Ethernet RJ45 |
| 显示与外设 | LCD 模块连接器、MIC-in / Line-in / Line-out(AC97 音频编解码器) |
| 其他 | 16KB I2C EEPROM、SD 存储卡插槽 |
从设备树 adp_xc7k_ae350_common.dtsi 可以看到,板载 SPI Flash(mx25u16,MACRONIX 型号,jedec-id = [c2 25 35],16MB 容量,10MHz 最大时钟)挂接在spi0上,同时定义了 1MB 的storage分区用于存储;板载 EEPROM 为 Atmel AT24(16KB,64 字节页,挂接在i2c0地址0x50);spi1以gpio0的 7 号引脚作为片选信号。
板级 yaml(adp_xc7k_ae350.yaml)声明支持的驱动子系统包括:gpio、counter、i2c、spi、eeprom、watchdog、mbox、flash、dma、led、syscon、hwinfo;testing.ignore_tags中排除了bluetooth(该平台无蓝牙硬件)。
中断控制器:PLIC 与 CLIC 两个变体
从 soc/andestech/ae350/Kconfig 可知,AE350 SoC 系列通过SOC_AE350_INTERRUPT_TYPE选择基础中断类型:
SOC_AE350_INTERRUPT_TYPE_PLIC(默认):选择RISCV_HAS_PLIC;SOC_AE350_INTERRUPT_TYPE_CLIC:选择RISCV_HAS_CLIC,并在向量模式下选择CLIC_SMCLICSHV_EXT,同时启用CLIC_SMCLICCONFIG_EXT与LEGACY_CLIC_MEMORYMAP_ACCESS。
板级 Kconfig.defconfig 在BOARD_ADP_XC7K_AE350_CLIC时默认选择 CLIC 中断类型。因此同一块硬件存在两套设备树与构建目标:PLIC 版本使用andes_v5_ae350.dtsi,CLIC 版本使用andes_v5_ae350_clic.dtsi。
此外,AE350 SoC 系列还提供SOC_ANDES_V5_IOCP(I/O Coherence Port,依赖 DCACHE)选项,用于处理 Cache 与 DMA 等外部非缓存主机之间的缓存一致性,详见 soc/andestech/ae350/Kconfig。
支持的 Zephyr 功能
板卡的默认配置(adp_xc7k_ae350_defconfig)如下:
CONFIG_XIP=n CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_SERIAL=y CONFIG_GPIO=y CONFIG_PMP_GRANULARITY=8几点说明:
CONFIG_XIP=n:默认从 RAM 执行,后续烧录章节将分别演示 RAM 加载(CONFIG_XIP=n)与 Flash 烧写(CONFIG_XIP=y)两种运行方式;CONFIG_PMP_GRANULARITY=8:RISC-V 物理内存保护(PMP)粒度配置为 8 字节,这与 AE350 SoC 选择RISCV_PMP的 soc/andestech/ae350/Kconfig 配置相呼应;- SoC 级默认参数(soc/andestech/ae350/Kconfig.defconfig.ae350):
SYS_CLOCK_TICKS_PER_SEC默认为 100(在无 ICACHE 或 XIP 场景下)、MAIN_STACK_SIZE为 2048、IDLE_STACK_SIZE为 1536、64 位模式下PRIVILEGED_STACK_SIZE与TEST_EXTRA_STACK_SIZE为 2048,MP_MAX_NUM_CPUS默认 1(支持范围 1~8)。
GPIO 与引脚映射
ADP-XC7K AE350 平台有 1 个 GPIO 控制器,提供 32 位 IO,负责引脚输入/输出、上拉等功能。设备树中通过aliases将gpio-0、led0、led1、sw0等别名指向具体节点,并把 7 段数码管段选注册为gpio-leds、把 7 个按键注册为gpio-keys(均使用GPIO_ACTIVE_LOW有效电平)。
GPIO 控制器到板级引脚的完整映射如下:
按键(Push Buttons)
| GPIO | 板级引脚 |
|---|---|
| GPIO.0 | SW1 |
| GPIO.1 | SW2 |
| GPIO.2 | SW3 |
| GPIO.3 | SW4 |
| GPIO.4 | SW5 |
| GPIO.5 | SW6 |
| GPIO.6 | SW7 |
7 段数码管 LED1(7-Segment LED1)
| GPIO | 板级引脚 |
|---|---|
| GPIO.16 | 7SEG1.A |
| GPIO.17 | 7SEG1.B |
| GPIO.18 | 7SEG1.C |
| GPIO.19 | 7SEG1.D |
| GPIO.20 | 7SEG1.E |
| GPIO.21 | 7SEG1.F |
| GPIO.22 | 7SEG1.G |
| GPIO.23 | 7SEG1.DP |
7 段数码管 LED2(7-Segment LED2)
| GPIO | 板级引脚 |
|---|---|
| GPIO.24 | 7SEG2.A |
| GPIO.25 | 7SEG2.B |
| GPIO.26 | 7SEG2.C |
| GPIO.27 | 7SEG2.D |
| GPIO.28 | 7SEG2.E |
| GPIO.29 | 7SEG2.F |
| GPIO.30 | 7SEG2.G |
| GPIO.31 | 7SEG2.DP |
通用 GPIO 引脚(IDE_CON1 扩展连接器)
| GPIO | 板级引脚 |
|---|---|
| GPIO.7 | IDE_CON1.4 |
| GPIO.8 | IDE_CON1.6 |
| GPIO.9 | IDE_CON1.8 |
| GPIO.10 | IDE_CON1.10 |
| GPIO.11 | IDE_CON1.11 |
| GPIO.12 | IDE_CON1.12 |
| GPIO.13 | IDE_CON1.13 |
| GPIO.14 | IDE_CON1.14 |
| GPIO.15 | IDE_CON1.15 |
注意:GPIO.7 同时被设备树用作spi1的片选信号(cs-gpios = <&gpio0 7 GPIO_ACTIVE_LOW>),实际使用通用 GPIO 时需要避免与该功能冲突。
其他外设映射
| 外设 | 板级引脚 |
|---|---|
| SPI_1 | 内部连接到 SPI Flash |
| SPI_2_CS | IDE_CON1.37 |
| SPI_2_MOSI | IDE_CON1.36 |
| SPI_2_MISO | IDE_CON1.38 |
| SPI_2_SCLK | IDE_CON1.35 |
| I2C_SDA | J27.1 |
| I2C_SCL | J27.2 |
系统时钟与串口
- 系统时钟:60MHz 内核时钟。
- 串口:平台提供 2 个 UART。Zephyr 控制台默认分配到 UART2,默认设置为115200 8N1。
在设备树 adp_xc7k_ae350_common.dtsi 中,chosen节点将zephyr,console与zephyr,shell-uart都指向uart1(对应文档所述的 UART2 控制台),并配置clock-frequency = <20000000>、current-speed = <115200>;同时zephyr,sram指向dram,zephyr,flash与zephyr,flash-controller指向mx25u16。
构建 Zephyr 应用
使用标准的 Zephyr 构建方式即可。以 hello_world 示例为例:
west build -b adp_xc7k/ae350 samples/hello_world若使用 CLIC 中断变体,则指定:
west build -b adp_xc7k/ae350/clic samples/hello_world构建产物位于build/zephyr/下,其中zephyr.elf用于 RAM 加载/调试,zephyr.bin用于 Flash 烧写。
编程与调试环境准备
要将 Zephyr 应用烧写进 Flash 或进行调试,需要:
- 用 Andes ICE(AICE)将主机与 ADP-XC7K 板卡相连;
- 在主机上运行 Andes ICE 管理软件ICEman。
AICE 与板卡、主机的连接方式参考下图(连接 AICE 至 ADP-XC7K 板卡与主机):
烧录前还需从 Andes Development Kit 下载 ICEman(ice.zip);如果要用 XIP 模式(CONFIG_XIP=y),还需要下载 Flash burner(flash.zip)。
启动 ICEman 服务
调试与烧录程序前,先启动 ICEman:
# 为 ICEman 添加可执行权限 chmod a+x ./ICEman # 运行 ICEman 服务端 sudo ./ICEman -Z v5提示:若希望以普通用户身份运行 ICEman 命令,需要安装
70-ndsusb-v1.rulesudev 规则文件(通常放入/etc/udev/rules.d,然后重新插拔 AICE USB 适配器使其生效)。
烧录程序
方式一:RAM 加载(CONFIG_XIP=n)
当CONFIG_XIP=n时,可将zephyr.elf直接加载到 RAM 并执行:
# 确认 ICEman 服务端已运行 # 将程序加载到 RAM 并执行 riscv64-zephyr-elf-gdb build/zephyr/zephyr.elf (gdb) target remote :1111 (gdb) monitor reset halt (gdb) load (gdb) quit方式二:Flash 烧写(CONFIG_XIP=y)
当CONFIG_XIP=y时,需要将zephyr.bin烧入 Flash 并执行:
# 确认 ICEman 服务端已运行 # 将程序烧入 Flash 并执行 <FLASH>/bin/target_burn_frontend \ -P 4444 --unlock --verify --image=build/zephyr/zephyr.bin \ --algorithm-bin=<FLASH>/target_bin/target_SPI_v5_[32|64].bin注意:
- 假定 Flash burner 已下载到
<FLASH>目录; algorithm-bin文件的选择:RV32 平台使用target_SPI_v5_32.bin,RV64 平台使用target_SPI_v5_64.bin。
串口输出验证
打开串口终端,设置如下参数:
- 速率:115200
- 数据位:8
- 校验位:None
- 停止位:1
烧录或加载成功后,终端应看到类似输出(示例为 hello_world 应用):
***** Booting Zephyr OS v2.4.0 ***** Hello World! adp_xc7k使用 GDB 调试
调试步骤如下(同样依赖 ICEman 服务端处于运行状态):
# 确认 ICEman 服务端已运行 # 加载并调试程序 ./riscv64-zephyr-elf-gdb build/zephyr/zephyr.elf (gdb) target remote :1111 (gdb) monitor reset halt (gdb) load若CONFIG_XIP=y,请先按“烧录程序”一节的 Flash 烧写流程把程序写入 Flash,然后使用上述 GDB 命令调试,但不要执行load命令——因为程序已经存放在 Flash 中。
总结
ADP-XC7K AE350 为 AndesCore RISC-V 处理器与 AndeShape SoC 平台 IP 的验证提供了完整的 FPGA 硬件环境,Zephyr 仓库为其提供了 PLIC/CLIC 两套设备树变体以及完善的外设驱动支持。通过本文所述的构建、ICEman 服务、RAM 加载与 XIP 烧写、GDB 调试流程,你可以在这块 60MHz 的 32/64 位 RISC-V 平台上快速完成 Zephyr 应用的开发、烧录与调试闭环。
进一步可参考仓库中的 Andes AE350 SoC 配置 与 板级设备树,了解更底层的中断、Cache、PMP 与外设细节。
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考