2、开发环境搭建:Linux开发环境配置(Ubuntu 20.04)、交叉编译工具链安装、SDK获取与目录结构解析、源码编译与烧录工具使用
说实话,做嵌入式开发这么多年,我踩过最多的坑就是环境搭建。明明代码逻辑没问题,编译出来就是跑不起来。后来我学乖了——先把环境搞干净,后面能省下一大半的调试时间。
这一章,咱们就把全志XR系列芯片的开发环境从头到尾捋一遍。我用的是Ubuntu 20.04,这也是官方推荐的主机系统。你如果用的是其他版本,问题也不大,但20.04是我验证过最稳的。
2.1 主机环境准备:Ubuntu 20.04 基础配置
拿到一台新装的Ubuntu,第一件事不是装SDK,而是把基础依赖补齐。我习惯先跑一遍更新:
sudo apt update
sudo apt upgrade -y
然后安装编译必备的软件包。这里我列一个清单,你直接复制粘贴就行:
sudo apt install -y build-essential git vim cmake
sudo apt install -y python3 python3-pip
sudo apt install -y libncurses5-dev libssl-dev
sudo apt install -y flex bison
sudo apt install -y gcc-arm-none-eabi
tree命令。后面看SDK目录结构时,tree -L 2比ls直观太多了。
为什么要装gcc-arm-none-eabi?因为全志XR系列芯片用的是ARM Cortex-M内核,裸机或RTOS开发都需要这个交叉编译器。你想想看,如果主机是x86架构,编译出来的二进制文件当然不能在ARM上跑,对吧?
2.2 交叉编译工具链安装
官方SDK里其实自带了一套工具链,但我个人建议单独装一份。为什么?因为SDK版本更新时,工具链可能跟着变,你手头有一份独立的工具链,调试起来更灵活。
我常用的安装方式有两种:
方式一:apt直接安装(推荐新手)
sudo apt install gcc-arm-none-eabi
装完后验证一下:
arm-none-eabi-gcc --version
看到版本号输出,就说明装好了。
方式二:从ARM官网下载(推荐老手)
有时候apt源里的版本比较旧,我会去ARM官网下载最新的工具链。解压后配置环境变量:
export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin
记得把这行加到~/.bashrc里,不然每次开终端都要重新export。
2.3 SDK获取与目录结构解析
全志XR系列的SDK,一般是从官方Git仓库拉下来的。我习惯用git clone,这样后续更新也方便:
git clone https://github.com/allwinner-xr/XR871-SDK.git
拉下来之后,咱们看看它的目录结构。嗯,这里我直接贴一个典型结构:
XR871-SDK/
├── app/ # 应用层代码
├── bin/ # 编译生成的二进制文件
├── build/ # 编译脚本和配置文件
├── components/ # 组件库(WiFi、蓝牙、驱动等)
├── docs/ # 文档
├── include/ # 头文件
├── lib/ # 预编译库
├── project/ # 工程配置文件
├── tools/ # 工具链和烧录工具
└── Makefile # 顶层Makefile
这里我重点说几个目录:
- app/:你的业务代码就放这里。我刚开始做项目时,总喜欢把代码到处乱放,结果后面找起来特别痛苦。后来我强制自己只改
app/下的文件,其他目录尽量不动。 - components/:这是SDK的核心。WiFi协议栈、蓝牙协议栈、外设驱动都在这里。你如果要做底层驱动开发,这个目录你得翻烂。
- project/:每个工程对应一个配置文件。比如你要用XR871芯片做智能灯,就在
project/下新建一个smart_light目录,里面放defconfig和Makefile。
components/下的源码!如果你需要定制驱动,正确的做法是复制一份到app/下,然后修改工程配置指向你的副本。我曾经直接改了WiFi驱动,结果SDK一更新,我的修改全被覆盖了……那叫一个酸爽。
2.4 源码编译
编译其实很简单,但有几个细节要注意。我先说标准流程:
cd XR871-SDK
make menuconfig # 配置工程
make # 编译
make menuconfig会弹出一个图形化配置界面,你可以选择芯片型号、使能WiFi或蓝牙、配置调试串口等。我第一次用的时候,看到这个界面还挺亲切的——跟Linux内核的配置界面一模一样。
配置完成后,直接make就行。编译时间取决于你的机器性能,一般几分钟到十几分钟不等。
编译成功后,在bin/目录下会生成.bin文件。这就是我们要烧录到芯片里的固件。
V=1参数,可以看到详细的编译命令:make V=1。如果编译报错,这个参数能帮你快速定位问题。我遇到链接错误时,经常靠这个参数找到是哪个.o文件出了问题。
2.5 烧录工具使用
全志XR系列芯片的烧录方式有两种:串口烧录和USB烧录。我一般用串口烧录,因为调试时串口线一直连着,方便反复烧写。
烧录工具在tools/目录下,叫phoenixMC。使用前先安装依赖:
sudo apt install libusb-1.0-0-dev
然后连接硬件:
- 用USB转串口线连接芯片的UART0(TX、RX、GND)。
- 按住芯片上的BOOT键,再按一下RESET键,然后松开BOOT键。这样芯片就进入烧录模式了。
- 运行烧录命令:
cd tools/phoenixMC
./phoenixMC -c /dev/ttyUSB0 -b 115200 -i ../../bin/your_firmware.bin
这里-c指定串口设备,-b指定波特率,-i指定固件路径。烧录过程中会显示进度条,看到100%就说明成功了。
ttyUSB0,你可以用ls /dev/ttyUSB*查看。如果插上没反应,检查一下驱动:lsmod | grep ch341。很多USB转串口芯片用的是CH340或CP2102,Ubuntu默认不带驱动,需要手动装一下。
烧录完成后,按一下RESET键,芯片就会从新固件启动。如果串口助手能看到打印信息,说明一切正常。
嗯,到这里,开发环境就搭好了。你可能会觉得步骤有点多,但相信我——只要按这个流程走一遍,后面写代码、调试、烧录都会非常顺畅。下一章,咱们就开始写第一个驱动,让芯片的GPIO亮起来。