Allwinner & Arm 中国 & Sipeed 开源硬件 R329 SDK 上手编译与烧录!

首先全志这次有准备开放文档,感谢他们,但具体的内容凑合看看就好,还有一些杂乱,就跟我临时写的草稿一样,点此查看 (基于此我整理了必要的讯息)。

R329 芯片简介

R329 是全志科技针对智能语音旗舰市场推出的一款高集成度 SoC ,搭载双核 A53 1.5G CPU,内置双核 400MHz HiFi4 和 800MHz AIPU(zhouyi) 0.25TOPS,可以满足各种智能语音产品的需求

R329application

内置: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 板)

开源的只是裁剪了一些不必要的版型和暂不公开 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 内存。

在看的时候,注意一下,上面两篇参考资料废话很多,如果你已经有经验了,就直接看脚本开始吧。

基础环境的安装。记得换 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 启动快,兼容性更强,就是脚本化语言在教学与测试等需要快速重新运行的场合不可替代。

posted @ 2021-04-12 22:29  Juwan  阅读(3992)  评论(1编辑  收藏  举报