This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/TDA2SX:外设设备通过 USB 接口刷写

Guru**** 2799025 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/808821/linux-tda2sx-peripheral-device-flashing-over-usb-interface

器件型号:TDA2Sx
主题中讨论的其他器件:DRA742PMP

工具/软件:Linux

尊敬的 TI:

我现在尝试通过 USB 接口刷写 eMMC。

我的操作:
步骤1:host$ sudo ./usbboot -S spl/u-boot-spl.bin

Step2:将 CPU 板上的 SW2[7:0]设置为[0 0 0 0 0 0 0]、然后打开 EVM 电源。

主机输出:

读取 ASIC ID
芯片:5641
ROM 次要版本:02
iDEN:00000000000000000000000000000000000000000000
MPKH:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
CRC0:51d2f9a7
CRC1:00000000
器件是 GP
正在将2ndStage 发送到目标...



EVM 输出:

U-Boot SPL 2016.05-00008-g1fbee98-M脏(2019年6月06日- 20:35:16)
DRA752-GP ES2.0
从 USB DFU 引导
使用默认环境

未知的 IRQ 类型1715168365           <------------------ 代码中显示的 USB IRQ 错误、但我不知道原因。

步骤3: host$ sudo dfu-util -l

DFU-util 0.9

版权所有2005-2009 Weston Schmidt、Harald Welte 和 OpenMoko Inc.
版权所有2010-2016 Tormod Volden 和 Stefan Schmidt
此计划是免费软件、绝对不提供保修
请向 sourceforge.net/.../报告错误

找到 DFU:[0451:d022] ver=0223、devnum=38、cfg=1、intf=0、path="1-7"、 alt=2、name="ramdisk"、serial="unknown"
找到 DFU:[0451:d022] ver=0223、devnum=38、cfg=1、intf=0、path="1-7"、 alt=1、name="FDT"、serial="unknown"
找到 DFU:[0451:d022] ver=0223、devnum=38、cfg=1、intf=0、path="1-7"、 alt=0、name="kernel"、serial="unknown"

步骤4:host$ sudo dfu-util -D boot.img -c 1 -i 0 -a 0    

DFU-util 0.9

版权所有2005-2009 Weston Schmidt、Harald Welte 和 OpenMoko Inc.
版权所有2010-2016 Tormod Volden 和 Stefan Schmidt
此计划是免费软件、绝对不提供保修
请向 sourceforge.net/.../报告错误

DFU-util:文件大小太大:成功

文件 boot.img 是由以下问题生成的:

          DD if=/dev/sdb1 of=boot.img bs=1M count=4096 &

          DD if=/dev/sdb2 of=boot.img bs=1m 计数=4096 &

/dev/sdb1和/dev/sdb2是我的可引导 SD 卡设备。 我刚刚将引导分区中的 uenv.txt 替换为 uenv-eMMC.txt。

步骤5: host$ sudo dfu-util -D u-boot.img -c 1 -i 0 -a 0 -R                ------------------------------------------------------- 我尝试调试步骤4中显示的问题。  

DFU-util 0.9

版权所有2005-2009 Weston Schmidt、Harald Welte 和 OpenMoko Inc.
版权所有2010-2016 Tormod Volden 和 Stefan Schmidt
此计划是免费软件、绝对不提供保修
请向 sourceforge.net/.../报告错误

DFU-util:无效的 DFU 后缀签名
DFU-util:未来的 DFU-util 版本中将需要有效的 DFU 后缀!!
正在打开支持 DFU 的 USB 设备...
ID 0451:d022
运行时器件 DFU 版本0110
正在申请 USB DFU 接口...
正在设置备用设置#0...
确定器件状态:STATE = dfuIDLE、STATUS = 0
DfuIDLE、继续
DFU 模式器件 DFU 版本0110
器件返回的传输大小为4096
将数据从 PC 复制到 DFU 器件
下载   [==================================] 100%      837964字节
下载完成。
STATE (7)= dfuMANIFEST、STATUS (0)=无错误条件存在
STATE (2)= dfuIDLE、STATUS (0)=不存在错误条件
完成!

步骤6:目标输出:

U-Boot 2016.05-00008-g1fbee98-脏 污(2019年6月06日- 20:35:16 +0800)

