Emx应用开发手册

1.开发环境

  • Emx的开发基于Ubuntu 22.04版本
  • 主机需要安装 cmake >= 3.19,如果版本不够,可通过类似如下方式安装更新
    sudo apt install build-essential libssl-dev
    wget https://cmake.org/files/v3.26/cmake-3.26.2.tar.gz
    tar -zxvf cmake-3.26.2.tar.gz
    cd cmake-3.26.2
    sudo ./configure
    sudo make -j8
    sudo make install
  • 主机需要安装python3以及pycryptodome
    sudo apt install pip
    pip3 install pycryptodome
    # 如果安装不上pycryptodome可尝试下面这条指令更换pip源安装
    # pip3 install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host tuna.tsinghua.edu.cn
  • 主机安装用于固件打包
    sudo apt install squashfs-tools mtd-utils
  • 得到由Emx开发人员提供的
    • EmxSdk:Emx的SDK
    • Emx3dr:Emx开发需要使用的第三方库
    • EmxRes:Emx开发需要的资源库
    • EmxMedia:Emx开发需要的媒体库和媒体应用程序
    • psp:产品支持包

2.工程搭建

  准备好开发环境后就可以愉快的进行开发了

1.拷贝工程模板

  将EmxSdk中的EmxProductTemplate拷贝到一个让自己舒适的地方,并将其改为合适的产品名,然后进入到scripts目录执行下面的操作,这一步是为了将依赖的目录软连接到工程目录下,方便为后续编译和打包提供一致性环境(不连接编不过的)

chmod +x *
./softLink.py the/path/of/Public

下面来介绍一下这个工程里面的内容

├── CMakeLists.txt # 工程编译的顶层cmake文件,不需要改动
├── Public # 刚刚软连接过来的,里面存放各种依赖库
├── build.cmake # 用户需要自行定制的用于编译自己程序代码的cmake配置文件
├── configs # Emx配置文件目录
├── demo # Emx自带的示例程序
├── param # Emx参数文件目录
├── product.json # 产品工程配置文件
├── psp # 产品支持包,需要替换为Emx开发人员针对此产品提供的psp
└── scripts # 构建编译脚本
├── build.py # 编译应用程序
├── product.py # 构建产品目录并编译应用程序
├── release.py # 打包并发布固件
├── softLink.py # 软连接
└── utils.py # 脚本工具

将工程中psp替换为Emx开发人员提供的针对此产品合适的psp

2.编译测试

  此时将product.jsonEmxSdkVersion的值修改为EmxSdk目录中的最新版本,例如"EmxSdk-20231031-1",然后进入scripts目录下执行:

./build.py

一通编译打印之后应该会在output目录下生成了debug文件夹,这里面包含了demo程序

如果没编过,看看cmake版本是否正确,EmxSdk版本是否正确,softLink的路径是否正确...

3.产品构建

  进入scripts目录下执行下面指令,此时会在工程下出现imgs,firmware,spare三个文件夹,它们是通过脚本以及psp/psp.jsonproduct.json配置文件生成的临时目录,用于后续的imgs生成和固件打包

./product.py

4.编译打包

  进入scripts目录下执行下面指令,此时会对工程进行编译,将结果放入firmware和spare中,然后压缩成img文件,最后将img打包成固件

./release.py

执行结束后会在output目录下生成固件包,类似下面这样,其中XXX_Rom.bin是用来TF卡升级或者OTA升级的加密固件包,XXX_RawFlash.bin是用于工厂生产的时候烧录的flash文件

└── EP20-CT-Dev_2.0.20231107.1_0.0.2
   ├── EP20-CT-Dev_2.0.20231107.1_0.0.2_RawFlash.bin
   └── EP20-CT-Dev_2.0.20231107.1_0.0.2_Rom.bin

5.修改product.json

{
"EmxSdkVersion": "EmxSdkDebug", // 修改为希望基于的EmxSdk版本
"devInfo": { // 设备型号版本信息,用户可自行定制
"inner": { // 内部信息,固件升级和唯一标识
"type": "EP_CT_M4C7S3W0P0", // 内部类型,此型号会用于升级判断,相同才能升级
"version": "2.0.20231106.4" // 内部版本,此型号会用于升级判断,不相同才能升级
},
"outer": { // 外部信息,最终固件命名使用
"type": "EP20-CT-Dev", // 外部类型,展示给客户看的类型
"version": "0.0.2" // 外部版本,展示给客户看的版本
},
"hardware": { // 硬件信息
"type": "EpCv182xGunV1",
"version": "v1.0"
}
},
"cipher": { // Aes128加密密钥,用于固件和参数加密,用户可自行修改或使用如下默认的
"key": "EmxAes128Key0000",
"iv": "EmxAes128Iv00000"
},
"user": [ // 用户终端登录密钥,暂不支持
{
"name": "root",
"password": "123"
}
],
"EmxResToFirmware": [ // product.py构建的时候需要从EmxRes中拷贝过来的资源文件,一般由Emx开发人员预先写好
{
"src": "zoneinfo/default",
"dst": "configs/zoneinfo"
}
...
],
"ProductAppendFile": [], // product.py构建的时候需要拷贝的其他文件,格式同EmxResToFirmware,相对路径,相对于工程目录
"spare": { // spare分区小系统备份分区,用于升级擦写flash过程中异常断电后的继续升级
"ena": true,// 是否使能spare分区
"excludeFileList": [ //使能备份分区后会将firmware目录复制为spare目录,并删除这个列表中的目录或文件
"media/*",
"configs/media",
"param/media",
...
]
},
"rom": [ // 最终需要打包的固件包,可以打包多个
{
"name": "Rom", // 固件包后缀名称
"imgs": [ // 需要打包进固件中的img
"spare",
"firmware"
],
"pre_script": "", // 烧写前需要执行的脚本,可以为空
"post_script": "" // 烧写后需要执行的脚本,可以为空
}
]
}

6.编写build.cmake

  顶层CMakeLists.txt会加载build.cmake运行,build.cmake由用户编写实现编译自身的应用代码,默认的build.cmake加载了子目录demo进行编译安装,也可直接基于demo文件夹进行修改。其中有一些由顶层CMakeLists.txt传进来的变量可以使用,包括:

EmxSdkPath:EmxSdk路径
EmxSdkVersionPath:具体的某个EmxSdk版本路径
Emx3drPath:Emx3dr路径
InstallDir:app安装目录
InstallBin:app/bin安装目录
InstallLib:app/lib安装目录
EmxSdkVersion:EmxSdk版本
Cross:交叉编译链

7.修改启动脚本

  psp/scripts存放的是固件的启动脚本和一些配置脚本,运行在设备里,由于用户对启动的要求各不相同,这些文件可以自行修改配置,rootfs启动后会运行脚本appinit.sh,这是整个固件的启动入口,默认不启动任何应用程序