君正T31学习 (一) - 环境搭建

一、准备工作

使用ubuntu20.04版本。如果不会搭建,可以参考如下链接

win10下安装WSL-CSDN博客

1.1简介

什么是Zeratul

Zeratul是基于君正T系列芯片的电池类IPC开发平台,通过Zeratul,开发者可以快速开展电池类产品开发。

什么是Isvp

ISVP 是指智能视频开发平台(Intelligent Video Solution Platform),是基于君正 T 系列芯片的开发平台。

两者的关系

Zeratul 基于 ISVP,并封装了电池类 IPC 特殊的功能接口,比如 WIFI 连接、电源管理、关机唤醒等等功能。ISVP 中包含了 toolchain,基础操作文档(如 TF 启动卡制作教程),以及 libimp 的 API(IPC 产品音视频业务)及 doc 等等基础资源。ZeratulSDK 在此之上,拓展了电池类 IPC 所需的功能和应用,例如开关机控制,WIFI 操作等等。

一句话:Zeratul是在ISVP的基础上,为满足电池类IPC开发需求,搭建的平台

开发建议:有过君正T系列芯片开发经验 -> 浏览Zeratul SDK文档,否则,浏览ISVP SDK熟悉音视频业务流程

二、SDK介绍

2.1 SDK结构

Zeratul-T31的SDK下载后如下图:

各个文档介绍如下图:

2.2 系统分区设置于说明

boot分区

存放bootloader

tag分区

存放系统启动参数,包括cmdline,senso init setting,env参数,bootinfo等

kernel分区

存放内核镜像uImage

rootfs分区

rootfs(root filesystem,根文件系统)是操作系统启动时挂载的最基础文件系统,包含系统运行必需的目录和文件(如/bin、/sbin、/etc、/lib等),是内核启动后访问的第一个文件系统提供初始化系统、运行基础命令的唤醒

该分区存放根文件系统。rootfs使用lzo压缩(一种快速压缩算法,减小在flash中占用的空间,同时保证启动时能快速解压到内存),通过initrd(Initial RAM Disk,初始化内存磁盘)的方式挂载。initrd类似于initramfs方式,也是一种ramdisk,存放在内存上,因此在系统上创建或修改的文件,仅是存在内存中,下次启动后内容会被重置

system分区

存放系统资源,比如字体库,图片资源,三方库等等。使用squashfs(只读压缩文件系统。高压缩率和低内存占用)。使用squashfs的原因是系统资源问问比较大,因此需要压缩。同时以ro(只读)方式挂载避免数据损坏。同样由于使用了squashfs挂载,为了不影响启动速度,会在系统主程序运行后才进行挂载,因此system分区中存放的数据一般是系统初始化不依赖的资源,如果存放系统初始化依赖的资源和程序,则会影响系统主要业务的启动速度。

config分区

该分区为rw(读写)的jffs2文件系统(闪存文件系统),用来存放配置信息等临时数据。config分区是在系统首次启动时创建的。

recovery分区

存放recovery_os,其中recovery分区也是一个小型完整的OS,包含vmlinux+initramfs_root,使用lzma压缩。电子产品往往需要更新升级,并且具有恢复数据等功能。Camera 的 os 分区和 system 分区大小较大,如果在线直接烧写得话可能存在写中断和异常掉电的可能,因此 recovery 分区即是提供一种方式,启动另一个小型的 os,可以升级设备或者恢复损坏的文件系统

三、 ToolChain

toolchain即交叉编译工具链,是Linux机上用来编译和调试嵌入式设备程序的一系列工具的集合。ISVP中的Toolchain版本信息如下:

gcc版本:4.7.2

libc版本:

glibc版本:2.16

uclibc版本:0.9.33.2-npt

这里介绍一下gcc和libc。

gcc

gcc(GNU Compiler Collection,GNU 编译器集合)是一套由 GNU 项目开发的跨平台编译器套件,支持多种编程语言(如 C、C++、Objective-C、Fortran、Ada 等),并能在 Linux、Windows、macOS 等多个操作系统上运行,是软件开发(尤其是开源领域)中最常用的编译器之一。gcc 的核心作用是将源代码(如 C 语言代码)转换为可执行程序。

libc

libc(C Standard Library,C 标准库)是所有 C 语言程序运行时依赖的核心库,包含了一系列基础函数、宏定义和数据类型,提供了 C 语言程序与操作系统交互的底层接口,是 C 语言标准的重要组成部分。不同的操作系统或平台有不同的libc实现,常见版本如下:

实现版本 适用系统 特点
glibc Linux(主流发行版) GNU C 库,功能最全、兼容性强,支持多线程和复杂系统调用,是 Linux 的默认 libc。
musl libc Linux(轻量发行版) 轻量级、模块化,适合嵌入式系统和资源受限设备,代码简洁、许可证宽松(MIT)。
uClibc/uClibc-ng 嵌入式 Linux(如 OpenWRT) 为嵌入式优化,体积小、可裁剪,支持多种架构(ARM、MIPS 等)。
Newlib 嵌入式系统(如 RTOS、裸机) 适合无操作系统或轻量 RTOS 环境,常被用于单片机、FPGA 等开发。
MSVCRT Windows Microsoft C Runtime,Windows 下的 C 标准库实现(如msvcrt.dll)。

3.1如何安装

安装p7zip

复制代码
sudo apt-get install p7zip-full

如果提示如下报错,说明要更新软件源

执行如下指令

复制代码
sudo apt update && sudo apt upgrade -y

更新完成后,重新安装p7zip即可。

解压gcc

进入sdk的tools/toolchain/gcc_472目录下,根据主机CPU的位宽选择 mips-gcc472-glibc216-32bit.7z 或者 mips-gcc472-glibc216-64bit.7z 进行解压。例如:

复制代码
7z x mips-gcc472-glibc216-64bit.7z

修改环境变量

将toolchain下的bin目录添加到PATH环境变量中或者在**~/.bashrc**中加上下面一句永久改变

复制代码
gedit ~/.bashrc

export PATH=~/T31/Zeratul_T31_Release_20221121/Zeratul_Release_20221121/tools/toolchain/gcc_472/mips-gcc472-glibc216-64bit/bin/

环境变量生效

复制代码
source ~/.bashrc

测试toolchain

复制代码
mips-linux-gnu-gcc --version

如果出现如下版本信息,则标明toolchain安装正确。

3.2交叉工具包

交叉工具链是一个软件安装包,是很多工具的集合。例如,gcc编译工具、objdump反编译工具、as汇编器等等。

四、编译

设置环境

安装好toolchain后就可以编译sdk了。注意:SDK默认是使用T31ZX,如果使用T31ZL,需要替换zeratul uboot固件和修改tag的cmdline。ZX和ZL只有Flash和内存大小的区别

在sdk的顶层路径中执行如下命令:

复制代码
source build/env_setup_zeratul.sh

SOC type的选择可以根据板子丝印进行选择。可以根据下表进行选择

SOC type主要区别在于对内核不同扳级的选择

复制代码
[1]选项 T31A + ap6236/bcm43013/bcm43438/cyw43438 + T31_UART1_DEBUG + I2C
[2]选择 T31ZX/T31ZL + ap6236/bcm43013/bcm43438/cyw43438 + T31_UART0_DEBUG + I2C
[3]选择 T31ZX/T31ZL + ap6236/bcm43013/bcm43438/cyw43438 + T31_UART1_DEBUG + I2C
[4]选项 T31ZX/T31ZL + 7682 + T31_UART1_DEBUG + SPI

选择结束后,系统会自动开始编译。

检查环境

使用如下指令打印出来当前的环境变量

复制代码
export

出现ZRT_ENV_**表示终端source环境正确。

解压压缩包

是如下指令解压SDK中所有的压缩包,若已解压,则跳过此步。

复制代码
./build/unpack_all.sh

编译整个固件

安装Make,如已安装,则跳过。

复制代码
sudo apt install make

安装gcc,如已安装,跳过。

复制代码
sudp apt install gcc

安装mkimage

复制代码
sudo apt install u-boot-tools

安装lzop

复制代码
sudo apt install lz

编译

复制代码
./build/build_camera_all.sh

出现上面图片的界面,表示编译成功。

编译成功后,在out/目录下生成RT_CAMERA_FW.bin整个固件,在"out/camera/"目录下生成各个分区的内容

注意:使用build_camera_all.sh进行全部编译实际是调用各个分区脚本,如果out/camera目录下有相应的分区文件,默认使用则不会重新编译。如果需要重新编译,只要将out/camera目录下相应分区内容删除再执行脚本即可。

使用build_camera_all.sh编译会使用SDK基础配置强制覆盖修改内容。如果需要修改分区内容,需要进行手动编译,不推荐再用build_camera_all.sh脚本编译,防止覆盖修改内容。

实际使用中脚本调用关系如下图,各个分区的脚本互相独立