跳转至

编译和烧写

在搭建好编译环境并下载好源码后,即可对源码进行编译,编译打包好后,即可将打包好的固件烧写到设备中去。本文主要介绍编译和烧写的方法。

*编译环境搭建的方法见:Tina 编译环境配置

*源码下载的方法见:Tina SDK源码获取

编译打包

编译打包命令如下:

source build/envsetup.sh
lunch
make -j32
pack

其中:

  • source build/envsetup.sh :获取环境变量
  • lunch 会提供方案选项以供选择,其中 lunch d1-h_nezha-tinad1-h_nezha-tina 的标准方案,lunch d1-h_nezha_min-tina 是只能让系统跑起来的最小系统方案。
  • make -j32 :编译,其中-j后面的数字参数为编译用的线程数,可根据开发者编译用的PC实际情况选择。
  • pack : 打包,将编译好的固件打包成一个.img格式的固件,固件路径 /out/d1-h_nezha-tina/tina_d1-h-nezha_uart0.img

image-20210412172230014

*每次打开一个ubuntu终端只需要做一次获取环境变量和选择方案的操作,在这个终端多次编译的时候不需要再做前两步操作,直接 make -j 即可。

烧写

烧写,即将编译打包好的固件下载到设备

烧写方式简介

全志平台为开发者提供了多种多样的烧写方式和烧写工具:

(1) PhoenixSuit:基于Windows的系统的烧写工具,是最常用的烧写工具,通过数据线将PC和开发板连接,把固件烧到开发板上,支持分区烧写,适用于开发和小规模生产使用。建议开发者开发时使用该工具进行固件升级。

(2)LiveSuit:基于Ubuntu的系统的烧写工具,通过数据线将PC和开发板连接,把固件烧到开发板上,即Ubuntu版的PhoenixSuit,适用于Ubuntu系统开发者进行开发烧写。

(3)PhoenixUSBpro:基于Windows的系统的烧写工具,通过数据线将PC和开发板连接,把固件烧到开发板上,一台PC可同时连接8台设备,分别控制其进行烧写,适用于产线批量生产。(如下图)

(4)PhoenixCard:基于Windows的系统的量产SD卡制作工具,可以将普通的.img固件制作成SD卡量产固件,生产时在设备端插入量产SD卡即会自动烧写固件,适用于带SD卡卡槽的设备大规模量产。

(5)存储器件批量烧写生产:用专有设备将提前将固件烧写到未贴片的存储器件(如emmc、nand、nor等)上,再上机贴片,可提高设备生产效率,需要拉通存储器件前才原厂和全志原厂定制设备联调,适用于超大规模产品的量产。

PhoenixUSBpro界面

PhoenixSuit使用简介

下面主要介绍用PhoenixSuit烧写的方法,LiveSuit和PhoenixUSBpro烧写的方法类似。

PhoenixSuit下载地址:固件烧写工具PhoenixSuit

同时需安装全志USB驱动,下载链接:全志USB驱动

*企业开发者在安装APST的同时也会安装全志USB驱动,无需单独再安装

具体步骤如下:

(1)打开PhoenixSuit,当设备上电启动并插入USB与PC相连的时,PhoenixSuit会提示识别到设备;

(2)点击 一键刷机-浏览选择要烧写的固件;

(3)点击 立即升级,此时会通过USB给设备发送重启命令,设备会带着烧写标识重启,并在重启阶段进入烧写模式;

(4)设备重新到boot的时候会自动进行烧写,可以看到PhoenixSuit的进度条在动;

(5)烧写成功,设备重启。

image-20210310195432915

空设备烧写

当设备第一次烧写时(即设备内没有系统),PC打开烧写工具,设备插入USB,烧写工具工具会自动弹出烧写提示,此时按YES按钮即可进行烧写(需提前在固件处选好要烧写的固件)。

按住fel按键烧写

在开发板正面中间位置有一个fel按键,PC打开烧写工具后,按住fel按键再插入USB上电,此时也会如空设备烧写一样进入烧写模式.

*提示:当PC识别到设备弹出提示后,即可松掉fel键,不用一直按着

已有设备固件烧写

对于已经烧过固件的设备,在开发过程中,可以在串口或ADB终端输入烧写重启命令 reboot efex重启设备,此时设备会重启并在启动过程中自动进入烧写模式,后续烧写过程同上 PhoenixSuit使用简介

