Allwinner & Arm 中国 & Sipeed 开源硬件 R329 SDK 上手编译与烧录!
首先全志这次有准备开放文档,感谢他们,但具体的内容凑合看看就好,还有一些杂乱,就跟我临时写的草稿一样,点此查看 (基于此我整理了必要的讯息)。
R329 芯片简介
R329 是全志科技针对智能语音旗舰市场推出的一款高集成度 SoC ,搭载双核 A53 1.5G CPU,内置双核 400MHz HiFi4 和 800MHz AIPU(zhouyi) 0.25TOPS,可以满足各种智能语音产品的需求
内置:DDR3 128MB/256M(如果您手中的R329芯片丝印型号为R329-N3,即为内置128M DDR;如果是R329-N4,即为内置256M DDR)
双核:HIFI4 400MHz,2MB SRAM
音频:5 路 ADC,2 路 DAC
接口:I2S3/DMIC/OWA,USB2.0*2,GMAC
显示:SPI LCD, PWM*15
工艺:HPC28+
封装:12mm×12mm
Tina Linux 系统介绍
Tina Linux是全志科技基于Linux内核开发的针对智能硬件类产品的嵌入式软件系统。Tina Linux 基于 openwrt-14.07 版本的软件开发包,包含了 Linux 系统开发用到的内核源码、驱动、工具、系统中间件与应用程序包。
*openwrt 是知名的开源嵌入式 Linux 系统自动构建框架,是由 Makefile 脚本和 Kconfig 配置文件构成的。使得用户可以通过 menuconfig 配置,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件。
实际上 Tina Linux 是经过 openwrt 演化过来的产物,在 R329 后魔改了不少编译规则,以至于对 luci 的软件支持恐怕有一些不够合适,主要原因还是芯片侧重点不是路由器了,所以官方可能也不太在意这些软件了。
废话就不多说了。
先拉仓库吧。
https://github.com/sipeed/R329-Tina-jishu
git clone https://github.com/sipeed/R329-Tina-jishu
cd R329-Tina-jishu
git submodule update --init --recursive
整个仓库不重要的部分经过 coding 仓库加速,所以只需要关注以下这几个仓库即可。(该版本为开源 SDK 版本,加上了一些驱动配置以支持 Sipeed 的 R329 板)
- https://github.com/sipeed/r329-package
- https://github.com/sipeed/r329-linux-4.9
- https://github.com/sipeed/r329-target
开源的只是裁剪了一些不必要的版型和暂不公开 DSP 和 NPU 的代码,其他的没有区别,正常使用就好。
- package 实际上就对应系统里的软件功能包,如一些 shell 命令或程序。
- linux-4.9 对应的 linux 内核,主要影响底层的驱动,如果需要移植到其他硬件时会来这里改改设备树和相关的裸机驱动。
- target 对应的是版型的一些配置文件和预置脚本等。
其他的很少改动,可以不用太关心,如 boot 、prebuild 等,在等项目的主仓库拉取的过程中,来认识一下 SDK 的构成吧,等看完了就差不多可以开始进行编译了。
SDK 结构
Tina Linux SDK 主要由构建系统、配置工具、工具链、host 工具包、目标设备应用程序、文档、脚本、linux 内核、bootloader 部分组成,下面是Tina主目录包含的文件和目录。
Tina-SDK/
├── build
├── config
├── Config.in
├── device
├── dl
├── lichee
├── Makefile
├── out
├── package
├── prebuilt
├── rules.mk
├── scripts
├── target
├── tmp
├── toolchain
└── tools
以下将对主要目录中包含的内容进行简单介绍。
- build
build 目录存放 Tina Linux 的构建系统文件,此目录结构下主要是一系列基于 Makefile 规格编写的 .mk 文件,主要的功能有:
(1)检测当前的编译环境是否满足 Tina Linux 的构建需求;
(2)生成 host 包编译规则;
(3)生成工具链的编译规则;
(4)生成 target 包的编译规则;
(5)生成 linux kernel 的编译规则;
(6)生成系统固件的生成规则。
- config
config 目录主要存放 Tina Linux 中配置菜单的界面以及一些固定的配置项,该配置菜单基于内核的 mconf 规格编写。
- device
devices 目录用于存放方案的配置文件,包括内核配置、env 配置、分区表配置、sys_config.fex(全志定制板级配置文件)、board.dts(linux标准设备树文件) 等。
*这些配置在旧版本Tina(Tina3.0以前)上是保存于 target 目录下,现新版本均移到了 device 目录下,但 defconfig 仍保存在 target 目录下
- lichee
lichee 目录主要存放 bootloader、linux内核、DSP等代码,其中DSP代码及编译环境因涉及DSP供应商科声讯版权,需单独申请。lichee目录下结构如下:
Tina-SDK
├── brandy-2.0
│ ├── build.sh
│ ├── tools
│ └── u-boot-2018
└── linux-4.9
- package
package 目录存放Tina系统支持的软件包源码和编译规则,目录按照目标软件包的功能进行分类,该目录包含了Tina系统全平台(包括全志R/H/F/V/T系列)的软件包,但是并不是所有软件包都适配了R329方案,部分软件包需要开发者自行适配。
- prebuild
prebuild 目录存放预编译用的交叉编译器,主要包括aarch64的glibc和musl以及arm的glibc和musl。prebuild目录下结构如下:
Tina-SDK
└── linux-x86
├── aarch64
│ ├── aarch64-toolchain.txt
│ ├── toolchain-sunxi-glibc
│ └── toolchain-sunxi-musl
├── arm
│ ├── arm-toolchain.txt
│ ├── toolchain-sunxi-glibc
│ └── toolchain-sunxi-musl
└── host
└── host-toolchain.txt
- scripts
scripts 目录用于存放设备开发中用到的一些脚本。
- target
target目录用于存放开发板相关的配置以及 sdk 和 toolchain 生产的规格。
- toolchain
toolchain 目录用于存放交叉工具链构建配置、规则。
- tools
tools 目录用于存放 host 端工具的编译规则。
- out
out 目录用于保存编译相关的临时文件和最终镜像文件,编译后自动生成此目录,并生成对应的方案out目录,如开发板对应的R329-evb5方案目录结构如下:
Tina-SDK/out
├── host
└── r329-evb5
├── boot.img
├── compile_dir
├── image
├── md5sums
├── packages
├── r329-evb5-boot.img
├── r329-evb5-Image.gz
├── r329-evb5-uImage
├── rootfs.img
├── sha256sums
├── staging_dir
└── tina_r329-evb5_uart0.img
其中 :
(1)tina_r329-evb5_uart0.img 就是编译打包后生成的最终烧写到开发板上的固件;
(2)boot.img 为最终烧写到系统 boot 分区的数据;
(3)rootfs.img 为最终烧写到系统 rootfs 分区的数据;
(4)r329-evb5-uImage为内核的 uImage 格式镜像,若配置为 uImage 格式,则会拷贝成 boot.img;
(5)r329-evb5-boot.img为内核的 boot.img 格式镜像,若配置为 boot.img 格式,则会拷贝成 boot.img
(6)compile_dir 为 sdk 编译 host、target 和 toolchain 的临时文件目录,存有各个软件包的源码;
(8)packages 目录保存的是最终生成的 ipk 软件包。
另外 out 目录下的 host 目录用于存放 host 端的工具以及一些开发相关的文件。
相信看到这里你已经有一些概念了,那就开始编译吧
我在这里就不打算重复教学了,可以先看这两篇完成基本的安装,我直接列一下必要的库,编译与测试环境在 ubuntu20 (wsl2)建议大于 8G 内存。
-
连接开发板 https://r329.docs.allwinnertech.com/devboardstudy/r329evb5studyadbuart/
-
编译环境配置 https://r329.docs.allwinnertech.com/devboardstudy/r329evb5ubuntu/
在看的时候,注意一下,上面两篇参考资料废话很多,如果你已经有经验了,就直接看脚本开始吧。
基础环境的安装。记得换 apt 源。
ubuntu18.04 & ubuntu20.04
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync intltool busybox cmake
Ubuntu20 要增强一下,补一下下面两个包 libffi6 (python3 需要)。
wget http://mirrors.kernel.org/ubuntu/pool/main/libf/libffi/libffi6_3.2.1-8_amd64.deb
sudo apt install ./libffi6_3.2.1-8_amd64.deb
sudo apt-get install uuid-dev
其他的,自己丟了就找找哈。
在 R329-Tina-jishu 下执行编译命令
编译前建议设置一下 export FORCE_UNSAFE_CONFIGURE=1 第一次编译 host 的软件,会出现 set FORCE_UNSAFE_CONFIGURE=1 这个变量的提示。
cd R329-Tina-jishu
source build/envsetup.sh
lunch r329_evb5-tina
make -j32
pack
对应的意思是:
source 加载编译环境,你可以得到 croot / cout 等跳转目录的功能,lunch 选择版型,确定要编译的版型。
dls@DESKTOP-XPS13:~/R329-Tina-jishu$ source build/envsetup.sh
Setup env done! Please run lunch next.
dls@DESKTOP-XPS13:~/R329-Tina-jishu$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. r329_evb5-tina
2. r329_evb5_min-tina
Which would you like? [Default r329_evb5]: 1
============================================
TINA_BUILD_TOP=/home/dls/R329-Tina-jishu
TINA_TARGET_ARCH=aarch64
TARGET_PRODUCT=r329_evb5
TARGET_PLATFORM=r329
TARGET_BOARD=r329-evb5
TARGET_PLAN=evb5
TARGET_BUILD_VARIANT=tina
TARGET_BUILD_TYPE=release
TARGET_KERNEL_VERSION=4.9
TARGET_UBOOT=u-boot-2018
TARGET_CHIP=sun50iw11p1
============================================
dls@DESKTOP-XPS13:~/R329-Tina-jishu$
make 有以下常用命令。
- make menuconfig 配置软件包
- make kernel_menuconfig 配置内核包
- make clean 清理项目
- make defconfig 保存当前软件配置,主要影响 defconfig。
- mkernel 是编译内核的简写命令。
boot 要到目录下进行配置,具体怎么使用,就自己参考荔枝派 linux 的配置加入 arch= 即可。
make 单独编译模块的时候 make package/xxx/xxxx/compile 或 clean 即可。
make -j32 V=s 的意思是 使用 32 核并行编译,建议第一次用 -j1 V=s 意思是单核并开启日志输出。
如果想要有颜色的输出可以按照 colormake 方便看异常和过滤输出。
pack 会进行打包变成 img ,供 PhoenixSuit 等全志提供的软件进行烧录,可能需要注意的是分区大小之类的调整,当然你可以烧录一次后通过 dd 命令导出镜像,方便其他人烧写。
如何烧写?
具体手把手教程下次补上,可以参考 V831 Sipeed 的板子教程。
按上图的核心板上的小按钮后通电,就会进入 fel 模式,或不插 SD 卡上电就会自动进入烧写模式(这要基于硬件设计),软件就会检测到了。
这种官方的烧录方法,在开发系统结束后就不会需要了,所以看过一次官方教程就行了 https://r329.docs.allwinnertech.com/devboardstudy/r329evb5compile 。
一些基础用法
基于 Sipeed V831 的 MaixPy3 文档,再拓展以下功能,看自己喜好学习使用就行,并不稀奇。
点灯 https://r329.docs.allwinnertech.com/devboardstudy/r329evb5studyled/
WiFi连网 https://r329.docs.allwinnertech.com/devboardstudy/r329evb5studywifi/
修改WiFi/BT模组 https://r329.docs.allwinnertech.com/devboardstudy/r329evb5xr829/
录音和播放 https://r329.docs.allwinnertech.com/devboardstudy/r329evb5studyarecord/
里面的 tina_test 提供了许多测试案例,方便开箱使用,还另外内置了 maix_test 是用 python3.7 写的(该 SDK 从3.5升到3.7了),主要用于测试 sipeed 的板子。
进阶的内容啊
等我忙完了 V833 再来整理吧,这次就出一篇开发者用的文档挂着,之后肯定会有用的,其他的一些资料也可以参考我先前整理的一些有关于 v831、v833 的内容呢。
该 SDK 的修改记录都公开了,如果有兴趣的同学也可以自行学习,或者直接用就行,没什么特别的。
最近推荐有开发经验的同学学习使用 golang ,比 python 启动快,兼容性更强,就是脚本化语言在教学与测试等需要快速重新运行的场合不可替代。