尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

全志FEL模式工具sunxi-tools编译与实战指南

全志FEL模式工具sunxi-tools编译与实战指南 1. 项目概述为什么我们需要自己编译sunxi-tools如果你手头有一块全志芯片的开发板比如经典的F1C100s、V3s或者是性能更强的H616、H618那么“FEL模式”这个词对你来说一定不陌生。FELFlash and Execute Loader是全志芯片内置的一种底层USB恢复与烧录模式它不依赖任何外部存储介质是“救砖”、裸机程序调试和系统烧录的终极手段。而sunxi-tools正是与这个模式交互的官方开源工具集它包含了sunxi-fel、sunxi-nand-part等核心工具。官方仓库的Release版本更新往往滞后而主线代码可能已经修复了你正在遇到的某个USB通信bug或者添加了对新款芯片的支持。在Ubuntu下从源码编译最新版的sunxi-tools不仅能让你第一时间用上新特性更是深入理解全志平台工具链和底层通信协议的好机会。这个过程本身就是一次从“使用者”到“参与者”的视角转变。很多社区开发者遇到的奇怪问题其根源往往就在于使用了过时或有缺陷的工具。自己动手编译意味着你能精准控制编译环境、依赖版本甚至可以根据需要打上社区补丁打造一个最适合自己工作流的定制化工具。2. 环境准备与依赖梳理编译sunxi-tools本身并不复杂但它对系统环境有几个明确的要求。一个干净、正确的起步环境能避免后续绝大多数“玄学”问题。2.1 系统与基础环境确认首先你需要一个正在运行的Ubuntu系统。我强烈推荐使用Ubuntu 20.04 LTS或22.04 LTS这类长期支持版本它们在软件包兼容性和社区支持上最为成熟。你可以通过lsb_release -a命令来确认你的系统版本。接下来是编译器。sunxi-tools主要用C语言编写因此我们需要GCC编译器和标准的C库开发文件。在终端中执行以下命令来安装基础构建工具链sudo apt update sudo apt install build-essential这条命令会安装gcc,g,make,libc-dev等一系列核心工具。这是几乎所有Linux下源码编译项目的起点。2.2 核心依赖库的安装sunxi-tools的功能实现依赖于几个关键的库我们必须提前安装它们的开发包libusb-1.0这是整个工具集最核心的依赖。sunxi-fel通过libusb库与芯片的USB设备进行底层通信。没有它编译根本无法进行。pkg-config这是一个辅助工具用于帮助编译器正确地找到头文件和链接库的路径。它在现代开源项目中几乎无处不在。zlib某些工具如处理镜像时可能会用到压缩功能。libssl-dev如果你需要编译与安全启动相关的功能虽然sunxi-tools主体不强制依赖或者未来某些扩展功能需要加密校验安装它会更有备无患。一次性安装所有依赖的命令如下sudo apt install libusb-1.0-0-dev pkg-config zlib1g-dev libssl-dev注意务必安装libusb-1.0-0-dev开发包而不仅仅是libusb-1.0-0运行时库。缺少-dev后缀的包只包含运行所需的共享库文件不包含编译所需的头文件.h文件和链接文件会导致编译报错“找不到usb.h”。2.3 获取最新源代码官方源码仓库托管在GitHub上。我们使用git来克隆这样可以随时拉取最新的提交。如果你的系统还没有安装git请先运行sudo apt install git。然后克隆仓库到本地git clone https://github.com/linux-sunxi/sunxi-tools.git cd sunxi-tools进入目录后你可以通过git log --oneline -5查看最新的几条提交记录确认你拿到的是最新的代码。相比于直接下载压缩包使用git克隆的另一个巨大优势是你可以轻松地在不同分支间切换或者使用git pull命令随时更新到最新版本。3. 编译配置与核心参数解析拿到源码后不要急于输入make。理解编译配置选项能让你编译出的工具更符合你的使用场景。3.1 理解Makefile与配置生成sunxi-tools的构建系统基于经典的Makefile。在项目根目录下你会看到一个Makefile文件。对于简单的编译直接执行make确实可以。但更规范的做法是使用项目提供的配置脚本如果有的话或理解Makefile中的变量。首先我们可以查看Makefile的开头部分通常那里定义了编译器、安装路径等变量。例如CC gcc PREFIX /usr/localPREFIX变量决定了后续make install时二进制文件、手册页等将被安装到的系统路径。/usr/local是用户安装本地软件的标准位置通常不需要root权限写入除了install步骤本身需要sudo。如果你想安装到自己的家目录下例如~/bin可以修改PREFIX或者在调用make时覆盖它make PREFIX$HOME/.local。3.2 关键编译选项说明在sunxi-tools的编译中有几个通过宏定义控制的特性值得关注。它们通常不会在简单的make中启用但了解它们有助于你深度使用工具。你可以通过修改Makefile中的CFLAGS变量或在编译时通过命令行传递来开启或关闭某些功能。例如make CFLAGS-DEXPERIMENTAL_FEATURE一个实际有用的例子是调试信息。如果你想在sunxi-fel执行时看到更详细的USB通信数据包日志用于排查连接问题可以尝试启用调试编译make CFLAGS-DDEBUG但请注意这可能会导致输出信息非常冗长且并非所有代码路径都有完善的调试日志。对于日常使用无需添加此参数。另一个重点是静态链接。默认情况下编译出的是动态链接的可执行文件它运行时需要系统存在对应版本的libusb等库。如果你想制作一个可以在不同Linux发行版间随意拷贝使用的“便携版”sunxi-fel可以尝试静态链接make LDFLAGS-static但这可能会因为静态链接库的依赖问题而变得复杂且生成的文件体积会大很多。除非有特殊分发需求否则不建议普通用户这样做。3.3 执行编译与输出解读配置清楚后就可以开始编译了。在sunxi-tools目录下执行make如果一切顺利你会在终端看到一系列的编译命令gcc -c ...gcc -o ...滚动最后没有报错地结束。此时在当前目录下就会生成一系列可执行文件最重要的就是sunxi-fel。你可以立即测试一下刚编译好的工具./sunxi-fel version这个命令会输出sunxi-fel的版本信息通常包含一个基于git提交哈希的版本号。如果显示出版本号恭喜你编译成功了实操心得编译过程中最常见的错误是“找不到头文件”或“对某个函数未定义的引用”。这几乎百分之百是依赖库没有安装正确。请回头仔细检查libusb-1.0-0-dev等-dev包是否已安装。可以使用dpkg -s libusb-1.0-0-dev来验证包的安装状态。4. 安装、验证与权限配置编译成功只是第一步将工具安装到系统路径并配置好使用权限才能让它真正好用起来。4.1 系统安装与路径管理上一步的make只是在当前目录生成文件。要像系统命令一样在任何位置都能调用sunxi-fel需要执行安装sudo make install这条命令会根据Makefile中PREFIX的定义默认是/usr/local将sunxi-fel等二进制文件复制到/usr/local/bin/将手册页复制到/usr/local/share/man/等目录。安装完成后你可以打开一个新的终端直接输入sunxi-fel version应该就能看到输出而不需要输入./前缀了。如果你不想安装到系统目录或者没有sudo权限可以在编译时指定一个用户目录作为PREFIXmake PREFIX$HOME/.local make install PREFIX$HOME/.local之后你需要将$HOME/.local/bin添加到你的shell环境变量PATH中。可以编辑~/.bashrc文件添加一行export PATH$HOME/.local/bin:$PATH然后执行source ~/.bashrc使其生效。4.2 验证工具完整性安装后建议进行一个简单的功能验证而不仅仅是检查版本。一个很好的方法是使用sunxi-fel的list命令。不过这个命令需要你的设备已经进入FEL模式并连接到电脑。更通用的验证是检查工具是否包含了预期的功能。运行sunxi-fel help你会看到一个详细的帮助信息列出了所有可用的子命令如ver查看芯片版本、hexdump读取内存并显示、exe执行内存中的代码、spiSPI闪存操作、write、read等。仔细浏览这个列表熟悉每个命令的用途这对后续使用至关重要。4.3 解决USB设备访问权限问题这是新手遇到的最大“拦路虎”。在Linux系统下普通用户默认无法直接访问USB设备。如果你在设备进入FEL模式后运行sunxi-fel list很可能会看到“找不到USB设备”或“权限被拒绝”的错误。有几种解决方案使用sudo临时每次都在命令前加sudo例如sudo sunxi-fel list。这是最直接但最不优雅的方式不适合频繁操作。修改udev规则推荐这是永久性、一劳永逸的解决方案。udev是Linux的设备管理器我们可以创建一条规则当特定的全志FEL设备接入时自动赋予其特定的访问权限如允许plugdev用户组读写。首先将你的用户加入plugdev组如果尚未加入sudo usermod -aG plugdev $USER你需要注销并重新登录这个组变更才会生效。然后创建一个udev规则文件。使用文本编辑器创建一个新文件例如sudo nano /etc/udev/rules.d/99-sunxi-fel.rules在文件中添加以下规则内容# Allwinner FEL mode device SUBSYSTEMusb, ATTR{idVendor}1f3a, ATTR{idProduct}efe8, GROUPplugdev, MODE0660这里1f3a和efe8是全志FEL模式下USB设备的通用厂商ID和产品ID适用于绝大多数全志芯片。保存并退出编辑器。然后重新加载udev规则使其生效sudo udevadm control --reload-rules sudo udevadm trigger现在重新插拔你的开发板确保其处于FEL模式你应该就可以在不使用sudo的情况下直接用sunxi-fel list命令看到设备了。注意事项有些较老或特定的全志芯片可能使用不同的USB PID/VID。如果上述规则不生效可以先将设备进入FEL模式并连接到电脑然后运行lsusb命令在输出列表中查找类似“Allwinner”或“FEL”字样的设备记下其ID格式为xxxx:yyyy然后用实际的idVendorxxxx和idProductyyyy替换上面规则中的值。5. 核心工具sunxi-fel实战详解编译安装好工具后我们来深入其核心——sunxi-fel的使用。它远不止是一个烧录工具更是一个强大的底层调试接口。5.1 FEL模式进入方法与设备识别让设备进入FEL模式是第一步。常见方法有上电即FEL有些开发板如荔枝派Nano有专门的“FEL”按键或跳线。在按住该键的同时给板上电芯片就会直接进入FEL模式。BootROM FEL这是最通用的方法。全志芯片在上电时会从SD卡、SPI Flash等预设的存储设备中寻找启动代码bootloader。如果找不到有效的启动签名芯片会在数秒后自动 fallback 到FEL模式。因此你可以通过不插任何启动介质或者插入一张空白/无启动功能的SD卡来触发进入FEL。软件触发在U-Boot或某些运行中的程序中可以通过执行特定命令如fel或run fel来跳转到FEL模式。设备进入FEL模式并通过USB连接到电脑后运行sunxi-fel list应该会显示类似以下的输出USB device 001:019 Allwinner FEL (1f3a:efe8)这表示系统已经识别到了FEL设备。5.2 内存与寄存器操作底层调试的基石sunxi-fel可以直接读写芯片的内存和寄存器这是进行裸机开发、逆向分析和紧急修复的超级能力。读取内存sunxi-fel hexdump [地址] [长度]。例如读取芯片内部SRAM起始的128字节sunxi-fel hexdump 0x00000000 128。这对于查看BootROM初始化的代码或数据非常有用。写入内存sunxi-fel write [地址] [文件]。你可以将一个二进制文件如一个编译好的裸机程序写入到指定的内存地址。例如将blink.bin写入到SRAMsunxi-fel write 0x00000000 blink.bin。执行代码sunxi-fel exe [地址]。让芯片从指定的内存地址开始执行指令。结合上一步你可以先写入一个裸机程序然后执行它sunxi-fel exe 0x00000000。这时你可能会看到开发板上的LED开始闪烁。读写寄存器sunxi-fel read32/read16/read8和write32/write16/write8。这是更底层的操作可以直接与芯片的硬件控制器交互。例如查询某个GPIO的状态。操作寄存器需要非常小心错误的写入可能导致系统锁死或硬件损坏。5.3 闪存编程从SPI NOR到NAND这是sunxi-fel最常用的功能之一——直接通过USB烧写板载存储。SPI NOR Flash很多全志开发板使用SPI NOR Flash存储Bootloader。sunxi-fel集成了SPI驱动。首先需要初始化SPI控制器sunxi-fel spiflash-info。这个命令会尝试探测并显示连接的SPI Flash信息型号、容量。如果显示成功说明SPI通信正常。擦除sunxi-fel spiflash-erase [地址] [长度]。擦除是写入的必要前提。写入sunxi-fel spiflash-write [地址] [文件]。例如将U-Boot写入到0x0地址sunxi-fel spiflash-write 0 u-boot-sunxi-with-spl.bin。验证sunxi-fel spiflash-read [地址] [长度] [输出文件]然后使用diff或md5sum对比原文件和读取的文件。SPI NAND Flash操作类似但命令前缀是spinand-例如sunxi-fel spinand-infosunxi-fel spinand-write。NAND Flash操作需要处理坏块sunxi-fel的工具链通常能处理基本的坏块管理但对于关键生产建议使用更专业的烧录器。eMMC/SD卡sunxi-fel本身不直接处理块设备烧录。标准的流程是通过FEL模式先向内存中加载并运行一个特殊的“FEL SD/MMC引导程序”通常是一个精简的U-Boot SPL然后这个运行在内存中的程序会初始化SD/MMC控制器再通过sunxi-fel的“批量数据传输”命令将完整的系统镜像如Ubuntu镜像写入到SD卡或eMMC中。这个过程通常由像sunxi-fel这样的上层脚本封装好你只需要提供镜像文件即可。5.4 高级功能与脚本化应用掌握了基础命令后你可以将它们组合起来实现自动化或完成复杂任务。批量命令执行sunxi-fel支持从标准输入读取命令。你可以创建一个文本文件commands.fel内容如下write 0x40000000 u-boot.bin write 0x41000000 dtb.dtb write 0x42000000 zImage exe 0x40000000然后通过管道执行cat commands.fel | sunxi-fel。这对于自动化测试或部署非常有用。与U-Boot结合进行系统烧录更常见的生产级用法是先用sunxi-fel将一个最小化的U-Boot SPL写入内存并执行这个U-Boot会初始化DRAM和存储设备然后通过USB或网络接收完整的系统镜像并烧写。社区工具如sunxi-fel注意这里指的是一个同名的Python脚本它封装了sunxi-fel二进制工具和U-Boot的交互就是基于这个原理实现了“一键烧录”SD卡镜像到板载eMMC的功能。开发与调试对于裸机程序开发者可以编写一个简单的Makefile或shell脚本在编译完程序后自动调用sunxi-fel write和sunxi-fel exe命令将程序加载到开发板内存并运行实现快速的“编辑-编译-调试”循环。6. 常见问题排查与深度优化指南即使按照步骤操作你也可能会遇到一些棘手的问题。这里汇总了常见的坑和解决方案。6.1 编译与安装问题排查问题现象可能原因解决方案make时报错fatal error: libusb.h: No such file or directorylibusb-1.0-0-dev开发包未安装。运行sudo apt install libusb-1.0-0-dev。make时报错undefined reference tolibusb_xxx‘链接阶段找不到libusb库。1. 确认libusb-1.0-0-dev已安装。2. 检查pkg-config是否能找到pkg-config --libs --cflags libusb-1.0应有输出。make install时报错Permission denied没有权限写入/usr/local。在命令前加sudosudo make install。或修改PREFIX到用户目录。运行sunxi-fel时报错command not found安装路径不在PATH环境变量中。1. 如果安装到/usr/local/bin通常已在PATH中检查是否拼写错误。2. 如果安装到自定义目录需将$HOME/.local/bin等路径加入PATH。6.2 设备连接与通信问题问题现象可能原因解决方案sunxi-fel list无输出但设备已连接。1. 设备未进入FEL模式。2. USB线缆或端口问题。3. 驱动/权限问题。1.确认FEL模式确保按正确方式进入FEL无启动介质、按FEL键上电。连接后板载LED可能无反应这是正常的。2.检查连接换USB口、换数据线确保是数据线非仅充电线。3.检查系统识别运行lsusb查看是否有Allwinner或1f3a:efe8设备。如果没有回到步骤1。4.检查权限如果lsusb能看到但sunxi-fel list不能就是udev规则未生效。用sudo sunxi-fel list测试如果成功则按章节4.3配置udev规则。操作过程中出现USB timeout或LIBUSB_ERROR_TIMEOUT。USB通信不稳定或中断。1. 使用高质量的USB数据线并直接连接电脑后置USB端口供电更稳定。2. 避免使用USB集线器。3. 某些主板尤其是笔记本的USB电源管理可能过于激进尝试在BIOS中关闭“USB selective suspend”等节能选项。4. 操作大文件如烧录大镜像时更容易超时这是正常现象可以尝试分块操作或使用更稳定的环境。sunxi-fel spiflash-info失败提示SPI错误。1. 板载SPI Flash型号不被支持。2. 硬件连接问题虚焊。3. 芯片或Flash处于非标准状态。1. 查阅sunxi-tools源码或社区确认你的Flash型号是否在支持列表内。可能需要更新到最新代码以获取支持。2. 对于NAND Flash命令是spinand-info别用错。3. 尝试先运行一个简单的内存读写命令确保基础FEL通信正常再排查SPI专用命令。6.3 进阶从源码到贡献当你熟练使用自己编译的工具后你可能会遇到一些边界情况或者想为社区添砖加瓦。阅读源码理解原理sunxi-tools的代码结构相对清晰。fel.c是sunxi-fel的主程序包含了命令解析和分发逻辑。usb.c封装了与libusb的交互。spi.c、spinand.c等文件则实现了具体的闪存操作协议。通过阅读源码你可以精确理解每条命令背后发生了什么这对于调试复杂问题至关重要。为新增芯片添加支持如果你手头有一款较新的全志芯片而sunxi-fel尚未支持你可以尝试添加支持。通常需要在include/sunxi_fel.h等头文件中添加芯片的标识符SID并在相关代码中补充其内存映射、时钟等基本信息。这需要参考全志官方的通常是泄露的或逆向的文档以及社区已有的类似芯片的补丁。调试与打补丁如果你从社区如Linux-sunxi邮件列表、GitHub Issues或相关论坛看到一个与你问题相关的补丁patch文件你可以使用git apply命令来应用这个补丁然后重新编译测试问题是否解决。例如# 假设你下载了一个 fix-spi-timing.patch 文件 git apply /path/to/fix-spi-timing.patch make clean make这让你无需等待官方合并就能用上最新的修复。提交问题与贡献代码如果你确认发现了一个bug或者成功为工具添加了新功能欢迎向官方仓库提交Issue或Pull Request。在提交前请确保你的代码基于最新的主分支并遵循项目的代码风格。清晰的问题描述包括硬件型号、软件版本、复现步骤、错误日志或经过充分测试的代码是让社区接受你贡献的关键。整个从编译到深度使用的过程是一个典型的开源硬件开发工作流。它不仅仅是运行几条命令更涉及到对工具链的理解、对硬件接口的掌握以及解决问题的方法论。自己编译的sunxi-tools就像一把自己打磨的称手工具用起来会更加得心应手。
返回列表