最近在做一个工业边缘计算网关的项目,核心主控选了广和通的 LE270-IN-1D3W6-10 这款模组。项目走到 SDK 开发阶段时,发现网上关于这套环境的资料非常零散,官方的 SDK Setup 文档又写得比较“点到即止”。前前后后折腾了两三周,踩了不少坑,把从环境搭建、SDK 安装到第一个业务应用跑通的全过程整理出来,给后面拿到同型号或同系列模组的兄弟做个参考。
先说清楚这套东西是什么:LE270-IN-1D3W6-10 是广和通基于高通平台的一款智能模组,集成了应用处理器、基带和 Wi-Fi/BT 能力。和普通 4G 通信模组不一样,它是“能跑系统、能跑 AI 推理、能接外设”的智能模组,适合做车载终端、边缘计算盒子、工业 PDA、机器人主控这类需要“通信 + 本地算力 + 外设接入”的场景。SDK 指的就是围绕这颗平台提供的一整套开发套件,包括交叉编译工具链、BSP、系统镜像、示例工程和烧录工具。
这篇文章围绕 LE270-IN-1D3W6-10 的 SDK Setup 和开发流程展开,从型号解读、选型思路,到环境准备、SDK 安装、应用开发、烧录调试,再到问题排查,掰开揉碎讲。适合刚拿到模组开发板准备开始干活的人,也适合选型阶段想评估这套平台适不适合自己项目的人。
1. 项目整体设计与选型思路
1.1 LE270-IN-1D3W6-10 型号到底怎么读
拿到模组第一件事不是上电,而是先把型号拆清楚。很多新手栽在这上面——型号后缀不同,对应的系统版本、内存配置、软件镜像可能都不一样。LE270-IN-1D3W6-10 按常见的型号规则大致可以拆成几个部分:
- LE270:系列名。定位是高性能智能模组,面向工业级和车规级场景。
- IN:这个一般和封装形式或硬件版本标识相关,具体到引脚定义和封装尺寸要以官方规格书为准。
- 1D3W6:这组编码通常跟配置组合有关。我的理解是,它可能代表存储或功能配比,比如 1 表示某一个版本的存储方案,3 表示支持的外设或频段组合,W6 大概率指 Wi-Fi 6 能力。这块建议直接找广和通的 FAE 要规格书确认,不同批次可能还有细微差异。
- 10:在我接触到的工程机里,这个位置多与生命周期承诺相关。广和通部分产品线承诺 10 年长期供货,末尾带 10 的型号一般对应这个长期供应版本。
选型时建议把这个型号完整报给供应商,不要只说“LE270”,不然 FAE 给你的 SDK 可能跟你的硬件配置对不上,后面烧录镜像时非常被动。
1.2 为什么选它做主控,而不是“开发板 + 通信模块”
我接触过不少团队做边缘网关时,习惯用“树莓派 + 4G USB Dongle”或者“RK 平台 + 独立模组”这种组合。不是说不行,但在工业场景下有明显的坑:供电稳定性、天线布局、宽温设计要求、长期供货保障。LE270 这类智能模组把这些都集成在一个封装里,应用 CPU、基带、射频、Wi-Fi/BT 都做了整体设计,做产品的 BOM 更简单,电磁兼容设计压力也小。
从我实际测试的感受来说,选这颗料还有几个直接的原因:
- 接口非常全。USB、PCIe、UART、I2S、SDIO、GPIO 都有引出,做车机、做工业平板、做边缘盒子都能顶得住。
- AI 算力是实打实的。平台集成了 NPU,跑轻量级视觉模型够用。我在调试时用 SD 卡跑过一个小型目标检测模型,帧率能满足基础业务要求。
- 系统生态成熟。基于高通平台,Android 和 Linux 两套系统都有成熟 BSP,不像一些小众方案只给你一个阉割版 SDK。
当然代价也有:价格比普通 4G 模组贵不少;CPU 主频和内存不能跟旗舰手机平台比;SDK 体积大,编译时间长,第一次同步代码加编译镜像,我这边满速跑了大概一个半小时。选型时算清楚自己的算力需求再做决定,别盲目追高性能。
2. SDK 环境准备与安装
2.1 拿到 SDK 先别急着装,先检查这四样东西
广和通官方会把 SDK 打包发过来,可能是一个压缩包,也可能是一个网盘链接。压缩包解压之后不要直接看代码,先做几个检查:
确认 SDK 版本和模组固件版本是否配套。包里面一般有个版本说明文件(可能是 RELEASE_NOTES.txt 或者 README.md),打开先看。如果版本号跟模组出厂固件不匹配,后面烧录完可能底层的 modem 和 AP 侧系统互相不认识,表现就是信号死活搜不到,日志里报 modem 启动失败。
确认宿主机的操作系统要求。官方一般推荐 Ubuntu 18.04 或者 20.04 LTS。我这次用的是 Ubuntu 20.04 x86_64,不要用 Windows WSL 跑完整编译,会踩到一堆权限和路径问题。
确认磁盘空间和内存。整个 SDK 完整同步加编译,磁盘占用随随便便 100GB 往上。我建议准备 200GB 空闲空间。内存 16GB 是起步,32GB 会更舒服,编译过程中编译器并行任务一开,内存不够直接 OOM,白等半小时。
确认有没有配套的烧录工具和驱动。有些 SDK 包里的烧录工具是独立分发的,不会合在同一个压缩包里。没有烧录工具,后面镜像编出来了也没法刷。
拿到 SDK 之后,先花半天时间翻一下目录结构,搞清楚哪块是 BSP、哪块是工具链、哪块是示例代码。磨刀不误砍柴工,这一步省不了。
2.2 宿主机环境配置与依赖安装
操作系统建议装 Ubuntu 20.04.6 LTS。装机时注意,磁盘分区时给根目录留足空间,/home 单独分出去的话也要留下至少 150GB。软件源建议切到国内镜像,不然下载依赖包能等到怀疑人生。
装完系统先做系统更新和基础依赖安装:
sudo apt update sudo apt upgrade -y然后安装编译和开发常用的包。高通方案的 SDK 一般依赖这些基础组件:git、repo、python3、gcc、g++、make、mtd-utils、android-tools-adb、fastboot 等。一次装齐:
sudo apt install -y git repo python3 python3-pip \ gcc g++ make mtd-utils android-tools-adb \ fastboot libssl-dev device-tree-compiler \ u-boot-tools flex bison libncurses5-dev \ libncurses-dev zlib1g-dev gawk curl file \ openssh-server部分 SDK 还会要求特定版本的 Python 包。我这次就遇到一个坑:SDK 里的编译脚本用 python3 调了一些 pkg_resources 接口,系统默认 python3 环境缺了 setuptools,编译到 40% 的时候直接中断。提前装好:
sudo apt install -y python3-setuptools装完依赖之后,建议把 USB 设备权限也配上。否则 adb 和 fastboot 经常报 no permissions。把当前用户加入 plugdev 组,再写一个 udev 规则:
sudo usermod -aG plugdev $USER然后新建 /etc/udev/rules.d/51-android.rules,里面写上高通平台常见的 VID/PID 放行规则,不同版本高通设备的 USB Vendor ID 通常都是 05c6(高通),可以按这个 vendor 放开:
SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev"写完重载 udev 规则:
sudo udevadm control --reload-rules sudo udevadm trigger注意:不要用 root 用户直接编译整个 SDK。很多高通 SDK 的编译脚本对用户环境和路径有严格要求,root 编译有时会出一些莫名其妙的权限和 cache 冲突。普通用户加 sudo 才是正确姿势。
2.3 SDK 解压与目录结构解读
把 SDK 压缩包放到工作目录,我用的是 /home/fibocom/le270_sdk,解压:
mkdir -p /home/fibocom/le270_sdk cd /home/fibocom/le270_sdk tar -xvf LE270_IN_SDK.tar.gz解压完你会看到一个比较标准的目录结构。不同版本会有差异,但核心部分一般包含这几块:
- build / makefile 相关目录:编译入口,一般有脚本负责设置编译环境变量。
- BSP / kernel 目录:内核源码和设备树。
- bootloader 目录:包括 sbl、aboot、tz 等底层镜像源码或预编译产物,用于生成引导镜像。
- modem 相关目录:modem 侧的固件和配置,注意这一层很多部分是预编译的,不需要重新编译。
- toolchain 目录:交叉编译工具链,可能以压缩包形式提供,需要先安装到指定位置。
- example / mcu 目录:官方提供的示例工程,包括串口、GPIO、网络、协议栈等基础例程。
- out 目录:编译产物输出位置,烧录镜像最终在这里。
建议先读 SDK 根目录的 README 或 Quick Start,里面通常会写明“第一步执行什么脚本”。不同项目 SDK 的编译入口命名不一定一样,常见的有 build_le270.sh、make_android.sh、source env.sh 等。这一步不用背,但要会找。
3. 核心开发要点与实现流程
3.1 环境变量初始化与第一次编译验证
拿到一个陌生 SDK,我的习惯是不管示例工程,先把整个系统镜像编译一遍。目的不是产出最终镜像,而是验证工具链、依赖、编译脚本在你机器上能不能完整跑通。
打开终端进入 SDK 根目录,通常要先 source 一下环境脚本。这一步会把交叉编译器路径、库路径、编译工具版本等变量注入当前 shell。比如:
cd /home/fibocom/le270_sdk source build/envsetup.sh脚本执行完终端提示符可能会变化,这是正常的。接着调用编译入口,一般会有一个 lunch 或产品配置选择步骤,类似 Android 源码编译的lunch操作。选择和你模组型号对应的配置项,LE270-IN-1D3W6-10 对应的配置名在菜单里通常带有 le270 标识。选定之后开始编译:
./build.sh -T le270-in-1d3w6-10 2>&1 | tee build_full.log第一次编译时间比较长。我这次编译整个系统镜像,配置了 16 线程并行,大约用了一个半小时。中间输出大量编译日志,只要最后没有异常终止,说明环境基本没问题。建议编译过程中不要开太多高负载任务,避免抢占 CPU 和内存导致编译失败。
日志保存很重要。编译报错时先查 build_full.log,按关键字 ERROR 搜,定位比盯着屏幕滚字快得多。
3.2 用示例工程跑通第一个业务
系统镜像能编译通过,说明 SDK 工具链没问题。接下来跑一个最基础的应用,验证开发板和 SDK 之间的通路。
官方示例工程一般提供串口读写、GPIO 控制、网络 socket、音频、GPS 读取等例程。我建议最短路径选“串口读写”或者“网络 Socket”——这两个链路短,容易定位硬件还是软件问题。
以串口为例,先在 SDK 的 example 目录下找到对应工程,一般是 makefile 组织的裸机工程。看看目标平台配置:
CROSS_COMPILE ?= /home/fibocom/le270_sdk/toolchain/aarch64-linux-gnu/bin/aarch64-linux-gnu-这里交叉编译工具链路径必须写对。很多编译失败都是 CROSS_COMPILE 没设或者路径不对导致的。确认后直接 make,输出一个可执行文件,通过 adb push 推到开发板上运行:
adb push ./uart_test /data/local/tmp/ adb shell chmod +x /data/local/tmp/uart_test adb shell /data/local/tmp/uart_test /dev/ttyHS0嵌入式 Linux 平台串口设备节点常见是 /dev/ttyHS0、/dev/ttyS0 或 /dev/ttyUSB0,具体映射关系查 SDK 里的设备树文件。
如果想跑更贴近业务的应用,可以写一个简单的 TCP socket 上报脚本,用 Python 直接验证网络通路。开发板运行 Linux 系统时一般自带 python3,写在板上执行即可:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("your-server-ip", 8080)) s.sendall(b"hello from LE270") print(s.recv(1024)) s.close()能用 adb push 文件、能跑 socket 通信,说明系统起来、串口/网络通路正常,SDK 就算真正可用了。
3.3 交叉编译应用时易踩的三个坑
交叉编译看着简单,实际上新手最容易在这个环节出问题。整理我实际踩过的三个坑:
坑一:宿主机 gcc 编译出来的程序直接 push 到板子上跑。看起来能跑,实际上执行时会报 Exec format error。因为 PC 上编出来的是 x86 架构,板子上是高通 ARM 架构。必须用 SDK 提供的 aarch64 交叉编译器,而且要注意编译器版本要和 SDK 匹配。
坑二:动态链接库找不到。用交叉编译器编出来的程序如果依赖宿主机的动态库,push 到板上运行时经常报 not found。解决方法是编译时尽量静态链接:
aarch64-linux-gnu-gcc -static -o my_app my_app.c或者在编译选项里通过 -Wl,-rpath 指定板子上实际存在的库路径,但工程上最省心的还是静态链接,尤其是调试阶段。
坑三:sysroot 不对。SDK 里的交叉编译器往往自带 sysroot,头文件和库都挂在工具链目录下。如果自己去网上随便下一个 aarch64 编译器,就算编译过了,链接阶段也可能因为找不到高通平台私有库而失败。务必用 SDK 自带的工具链,找不到的话检查 SDK 里是否提供了 toolchain 的 tar 包,确认安装到了 makefile 默认路径。
4. 烧录与调试实战
4.1 烧录前的准备工作和关键确认
系统镜像编译通过之后,下一步就是把镜像烧到开发板上。烧录之前先把开发板的状态确认一遍,避免刷成砖。检查项如下:
- 开发板供电是否充足。LE270 开发板对供电要求比较高,我试过用普通 USB 口供电,刷机到一半直接掉电重启,直接变砖。建议用官方配套的 12V 或者 5V/3A 电源适配器。
- 开发板当前模式和进入烧录模式的方式。查开发板手册,一般有拨码开关或者按键组合。进入 EDL(Emergency Download)模式后,PC 的 USB 设备列表里会出现高通 9008 端口。高通的 EDL 模式和 fastboot 模式是完全不同的烧录通道。
- 备份当前板上的原始镜像。这一步很少有人做,但我强烈建议做。用官方烧录工具做一次完整 readback,把出厂镜像备份出来。后面调试过程中如果出现误擦除,有备份就能快速恢复出厂状态。
检查无误后,用 USB 线连接开发板。烧录通道用的是 USB,不需要接串口。准备就绪后打开烧录工具,我这边用的是高通 QFIL 工具和广和通提供的 flash 脚本,两者都能用,看你习惯。
4.2 使用 fastboot 刷机的主要步骤
如果开发板能正常进入系统并可以被 adb 识别,最快捷的刷机方式是通过 fastboot。操作流程如下:
adb reboot bootloader此时设备进入 fastboot 模式,检查设备是否被识别:
fastboot devices能看到设备输出即说明连接正常。然后逐个刷入镜像分区。不同 SDK 版本分区名有差异,常见的有:
fastboot flash boot boot.img fastboot flash system system.img fastboot flash vendor vendor.img fastboot flash dtbo dtbo.img fastboot flash vbmeta vbmeta.img注意:不要一次性盲目擦除所有分区,特别是 persist、modemst1、modemst2 这类分区。这些分区保存了校准数据和 modem 参数,擦掉之后可能出现信号异常或者无法打电话的问题,恢复起来要重新校准。
全部刷完之后:
fastboot reboot设备正常重启,说明镜像刷入成功。如果重启卡死,检查 vbmeta 是否需要加参数关闭校验,或者镜像版本和硬件小板配置不匹配。
4.3 系统日志抓取与异常定位
应用跑起来之后,调试主要靠两路日志:一路是 adb logcat 抓 AP 侧系统日志,另一路是串口抓内核启动日志和 modem 日志。
抓 logcat 时建议加上时间戳和等级过滤:
adb logcat -v threadtime -b all > logcat.txt其中 -b all 会同时抓 main、system、crash 等缓冲区,定位崩溃时非常有用。实时看的话可以先做一次完整 dump 再恢复现场重复操作,直接看崩溃信息:
adb logcat -b crash -d内核日志也经常要看,设备串口上一般有一条调试串口,板子启动时按任意键进入 u-boot 命令行,启动 Linux 时可以看到完整内核打印。如果没有接串口,也可以通过 adb 查看:
adb shell dmesg我调试过程中遇到模组网络起不来,logcat 里反复报 modem 相关错误,后来是抓了串口的完整启动日志,发现 kernel 阶段在初始化 PCIe 时挂了一个设备树节点,才定位到是设备树配置和实际硬件不在同一个版本。所以串口调试线别省,尤其前期系统还没完全起来、adb 还不可用的时候,串口是唯一的救命通道。
5. 常见问题与排查技巧实录
5.1 问题速查表
把这两周踩过的坑整理成表格,后面遇到类似问题可以直接查。强调一下,下列处理方法是基于我手上这套 SDK 和工程机的常见实践,具体版本差异需要结合实际情况调整。
| 现象 | 可能原因 | 解决思路 |
|---|---|---|
| adb devices 看不到设备 | USB 插线接触不良 / 驱动没装 / udev 规则缺失 | 先换线换口;Linux 下确认 udev 规则已加载;Windows 下装高通 USB 驱动 |
| fastboot devices 无设备 | 没有进入 fastboot 模式 / USB 连接在非烧录口 | 确认 adb reboot bootloader 命令成功;核对开发板手册确认烧录 USB 口 |
| 编译过程中 OOM 被杀 | 内存不足 | 降低并行数,例如 make -j4;或扩内存和 swap |
| 编译报找不到头文件 | 环境变量未 source / sysroot 路径不对 | 重新 source 环境脚本;检查 makefile 里的交叉编译器路径和 sysroot 配置 |
| 刷机后卡在开机 logo | 烧录分区不完整 / 镜像与硬件不匹配 | 重新刷 boot、system、vendor 等核心分区;对照 SDK 版本说明确认镜像型号匹配 |
| 模组信号搜不到,logcat 报 modem 失败 | modem 固件与 AP 镜像版本不匹配 / modem 分区被擦除 | 重新刷 modem 分区;确认 SDK 版本和出厂 modem 版本一致 |
| adb push 大文件很慢或中断 | USB 线质量差 / 开发板供电不足 | 换带屏蔽的 USB 线;用独立电源供电;关闭 USB 自动休眠 |
| 设备反复重启 | 电源问题 / 内核崩溃 | 换电源适配器;抓 dmseg 和 logcat 崩溃日志定位 |
| 编译报 python3 找不到模块 | 系统 python 环境缺包 | 按报错提示安装对应 python 包,常见 setuptools、pyserial |
| 跑完 fastboot flash 提示 permission denied | 分区保护 / 需要解锁 | 通过 oem unlock 或官方工具解除锁状态,擦除 userdata |
5.2 救砖的两个关键方法
刷机过程中最惨的情况就是把系统分区搞坏,设备连 fastboot 都进不去。不用慌,这套平台有两条救砖路径。
方法一:EDL 模式紧急下载。设备按住进入 download 模式的组合键,插 USB,PC 上出现高通 9008 端口。打开 QFIL 或广和通烧录工具,选择完整 firehose 镜像包,点击下载。这种方式能连底层分区一起恢复,只要硬件没坏基本都能救回来。
方法二:从 u-boot 拉网络镜像。如果设备串口能进 u-boot,可以通过 tftp 方式加载预编译镜像,但前提是你本地得有 tftp server 和对应的 kernel 镜像。工程上不如 EDL 方便,适合玩过 u-boot 的人。
救砖原则:能进 fastboot 就优先用 fastboot 刷完整分区,别急着走 EDL;只有 fastboot 完全进不去才用 EDL。另外手上的 SD 卡槽有时也能帮上忙,如果支持 SD 卡启动,可以先从 SD 卡起一个最小系统,再通过 adb 把镜像刷进 eMMC。
5.3 关于版本管理和协作的一点建议
SDK 开发过程中,版本管理和配置同步也是容易炸的地方。我自己吃了两次亏之后,总结了三条经验:
- 拿到新 SDK 之后,先记录版本号和编译当时的 git commit。很多 SDK 发布包里并不自带版本管理记录,只靠目录名区分,后面排查问题时绕了一大圈才发现是 SDK 版本和硬件批次的原因。
- 对本地的改动做独立 patch 管理,不要直接改 SDK 原始文件。我习惯在 SDK 目录外面建一个 patches 目录,任何针对 BSP、设备树、编译脚本的修改都生成 patch 保存。这样官方发新版 SDK 时,可以快速把自定义改动移植过去,不用在所有文件里人肉找差异。
- 多人协作时,统一编译环境。同一个 SDK 在 Ubuntu 18.04 和 20.04 上编译,产物可能不一样,可能是编译器版本或系统库差异造成。建议团队内部统一使用同一份 Dockerfile 或虚拟机镜像,保证所有成员产出可复现。
6. 最后分享一点个人经验
这套 LE270-IN-1D3W6-10 的 SDK 开发,整体难度不在代码,而在“版本配套”。模组硬件批次、SDK 版本、烧录工具版本、宿主系统版本,这四个要素只要有一个不一致,表现出来就是各种玄学问题。所以拿到 SDK 的第一步应该是建一个“版本档案”,把这四个要素全部记录下来,再开始动手。
另一个体会是,交叉编译阶段不要过度依赖动态库。嵌入式平台调试期,每个模块都尽量静态链接,能省掉大量“板子上缺 .so”的排查时间。等应用稳定要正式集成时再考虑动态库裁剪,缩小镜像体积。
最后一个小建议:开发初期就把板子的串口调试口引出来,固定好线序,别图省事只依赖 adb。系统起不来、adb 又连不上的时候,串口是你的最后一根救命稻草。我这次调试某个底层驱动问题,就是靠串口日志定位到了一个设备树版本不匹配的问题,否则光靠 logcat 根本查不出来。这套平台可玩性很高,前期把底子打牢,后面做业务功能会顺手很多。