CPU :DRA752-GP ES2.0
型号:TI DRA742
电路板:DRA74x EVM 修订版 H.0
DRAM: 4 GiB
MMC:  OMAP SD/MMC:0、OMAP SD/MMC:1.
**第一个描述符不是1:1上的主要描述符**
***警告- CRC 错误,使用默认环境

GUID 分区表头签名错误:0x0!= 0x5452415020494645
PART_GET_INFO_EFI:***错误:GPT 无效***
GUID 分区表头签名错误:0x0!= 0x5452415020494645
PART_GET_INFO_EFI:***错误:备份 GPT 无效***
错误:找不到分区:'UserData'

在 arch/arm/cpU/armv7/omap-common/utils.c:195/mmc_get_part_size ()
警告:fastboot.userdata_size:无法计算
SCSI: SATA link 0 timeout。
AHCI 0001.0300 32插槽1端口3 Gbps 0x1不支持 SATA 模式
标志:64位 NCQ stag pm led clo only pmp pio 贫民窟 part ccc apst
正在扫描设备总线...
找到0个器件。
网络:   
警告:以太网@48484000使用 ROM 中的 MAC 地址
eth0:以太网@48484000
按任意键停止自动引导: 0
=>

步骤7:uBoot $ printenv

=>印刷版
arch = ARM
args_fit=setenv bootargs console=${console}
args_mmc=run finduid;setenv bootargs console=${console}${optargets}root=PARTUUID =${uuid}rw rootfstype=${mmcrootfstype}
波特率=115200
电路板=dra7xx
Board_name=dra7xx
Board_rev=H.0
BOOT_FDT=尝试
BOOT_FIT = 0
BOOT_OS=0
bootargs=androidboot.serialno=${serial#} console=ttyS0、115200 androidboot.console=ttyS0和 roidboot.hardware=jacinto6evmboard
bootcmd=if test ${dofastboot}-eq 1;then echo Boot fastboot requested、resetting dofastboot ...;setenv dofastboot 0;saveenv;echo Booting into fastboot ...;fastboot 0;fi;if test ${boot_fit}-eq 1;then run update_fofastboot;fi;run dmmcboot_run;
BOOTDELAY=2
bootdir=/boot
bootenvfile=uEnv.txt
BootFile=zImage
BOOTM_SIZE=0x10000000
bootpart=0:2
bootscript=echo 正在从 MMC${mmcdev}...;源${loadaddr}运行的 bootscript
console=ttyO0、115200n8
cpu=armv7                                                 ------------------------------------------------------- boot.img 的大小为4GB、因此我修改了 rawemmc 原始参数。 我不知道它是否正确。
dfu_alt_info_eMMc=rawemmc raw 0 4294967296;boot part 1;rootfs part 1 2;mlo fat 1;ml.raw 0x100 0x100;u-boot.img.raw 0x300 0x1000;u-env.raw 0x1300 0x200;spl-os-boot-raw 0x100;u-boot.gma.prb 0x1500 raw 0x1000;at-raw 0x1000;u-env.gfat 0x1000;u-env.gfat 1ds-raw 0x1500 raw 0x1000;spl-gfat 1 0x1000;spl-raw 0x1000;spl raw 0x1000;sp-ds-dat 1 uEnv.txt
dfu_alt_info_mmc=boot part 0 1;rootfs part 0 2;mlo fat 0 1;ml.raw 0x100 0x100;u-boot.img.raw 0x300 0x1000;u-env.raw 0x1300 0x200;spl-os-args.raw 0x1500 0x1500;spl-os-image-raw 0x1000;sprw 0x1000 uEnv.txt;fat 0X1000;splfat 0X1000;spr-raw 0X1000;splfat 0X1000;fat 1spr-raw 0X1700
DFU_alt_INFO_QSPI=MLO RAW 0x0 0x040000;u-boot.img RAW 0x040000 0x0100000;u-boot-spl-OS RAW 0x140000 0x080000;u-boot-env RAW 0x1C0000 0x010000;u-boot-env.backup RAW 0x1D0000 0x010000;u-boot-env.backup RAW 0x8000000 0x0000 0x8000000 0xE0000
dfu_alt_info_ram=内核 ram 0x80200000 0x4000000;fdt ram 0x80f80000 0x80000;ramdisk ram 0x81000000 0x4000000
DFU_bufsiz=0x10000
dofastboot=0
eMMC_Android_boot=setenv eval_bootargs setenv bootargs $bootargs;运行 eval_bootargs;setenv mmcdev 1;setenv FDT_part 3;setenv boot_part 9; 如果测试$reboot_image = recovery;那么 setenv boot_part 8;setenv reboot_image boot;saveenv;fi;setenv machid fe6;MMC dev $mmcdev; 重新扫描 MMC 引导;部件启动 MMC ${mmcdev}${FDT_part}FDT_START;部件尺寸 MMC ${mmcdev}${FDT_part}FDT_SIZE;部件启动 MMC ${mmcdev}${boot_part}boot_dart;部件尺寸 MMC ${mmdr}${bootdr}${boot_dr}${boot_size ${dr}${dr}${dr}
envboot=MMC dev ${mmcdev};如果 MMC 重新扫描;然后回显在器件${mmcdev}上找到的 SD/MMC;如果运行 loadbootscript;然后运行 bootscript;否则运行 loadbootenv;然后从${bootenvfile}回显已加载的 env;运行 importbootenv;fi;if test -n $uuccmd;然后运行 envenvcmd;envive...
ethaddr=0c:B2:B7:F6:ff:bc
FASTBOOT.board_rev=H.0
FASTBOOT.CPU=J6
fastboot.secure=GP
fastboot.userdata_size=unknown
FDT_addr_r=0x88000000
fdtaddr=0x88000000
fdtcontrolladdr=fdf0a598
fdtfile=未定义
findfdt=if test $board_name = omap5_uevm;then setenv fdtfile omap5-uevm.dtb;fi;if test $board_name = dra7xx;then setenv fdtfile dra7-evm.dtb;fi;if test $board_name = 72x-revc;then dtv 772 vemc.tb;then setdtb;tv_detv-tb;then dtv-tb;tv-tv-tb;tv-tb;tv-tv-tb;tv-tv-tb; fi;if test $board_name = dra76x;then setenv fdtfile dra76-evm.dtb;fi; if test $board_name = beagle_x15; then setenv ***-x15.dtb;fi; if test $board_name = beex15_revb1;then $dtv_ramble_evm=$57v_env_ex-tb; tbv-ex-ex-ex-v-v-rambv-ex-v-v-v-ex-v-v-ex-v-v-ex-ex-v-v-v-ex-v-v-v-ex-ex-v-v-v-v-ex-v-v-ex-v-v-v-ex-ex-v-v-v-v-ex-v-v-v-v-v- f;if test $board_name = am572x_idk && test $idk_LCD =否;然后 setenv fdtfile am572x-idk.dtb;fi; if test $board_name = am572x_idk && test $idk_lcd = osd101t2045;然后 setenv ftv f572x-idk.dlc_dtb =$572x-tidk_ramtb;tidtw-2x-tw-2x =$57tidk_ramtidtb;tw-2x-tw-2x-tw-2x-twx-tb;twx-t-tb f;if test $board_name = am571x_idk && test $idk_LCD =否;然后 setenv fdtfile am571x-idk.dtb;fi; if test $board_name = am571x_idk && test $idk_lcd = osd101t2045;then setenv f571x-idtb 文件=$57t1tb;tidtidtb;tidtwx-tb =$57tidtb;tidtidtidtb;then $571tidtidtidtb =$wx-tb;tidtidtidtidtb;then $57tidtidtidtb 无法确定要使用的设备树;fi;
finduuid=part uuid MMC ${bootpart}uuid
fit_bootfile=fitImage.itb.
fit_loadaddr=0x88000000
importbootenv=echo 从 MMC${mmcdev}导入环境...;env 导入-t ${loadaddr}${filesize}
kernel_addr_r=0x82000000
loadaddr=0x82000000
loadbootenv=fatload MMC ${mmcdev}${loadaddr}${bootenvfile}
loadbootscript=fatload MMC ${mmcdev}${loadaddr}boot.scr
loadfdt=load ${devtype}${bootpart}${fdtaddr}${bootdir}/${fdtfile}
loadfit=run args_fit;bootm ${loadaddr}#${fdtfile};
loadimage=load MMC ${bootpart}${loadaddr}${bootdir}/${bootfile}
mmcboot=if MMC dev ${mmcdev};然后 setenv devtype MMC;如果 MMC 重新扫描;然后回显在器件${mmcdev}上找到的 SD/MMC;如果运行 loadimage;然后运行 loadfdt;从 MMC${mmcdev}回显引导...;运行 args_MMC;bootz ${addr}-${floadfi;
mmcdev=0
mmclosados=run args_mmc;如果测试${boot_FDT}= yes ||测试${boot_FDT}=试用;如果运行 loadfdt;则 bootz ${loadaddr}-${fdtaddr};否则测试${boot_FDT}=试用;然后 bootz;否则、回显警告:无法加载 bootz;否则;fi;
mmcrootfstype=ext4 rootwait
netargs=setenv bootargs console=${console}${optargets}root=/dev/nfs nfsroot=${serverip}:${rootpath}、${nfsopts}RW IP=DHCP
netboot=echo Booting from network...;setenv autoload no;dhcp;run netloadimage;run netloadfdt; 运行 netargs;bootz ${loadaddr}-${fdtaddr}
netloadfdt=tftp ${fdtaddr}${fdtfile}
netloadimage=tftp ${loadaddr}${bootfile}
nfsopts=nolock
partitions=uuid_disk=${uid_gppt_disk};name=rootfs、start=2MiB、size=-、uid=${uid_gppt_rootfs}
partitions_android_disk=${uuid_gp_t_disk};name=xloader、start=128K、size=256K、uid=${uid_gppt_xloader};name=bootloader、size=u2304K、uuuid=${uuuuuuuid_boot$};name=environment,s=uuuuuuid=gpize_rate={uid=uuu10M、uuuuuuuuuuuuuuuuuuuuuuuuuuuid=uuuuuuuuuuuuuuuuuuuuuuuuuuuuuid=uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuid$};name=uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuid
pxefile_addr_r=0x80100000
ramdisk_addr_r=0x88080000
读数地址= 0x88080000
reboot_image=boot
rootpath=/export/rootfs
脚本地址=0x80000000
scsidevs=0
序列号=0400d00f147400e2
SoC=omap5
static_ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off
stderr=串行@4806a000
stdin =串行@4806a000
stdout=串行@4806a000
update_TO_fit=setenv loadaddr ${fit_loadaddr};setenv 引导文件${fit_bootfile}
usbtty=CDC_ACM
供应商= TI
ver = U-Boot 2016.05-00008-g1fbee98-M脏(2019年6月06日- 20:35:16 +0800)
VRAM=16M

环境大小:7479/131067字节
=>

这就是我所做的一切。

我想知道接下来该怎么做才能使 eMMC 通过 DFU 工具成功刷写?

此致、

刘 GaN

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Liu GaN、

    您是否检查了这些文档:

    您还能澄清一下它是定制板还是 EVM 吗?

    此致、

    Yordan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    很抱歉耽误你的回答。

    我尝试刷写 EVM 板上的 eMMC。

    我还检查了上面列出的文档。

    选择 eMMC 作为存储器器件时。 我得到以下错误:

         => DFU 0 MMC 1

    错误:在 MMC 器件#1上找不到器件#1

    我通过添加一些日志来调试这个问题、然后它看起来是这样的:

    => DFU 0 MMC 1
    DFU_fill_entity:rawemmc raw 0 3751936接口:MMC dev:1.
    [lG_DFU_fill_entity_mmc]:argv[0]:RAW。
    [lG_DFU_fill_entity_mmc]:argv[1]:0。
    [lG_DFU_fill_entity_mmc]:argv[2]:3751936。
    DFU_fill_entity:引导第1部分1接口:MMC DEV:1.
    [lG_DFU_fill_entity_mmc]:argv[0]:part。
    [lG_DFU_fill_entity_mmc]:argv[1]:1.
    [lG_DFU_fill_entity_mmc]:argv[2]:1.
    错误:在 MMC 器件#1上找不到器件#1

    在 drivers/DFU/DFU_MMC.c:365/DFU_fill_entity_mmc ()
    错误:DFU 实体配置失败!

    在 drivers/DFU/DFU.c:70/DFU_init_env_entities ()
    DFU -器件固件升级

    现在我知道、该错误与环境变量'dfu_alt_info_eMMc'相关。

    => printenv dfu_alt_info
    dfu_alt_info=rawemmc raw 0 3751936;引导部分1;rootfs 部分1 2;mlo fat 1;ml.raw 0x100;u-boot.img.raw 0x300 0x1000;u-env.img raw 0x1300 0x200;spl-os-args.900 raw 0x100;u-boot.gb raw 0x1000;u-env.gfat 1 uEnv.txt;fat 1a-fat 1urb raw 0x1700;spl-os-fat 1;spl.prb raw 0x1000;sprb

    因此、我认为这是由我的 eMMC 未分区造成的。 我是对的吗?

    我的问题是、我应该如何首次刷写原始 eMMC?

    此致、

    刘 GaN

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Liu GaN、

    您能否检查以下说明是否能帮助您:

    此致、

    Yordan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    是的、我已经检查了您提供的 wiki 链接以及使用器件固件升级(DFU).pdf 将二进制文件刷写到 DRA7xx 工厂电路板中

    但他们对解决我的问题帮助不大。

    最后、我通过将 uboot env "DFU_alt_info"设置为:来获取 DFU 接口

    setenv dfu_alt_info "rawemmc raw 0 3751936;mlov.raw 0x100 0x100;u-boot.img.raw 0x200 0x400"

    然后、我可以通过 DFU-util 刷写 rawemmc 分区。

    它几乎成功了、但我又遇到了一个问题:

    KB@KB:~/tmp$ sudo dfu-util -D boot.img -c 1 -i 0 -a 0
    DFU-util 0.5

    (c) 2005-2008年,由 Weston Schmidt、Harald Welte 和 OpenMoko Inc.提供
    (c) 2010-2011年 Tormod Volden (DfuSe 支助)
    此计划是免费软件、绝对不提供保修

    DFU-util 目前仅支持 DFU 1.0版

    正在打开 DFU USB 设备... ID 0451:d022
    警告:找不到缓存的 DFU 功能描述符
    警告:假设 DFU 版本1.0
    运行时器件 DFU 版本0100
    找到 DFU:[0451:d022] devnum=0、cfg=1、intf=0、alt=0、name="rawemmc"
    正在申请 USB DFU 接口...
    正在设置备用设置#0...
    确定器件状态:STATE = dfuIDLE、STATUS = 0
    DfuIDLE、继续
    获取缓存的 DFU 功能描述符时出错
    DFU 模式器件 DFU 版本0110
    器件返回的传输大小为4096
    无法搜索 DFU 后缀
    boot.img:资源暂时不可用

    boot.img 由 dd 命令创建。 boot.img 的大小为8GB。

    我在这里给出了文件大小、因为我在此按问题步骤成功刷写 u-boot.img:

      KB@KB:~/tmp$ sudo dfu-util -D u-boot.img -c 1 -i 0 -a 0

    在我看来、这里唯一的区别是文件大小。

    您对此" 资源暂时不可用"问题有何看法?

    此致、

    刘 GaN

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Liu、

    您是否在 include/environment/ti/dfu.h 中定义了分区 boot.img? 您需要列出此分区以及要刷新的映像的偏移量和大小。

    此致

    Shravan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shravan

    感谢您的回复。 是否有必要添加与要加载的文件名完全相同的分区?

    我的意思是,如果要加载 boot.img 文件,那么我必须在 include/environment/ti/dfu.h 中定义 boot.img 分区信息?

    我的 boot.img 文件将创建为原始映像。 为什么我不能只使用  rawemmc 分区?

    我还有关于如何创建 boot.img 文件的另一个问题。

    例如、我有一个16G 内存卡被识别为/dev/sdc。 然后我在其中创建了两个分区。  

    第一个 partitton 被视为具有256MB 存储器的引导、被识别为/dev/sdc1.

    第二个 partyton 被视为具有2GB 存储的 rootfs、被识别为/dev/sdc2.

    存储卡中的其他空间仍然未使用。

    然后,我尝试通过发出命令来使 boot.img:

    `dd if=/dev/sdc of=boot.img bs=1M count=2304`

    输出 boot.img 是否可用作 eMMC 的原始映像闪存?

    此致、

    刘 GaN。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Liu、

    不需要,您不需要定义与文件相同的分区名称。 我误读了您在上一个帖子中使用的命令。  

    我认为、您遇到的错误是由于可以传输的数据大小受限。 您可能会发现以下链接很有用。

    https://e2e.ti.com/support/processors/f/791/t/353119?About-DFU-Device-Firmware-Update-for-LINUXEZSDK-AM335X-V07-00

    是的、您可以使用指定的 dd 命令创建原始映像、但是、请确保大小与整个 SD 卡完全相同(适当地修改计数)。


    此致

    Shravan