GK7206 SDK 目录结构详解:从源码到 helloworld 部署进 rootfs(Pico-G1 实战 7)

发布时间:2026/10/10 2:31:27
GK7206 SDK 目录结构详解:从源码到 helloworld 部署进 rootfs(Pico-G1 实战 7)
一、SDK目录结构解压 SDK 发布包后目录结构如下GK7206/ ├── build # 核心构建系统 │ ├── base.mk # 基础 Make 规则定义 SDK_KO_DIR、编译器等公共变量 │ ├── root.mk # 顶层 Make 规则被软链接为 SDK 根目录的 Makefile │ ├── kernel.mk # Linux 内核编译规则 │ ├── bootloader.mk # U-Boot 编译规则 │ ├── rootfs_image.mk # rootfs 镜像打包规则JFFS2/YAFFS2/EXT4 │ ├── sdk_ko_rules.mk # .ko 驱动模块编译输出规则 │ ├── sdk_lib_rules.mk # SDK 动态库编译输出规则 │ ├── env.sh # 构建环境变量脚本 │ └── load # 构建过程的通用加载函数 │ ├── run.sh # 一键构建入口脚本make all 的封装 │ # 用法: ./run.sh [chip_type] [options] │ ├── cfg.mk # 当前生效的 SDK 配置文件 │ # 定义芯片型号、工具链、内核版本、flash 类型等 │ # 由 menuconfig 生成类似 Linux 的 .config │ ├── configs # 板级/芯片配置目录 │ ├── xm7206v11a/ # xm7206v11a 芯片配置 │ │ ├── prebuilts/ # 预构建文件分区表 XML、bootargs.bin 等 │ │ ├── reg/ # 寄存器配置文件 │ │ └ *_cfg.mk # 各 EVB 板型的配置 Makefile │ ├── xm7206v12a/ # xm7206v12a 芯片配置结构同上 │ ├── xm7206v11/ # 其他芯片变体配置... │ └── ... │ ├── develop_env.sh # 开发环境初始化脚本 │ # 安装 Ubuntu 编译依赖gperf、automake 等 │ # 需 sudo 权限执行 │ ├── env_tools # 环境工具源码 │ ├── gperf-3.1/ # gperf hash 生成器 │ └ automake-1.15.1/ # automake 构建工具 │ # develop_env.sh 会编译安装这两个 │ ├── Makefile - ./build/root.mk # 顶层 Makefile软链接 │ # 执行 make 时实际调用 build/root.mk │ ├── mcu # MCU/RISC-V 子系统 │ ├── media/ # MCU 媒体处理相关 │ └ riscv/ # RISC-V 核心代码 │ # 用于低功耗模式、AOV 等功能 │ ├── open_source # 第三方开源组件源码 │ ├── busybox/ # BusyBox嵌入式 Linux 工具集 │ ├── dropbear/ # SSH 服务器 │ ├── mtd-utils/ # Flash 工具flashcp、nanddump 等 │ ├── e2fsprogs/ # ext2/3/4 文件系统工具 │ ├── zlib/ lz4/ zstd/ # 压缩库 │ ├── gdb/ # GDB 调试器 │ └── ... # 其他 20 开源组件 │ ├── out # 编译输出目录按芯片型号分 │ ├── xm7206v11a/ # xm7206v11a 的编译输出 │ │ ├── ko/ # 所有 .ko 驱动模块会被打包到 rootfs/opt/ko │ │ ├── lib/ # SDK 动态库 │ │ ├── rootfs/ # 最终 rootfs 目录结构 │ │ ├── image/ # 烧录镜像 │ │ │ ├── spi_image/ # SPI-NOR 镜像 │ │ │ ├── emmc_image/ # eMMC 镜像 │ │ │ └── nand_image/ # NAND 镜像 │ │ ├── linux-5.10.y/ # 内核编译目录 │ │ └ boot_builddir/ # U-Boot 编译目录 │ ├── xm7206v12a/ # xm7206v12a 的编译输出结构同上 │ └── spidev_test/ # SPI 设备测试工具 │ ├── sample # SDK 官方示例程序 │ ├── common/ # 公共代码sample_comm_*.c │ ├── vio/ # 视频输入输出示例 │ ├── venc/ # 视频编码示例 │ ├── audio/ # 音频示例 │ ├── npu/ # NPU 神经网络示例 │ ├── vo/ # 视频输出/HDMI 示例 │ ├── fb/ # Framebuffer 示例 │ ├── tde/ # TDE 图形加速示例 │ ├── ive/ # IVE 图像处理示例 │ ├── cipher/ # 加密模块示例 │ ├── pm/ # 电源管理示例 │ ├── quickstart/ # 快速入门示例 │ └── ... │ ├── app_sample # 应用层示例你的自定义应用 │ ├── face_recognize/ # 人脸识别应用 │ └ rpi_detector/ # Raspberry Pi 检测器 │ ├── source # 核心源码目录 │ ├── bootloader/ # U-Boot 源码 │ │ ├── u-boot-2020.01/ # U-Boot 2020.01 版本 │ │ ├── product/ # XMEDIA 产品定制 │ │ └ secureboot/ # 安全启动相关 │ ├── kernel/ # Linux 内核源码 │ │ ├── linux-4.9.y/ # 内核 4.9 版本 │ │ ├── linux-5.10.y/ # 内核 5.10 版本当前使用 │ ├── gmp/ # XMEDIA 媒体平台SDK核心 │ │ ├── drv/ # 驱动源码编译为 .ko │ │ ├── usr/ # 用户态库源码编译为 .so │ │ ├── include/ # SDK 头文件 │ │ └ ko/ # 预编译 ko 目录 │ ├── rootfs/ # rootfs 构建脚本 │ │ ├── scripts/ # rootfs.tgz 源包、Makefile │ │ ├── busybox/ # BusyBox 构建配置 │ │ ├── dropbear/ # SSH 构建配置 │ │ └── ... │ ├── trusted-firmware/ # ARM Trusted Firmware (ATF) │ ├── initramdisk/ # 初始化 ramdisk │ └── app/ # 应用源码 │ └ factory_test/ # 工厂测试程序 │ ├── tools # 工具脚本目录 │ ├── linux/ # Linux 平台工具 │ │ ├── toolchains/ # 交叉编译工具链 │ │ ├── pq_board/ # PQ 画质调优工具 │ │ ├── aq_board/ # AQ 音质调优工具 │ │ ├── kconfig/ # menuconfig 工具 │ │ └ utils/ # 其他辅助工具 │ └── windows/ # Windows 平台工具 │ ├── version_config # SDK 版本/配置管理 │ ├── main_config # menuconfig 主菜单入口 │ ├── config.base # 基础配置选项 │ ├── config.board # 板级配置选项 │ ├── config.bootloader # Bootloader 配置选项 │ ├── config.kernel # 内核配置选项 │ ├── config.system # 系统配置选项 │ └ config.filesystem # 文件系统配置 │ └ config.flash # Flash 类型配置 │ └ config.tools # 工具配置 │ └── tar_rootfs.sh # 手动打包 rootfs.tgz 的辅助脚本提示out/目录在首次编译后才会生成存放所有编译产物。cfg.mk是当前选择的板级配置文件决定了编译的目标硬件。二、部署第一个应用程序接下来介绍如何在 Pico-G1 开发板上编写一个hello word引用程序、并将其编译进rootfs根文件系统中烧录并运行应用程序完成从源码编写到板端运行的完整流程。具体操作步骤1新建工程为了工程结构清晰、便于维护建议将应用程序放在SDK/source/app目录下mkdir -p source/app/helloworld # 创建helloword应用程序 cd source/app/helloworld/ # 切换目录 touch helloworld.c # 创建.c文件 touch Makefile # 创建Makefile文件2编写应用程序vim helloworld.chelloworld.c如下#include stdio.h int main(void) { printf(hello world from firmware!\n); return 0; }3编写Makefilevim MakefileMakefile如下# SDK 根目录。 # 当前 Makefile 位于 source/app/helloworld/ 下 # 往上三级正好回到 SDK 根目录。 SDK_DIR : $(shell cd $(shell pwd)/../../.. /bin/pwd) # 引入 SDK 公共构建配置。 # 这里会定义交叉编译器、编译参数、链接参数、rootfs 输出目录等变量。 include $(SDK_DIR)/build/base.mk # 最终生成的可执行文件名。 TARGET : helloworld # 源文件列表。 SRCS : helloworld.c # 由源文件名自动推导目标文件名。 # 例如 helloworld.c - helloworld.o OBJS : $(SRCS:.c.o) # 声明伪目标避免与同名文件冲突。 .PHONY: all clean install # 默认目标。 # 执行 make 时会先构建最终程序。 all: $(TARGET) # 链接规则。 # 将 .o 目标文件链接成最终可执行文件。 $(TARGET): $(OBJS) $(CC) $(SDK_LD_CFLAGS) -o $ $^ # 编译规则。 # 将 .c 源文件编译成 .o 目标文件。 %.o: %.c $(CC) $(SDK_USR_CFLAGS) -c -o $ $ # 安装到 rootfs。 # 板端最终路径将是 /usr/bin/helloworld install: all mkdir -p $(XMEDIA_ROOTFS_DIR)/usr/bin cp -f $(TARGET) $(XMEDIA_ROOTFS_DIR)/usr/bin/$(TARGET) chmod 755 $(XMEDIA_ROOTFS_DIR)/usr/bin/$(TARGET) echo Installed $(TARGET) to $(XMEDIA_ROOTFS_DIR)/usr/bin/$(TARGET) # 清理编译产物。 clean: rm -f $(TARGET) $(OBJS)4编译编译应用程序# 在SDK根目录中执行: make -C source/app/helloworld clean # 清理旧的编译结果 make -C source/app/helloworld # 重新交叉编译生成开发板可运行的 helloworld编译rootfs在SDK根目录中执行: make rootfs_clean make rootfs将应用程序安装进rootfs目录中在SDK根目录中执行: make -C source/app/helloworld install预期出现​​​​​​​ljhlcwt-KNPP-D32-R-Series:~/GK7206$ make -C source/app/helloworld install make: Entering directory /home/diskh/ljh/GK7206/source/app/helloworld Installed helloworld to /home/diskh/ljh/GK7206/out/xm7206v12a/rootfs/usr/bin/helloworld make: Leaving directory /home/diskh/ljh/GK7206/source/app/helloworld #### make -C source/app/helloworld install completed successfully! ####此时切换到/out/xm7206v12a/rootfs/usr/bin目录下能够看到helloworld应用程序5打包make fs_image6烧录请参考 烧录章节镜像烧录 烧录 SPI 镜像。7运行应用程序使用SSH或串口进入板子的 Shell命令行环境​​​​​​​cd /usr/bin/ helloworld此时会看到打印hello world from firmware!