一、简介

这是一款基于firehose和sahara传输协议开发的EDL烧写工具。

  1. Linux平台命令行工具,不用再去Windows上烧写啦!
  2. 支持双UFS:UFS0和UFS1。
  3. 支持sparse格式的镜像,不用切片啦!
  4. 支持回读镜像文件。
  5. 支持自动搜索设备,无需指定串口。

二、工具获取安装

2.1 下载edl

参见 EDL工具版本管理

2.2 添加执行权限

将edl放到/usr/sbin下,并添加执行权限。

sudo chmod +x /usr/sbin/edl

2.3 关闭 modemmanager

请关闭或卸载 modemmanager 服务。

sudo apt remove modemmanager

2.4 加入 dialout 组

将您的用户名添加至dialout组,然后重启系统。之后就不用每次输入sudo执行edl了。

sudo adduser $USER dialout

三、工具的使用

如果您只是烧录,请直接跳到 4.2。

3.1 参数介绍

为了方便大家使用,给大家提供了简洁的命令。您可以使用help命令打印参数说明。为了避免每次都输入参数,可省略的参数具有默认值,您也可以使用命令,强制指定。

edl help
Options:
-p|--port=<path>         - 可省略,指定串口设备,没有指定会自动搜索
   --slot=<numb>         - 可省略,指定ufs,默认ufs0(--slot=0),若文件中和命令行同时指定了参数,命令行优先
-s|--search=<path>       - 可省略,查找文件的路径,默认当前路径
-f|--firehose=<path>     - 可省略,指定firehose镜像文件,默认prog_firehose_ddr.elf
-t|--storage=<name>      - 可省略,指定存储名称,默认UFS
   --start_sector=<numb> - 起始扇区
   --num_sectors=<numb>  - 扇区数量
   --sector_size=<numb>  - 扇区大小
   --lun=<numb>          - 物理分区
   --set_active=<numb>   - 设置启动分区,1 A,2 B
   --verify              - 需要回读校验
 
Commands:
provision <file>  - 对UFS做provision
flash_xml <file>  - 根据指定的xml文件,写UFS。
flash     <img>   - 烧写指定的镜像。
dump_xml  <file>  - 根据xml的配置,dump出UFS/emmc的内容。
dump      <img>   - dump出指定的位置的镜像。
erase     <lun>   - 擦除指定LU
-v|version        - 打印当前版本信息
-h|help           - 显示帮助信息

3.2 执行过程说明

执行的时候,若没有指定串口设备,软件会自动搜索9008设备,然后匹配设备路径。所以当您连接了多个串口设备时,不用您自己去区分哪一个串口是烧录串口。但当电脑同时连接了多台进入了EDL的设备时,还是需要手动指定,如果没有指定则是默认搜索到的第一台。

设备进入EDL后处于Sahara模式,由Sahara模式转为firehose模式需要下载firehose固件到设备。现在不需要手动下载firehose固件到设备上,因为每条命令执行之前,都判断当前设备所在模式,当处于Sahara模式时,会自动下载Firehose固件文件到设备。firehose固件文件会在 --search= 指定的目录下搜索,若没有指定则在当前路径下搜索。

四、示例

4.1 配置UFS

edl --slot=0 provision provision_micron_3.1.xml

执行结束:

17:05:43: INFO:      _             (done)
17:05:43: INFO:     | |
17:05:43: INFO:   __| | ___  _ __   ___
17:05:43: INFO:  / _` |/ _ \| '_ \ / _ \
17:05:43: INFO: | (_| | (_) | | | |  __/
17:05:43: INFO:  \__,_|\___/|_| |_|\___|
17:05:43: INFO: {All Finished Successfully}

执行前,自动搜索连接设备的串口 → 判断当前的模式 → EDL工具会对xml文件做一个完整性判断。

您可以使用 --slot=1 指定操作第二块UFS,若您没有在firehose、xml文件所在的目录执行,需要使用 --search= 指定路径。

设备进行provision结束后需要重启,然后再进行镜像烧录等。

4.2 烧写镜像

按住金手指按钮重新给设备上电就可进入edl刷机模式。然后进行后续的操作。

4.2.1 烧写xml文件指定的镜像

您可以一次性指定多个rawprogram和patch文件,EDL工具会依次执行。

edl --slot=0 flash_xml rawprogram_all.xml,patch_all.xml

4.2.2 烧写命令行指定镜像

edl --slot=0 flash --start_sector=24 --lun=0 system_la.img

4.3 回读镜像

回读镜像会放在当前路径下的 fh_out 文件夹下。

4.3.1 根据xml文件回读镜像

edl --slot=0 dump_xml read.xml

根据read.xml文件的配置,回读镜像。

<?xml version="1.0" ?>
<data>
<read SECTOR_SIZE_IN_BYTES="4096" filename="gpt_main0.bin" num_partition_sectors="6" physical_partition_number="0" start_sector="0"/>
</data>

4.3.2 分段回读镜像

大镜像持续回读有1/10的概率会超时出错,建议您分段读取,然后使用cat命令进行拼接。

edl --slot=0 dump_xml read_part.xml

physical_partition_number 是lun,start_sector 是起始位置,num_partition_sectors 是读取sectors数量。

<?xml version="1.0" ?>
<data>
<read SECTOR_SIZE_IN_BYTES="4096" filename="gpt_main0.bin.0" num_partition_sectors="2" physical_partition_number="0" start_sector="0"/>
<read SECTOR_SIZE_IN_BYTES="4096" filename="gpt_main0.bin.1" num_partition_sectors="4" physical_partition_number="0" start_sector="2"/>
</data>

拼接:

cat gpt_main0.bin.0 gpt_main0.bin.1 > gpt_main0.bin

4.2.3 回读命令行指定镜像

slot是指镜像所在UFS,LUN是镜像所在LU。

以dump UFS0 LUN0分区表为例:

edl --slot=0 dump --lun=0 --start_sector=0 --num_sectors=6 gpt_main0.bin

4.4 擦除指定LUN

Erase后边数字0-7,分别代表LUN0-LUN7。

edl --slot=0 erase 1

4.5 重启(V1.1支持)

直接重启:

edl --reset

执行完烧录指令后重启:

edl --slot=0 flash_xml --reset rawprogram_all.xml,patch_all.xml

五、有用小贴士

5.1 没有金手指进入EDL的方法

方法一:DCD的B样可以通过Type-C进入QNX的串口控制台,在串口控制台上输入命令 reset -f,控制机器进入 fastboot 模式,然后擦除所有 xbl 再重启就自动进入EDL模式了。

fastboot erase xbl_a
fastboot erase xbl_b
fastboot erase xbl_bkup_a
fastboot erase xbl_bkup_b
fastboot reboot

方法二:通过串口或在android中执行 busybox telnet 192.168.8.1 进入QNX,使用dd命令覆盖xbl分区,重启就可以进入EDL模式。

dd if=/dev/zero of=/dev/disk/xbl_a
dd if=/dev/zero of=/dev/disk/xbl_b
dd if=/dev/zero of=/dev/disk/xbl_bkup_a
dd if=/dev/zero of=/dev/disk/xbl_bkup_b
reset

方法三:在QNX串口执行 reset -e(2023.2.27以后SOC的版本支持)

reset -e

六、问题与解决方法

参见 DCD SOC刷机问题汇总