*串口及ADB调试方法见: USB及串口调试

异常设备的烧写

在开发过程中,可能会出现设备烧写了配置错误的固件导致设备启动异常的情况,这个时候无法按照正常启动设备,也就无法正常控制设备烧写,这就需要强制让设备进入烧写模式。常用的方法有两种:

按住PC键盘的“2”键

设备上电过程中,在串口终端按住PC键盘的“2”不停地输入“2”,设备启动的时候如果检查到“2”的输入,则会自动跳到烧写模式。如图(是真的按住键盘的“2”,很多新开发者不理解这个隐藏操作):
input2

短接Nand

设备上电过程中,用镊子或者杜邦线短接Nand的供电脚(右下脚的两根引脚),这样设备在启动过程中,就会检查不到Nand的存在,误以为这是一片空片,这样设备就会按照空片启动的流程,自动进入烧写模式。如图: 短接nand

*提示:当PC识别到设备弹出提示后,即可松掉短接的杜邦线,不用一直短接

进阶编译操作

如果不需要完整编译整个系统,也可以对部分模块进行编译,如单独编译boot0、单独编译uboot、单独编译内核和单独编译某个包等,Tina环境都提供了相应的快捷命令

  • 单独编译boot0和uboot:mboot,可在Tina任意目录下使用
  • 单独编译boot0:mboot0,可在Tina任意目录下使用
  • 单独编译uboot:muboot,可在Tina任意目录下使用
  • 单独编译内核:mkernel,可在Tina任意目录下使用
  • 单独编译某个包:mm,只能在编译的包路径下操作,如包路径为 tina/package/utils/rwcheck,则需要进入到 tina/package/utils/rwcheck路径下再输入 mm 命令,编译出来对应的安装包的路径在 tina/out/d1-nezha/packages/base
  • 在根目录下编译某个软件包:make <应用包的路径>/install,需要在根目录下操作,如 make package/utils/rwcheck/install
  • 在根目录下清空应用包临时文件:make <应用包的路径>/clean,需要在根目录下操作,如 make package/utils/rwcheck/clean

SDK下载常见问题及解决方案

问题1

fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle  
fatal: error [Errno 101] Network is unreachable

解决办法:

请按照文档安装AW提供的repo程序 http://open.allwinnertech.com/guide/yht2/chan_pin_bao_xia_zai/zi_yuan_ku/23001_an_zhuang_repo_yin_dao_jiao_ben.html

问题2

Host key verification failed.
Fatal: could not read from remote repository.
Please make suer you have the corrent access rights
and the repository exists.

解决办法:

chmod 700 ~/.ssh  
chmod 600 ~/.ssh/id_rsa  
ssh-agent bash  
ssh-add ~/.ssh/id_rsa

问题3. 测试公钥是否添加成功。 执行 ssh USERNAME@sdk.allwinnertech.com ,如:ssh verify@sdk.allwinnertech.com,输出结果如下内容,则表示公钥已经添加成功。

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to sdk.allwinnertech.com closed.

问题4. 如果公钥添加不成功,请按照以下步骤进行排查 (1)查看 .ssh 目录及其秘钥文件的权限是否设置正确。

cd ~/.ssh

ls -l

看到的权限设置应如下图所示:

i

否则,请执行以下命令,修改权限设置。

chmod 700 ~/.ssh

chmod 600 ~/.ssh/id_rsa

(2)确保通过一号通上传公钥的时候没有引入特殊字符,有些编辑器在打开 id_rsa.pub 的时候会自动引入换行符,建议通过 cat 命令将 id_rsa.pub 打印到屏幕后再邮件复制。

cat ~/.ssh/id_rsa.pub

im

(3)如果重新生成公钥或者~/.ssh目录下有多个可用公钥,请通过以下方式使公钥生效。

ssh-agent bash

ssh-add ~/.ssh/id_rsa

问题5. 下载repo 提示Connection timed out。

ssh: connect to host 61.143.53.198 port22: Connection timed out
fatal:  Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists .
fatal: cloning the git-repo repository failed,will remove'.repo/repo'

解决办法:

  1. 执行which repo,找到repo的安装地址;
  2. 将 repo 里面所有的 61.143.53.198 替换为 sdk.allwinnertech.com

有其它编译烧写问题可以到全志在线开发者论坛发帖提问:https://bbs.aw-ol.com/