请选择 进入手机版 | 继续访问电脑版
查看: 6165|回复: 1

[分享] NXP i.MX8M Mini 集成Mender OTA解决方案

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3297

    主题

    6542

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31909
    最后登录
    2024-3-29
    发表于 2020-5-18 09:21:32 | 显示全部楼层 |阅读模式
    NXP i.MX8M Mini 集成Mender OTA解决方案

    i.MX8M Mini OTA方案介绍
    参考收集中的资料,介绍SWupdate 和 Mender 的区别,以及应用场景


    代码下载
    代码下载
    1. <font size="3" face="微软雅黑">repo init -u http://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-sumo -m imx-4.14.98-2.0.0_demo_mender.xml</font>
    复制代码
    编译
    1. <font size="3" face="微软雅黑">MACHINE=imx8mmevk DISTRO=fsl-imx-xwayland source ./fsl-setup-mender.sh -b bld-xwayland
    2. bitbake core-image-base</font>
    复制代码
    烧录的固件介绍
    1. <font size="3" face="微软雅黑">//升级固件
    2. core-image-base-imx8mmevk-20191111104651.mender

    3. //烧录固件
    4. core-image-base-imx8mmevk-20191111104651.sdimg
    5. 和之前的 core-image-minimal-imx8mmevk-20190521120542.rootfs.sdcard 区别, 这部分了解了很久,走了不少弯路.

    6. sudo ./uuu -b emmc_all imx-boot-imx8mmevk-sd.bin-flash_evk core-image-base-imx8mmevk.sdimg

    7. 弯路1 : 第一次编译出的固件,没发现可以整体烧录的固件(sdcard) , 发出查找是不是代码出现问题
    8. 弯路2:  找到对应的代码, 反复琢磨,最终编译出路的固件烧录成功无法启动

    9. 解决方案:最终通过 dd if=core-image-base-imx8mmevk.sdimg  of=/dev/sdc bs=1M && sync 写入sd卡,发现可以成功启动
    10. </font>
    复制代码
    烧录固件提示
    1. <font size="3" face="微软雅黑">boot_fdt=try
    2. bootcmd=mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else run mender_setup; if run loadimage; then run mmcboot; run mender_try_to_recover; else run mender_try_to_recover; run netboot; fi; fi; else booti ${loadaddr} - ${fdt_addr}; fi
    3. bootcmd_mfg=run mfgtool_args;if iminfo ${initrd_addr}; then if test ${tee} = yes; then bootm ${tee_addr} ${initrd_addr} ${fdt_addr}; else booti ${loadaddr} ${initrd_addr} ${fdt_addr}; fi; else echo "Run fastboot ..."; fastboot 0; fi;
    4. bootcount=1
    5. bootdelay=2
    6. bootlimit=1
    7. bootscript=echo Running bootscript from mmc ...; source
    8. console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200
    9. emmc_dev=1
    10. ethaddr=00:04:9f:05:d1:93
    11. ethprime=FEC
    12. fastboot_dev=mmc1
    13. fdt_addr=0x43000000
    14. fdt_file=boot/fsl-imx8mm-evk.dtb
    15. fdt_high=0xffffffffffffffff
    16. fdtcontroladdr=bc906500
    17. image=boot/Image
    18. initrd_addr=0x43800000
    19. initrd_high=0xffffffffffffffff
    20. jh_clk=
    21. jh_mmcboot=mw 0x303d0518 0xff; setenv fdt_file fsl-imx8mm-evk-root.dtb;setenv jh_clk clk_ignore_unused; if run loadimage; then run mmcboot; else run jh_netboot; fi;
    22. jh_netboot=mw 0x303d0518 0xff; setenv fdt_file fsl-imx8mm-evk-root.dtb; setenv jh_clk clk_ignore_unused; run netboot;
    23. kboot=booti
    24. loadaddr=0x40480000
    25. loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};
    26. loadfdt=ext4load ${mender_uboot_root} ${fdt_addr} ${fdt_file}
    27. loadimage=ext4load ${mender_uboot_root} ${loadaddr} ${image}
    28. mender_altbootcmd=if test ${mender_boot_part} = 2; then setenv mender_boot_part 3; setenv mender_boot_part_hex 3; else setenv mender_boot_part 2; setenv mender_boot_part_hex 2; fi; setenv upgrade_available 0; saveenv; run mender_setup
    29. mender_boot_kernel_type=booti
    30. mender_boot_part=2
    31. mender_boot_part_hex=2
    32. mender_check_saveenv_canary=1
    33. mender_dtb_name=fsl-imx8mm-evk-inmate.dtb
    34. mender_kernel_name=Image
    35. mender_saveenv_canary=1
    36. mender_setup=if test "${mender_saveenv_canary}" != "1"; then setenv mender_saveenv_canary 1; saveenv; fi; if test "${mender_pre_setup_commands}" != ""; then run mender_pre_setup_commands; fi; setenv mender_kernel_root /dev/mmcblk1p${mender_boot_part}; if test ${mender_boot_part} = 2; then setenv mender_boot_part_name /dev/mmcblk1p2; else setenv mender_boot_part_name /dev/mmcblk1p3; fi; setenv mender_kernel_root_name ${mender_boot_part_name}; setenv mender_uboot_root mmc 0:${mender_boot_part_hex}; setenv mender_uboot_root_name ${mender_boot_part_name}; setenv expand_bootargs "setenv bootargs \"${bootargs}\""; run expand_bootargs; setenv expand_bootargs; if test "${mender_post_setup_commands}" != ""; then run mender_post_setup_commands; fi
    37. mender_try_to_recover=if test ${upgrade_available} = 1; then reset; fi
    38. mender_uboot_boot=mmc 0:1
    39. mender_uboot_dev=0
    40. mender_uboot_if=mmc
    41. mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc clk_ignore_unused
    42. mmcargs=setenv bootargs ${jh_clk} console=${console} root=${mender_kernel_root}
    43. mmcautodetect=yes
    44. mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then booti ${loadaddr} - ${fdt_addr}; else echo WARN: Cannot load the DT; fi; else echo wait for boot; fi;
    45. mmcdev=1
    46. mmcpart=1
    47. mmcroot=/dev/mmcblk2p2 rootwait rw
    48. netargs=setenv bootargs ${jh_clk} console=${console} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
    49. netboot=echo Booting from net ...; run netargs;  if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${loadaddr} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then booti ${loadaddr} - ${fdt_addr}; else echo WARN: Cannot load the DT; fi; else booti; fi;
    50. script=boot.scr
    51. sd_dev=0
    52. soc_type=imx8mm
    53. upgrade_available=0

    54. Environment size: 3925/4091 bytes



    55. Card did not respond to voltage select!
    56. ** Bad device mmc 0 **
    57. </font>
    复制代码
    排查问题定位于 启动引导出现问题.尝试用sd卡制作镜像,启动成功


    官方提供的mender-demo编译出的可以从SD卡启动, 无法从emmc启动
    主要原因在于:
    1. <font size="3" face="微软雅黑">setenv mender_kernel_root /dev/mmcblk1p${mender_boot_part};  //这里参数是写死的

    2. 对应的

    3. 对应代码中

    4. "setenv mender_kernel_root " MENDER_STORAGE_DEVICE_BASE "${mender_boot_part};

    5. 从而找到编译代码中

    6. meta-mender-community/meta-mender-imx/templates/local.conf.append:8:MENDER_STORAGE_DEVICE_imx8mqevk = "/dev/mmcblk1"
    7. </font>
    复制代码
    修改之后结果发现还是无法启动, 提示:
    1. <font size="3" face="微软雅黑">Fastboot: Normal
    2. Normal Boot
    3. Hit any key to stop autoboot:  0
    4. switch to partitions #0, OK
    5. mmc1(part 0) is current device
    6. ** Unable to read file boot.scr **
    7. Card did not respond to voltage select!
    8. ** Bad device mmc 0 **
    9. Booting from net ...
    10. ethernet@30be0000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
    11. Could not initialize PHY ethernet@30be0000
    12. BOOTP broadcast 1
    13. BOOTP broadcast 2
    14. BOOTP broadcast 3
    15. BOOTP broadcast 4
    16. BOOTP broadcast 5
    17. </font>
    复制代码
    注意到其中的: Card did not respond to voltage select! , ** Bad device mmc 0 ** , 马上根据关键词,定位到源码中相关位置, 查找时候没有重大发现,继续搜索关键词: Booting from net … , 发现:
    1. <font size="3" face="微软雅黑">//代码位置: include/configs/imx8mm_evk.h

    2.    "if run loadimage; then " \
    3.            "run mmcboot; " \
    4.            "run mender_try_to_recover; " \
    5.    "else " \
    6.            "run mender_try_to_recover; " \
    7.            "run netboot; " \
    8.    "fi; " \
    9.    
    10.         "netboot=echo Booting from net ...; " \

    11. 应该是启动loadimage失败,导致else走netboot, 继续分析:

    12.         "loadimage=ext4load ${mender_uboot_root} ${loadaddr} ${image}\0" \  找到对应的环境变量值
    13.     loadimage=ext4load mmc 0:2  0x40480000 boot/Image , 可以分析下ext4load后面字段的意思:
    14.    
    15.    ext4load mmc 0:2 0x40480000 boot/Image   //从第0个存储设备的第2个分区的boot目录读出Image文件到内存地址0x40008000

    16. 但是根据实际的情况,目前用的是第1个存储设备,第0个设备是SD卡

    17. u-boot=> mmc list
    18. FSL_SDHC: 0
    19. FSL_SDHC: 1 (eMMC)


    20. 可以在uboot 中运行:  ext4load mmc 0:2  0x40480000 boot/Image 得到结果一样的
    21. Card did not respond to voltage select!
    22. ** Bad device mmc 0 **

    23. 改为第1个存储设备之后, 运行正常
    24. u-boot=> ext4load mmc 1:2  0x40480000 boot/Image
    25. 23163392 bytes read in 448 ms (49.3 MiB/s)

    26. //找到对应的问题,据悉分析在源码中应该怎么改动

    27. include/env_mender.h 中的L91中设置了该变量
    28. "setenv mender_uboot_root " MENDER_UBOOT_STORAGE_INTERFACE " " __stringify(MENDER_UBOOT_STORAGE_DEVICE) ":${mender_boot_part_hex}; " \

    29. 其中MENDER_UBOOT_STORAGE_DEVICE主要设置第几个存储设备, 这个宏的值是Yocto编译层面传进来的, 对应于

    30. sources/meta-mender-community/meta-mender-imx/recipes-bsp/u-boot/u-boot-imx_%.bbappend 其中的MENDER_UBOOT_STORAGE_DEVICE_imx8mmevk改为1

    31. 10 # Set machine-specific variables per the definitions found in include/configs/MACHINE.h
    32. 11 # | VARIABLE                                 | DEFINITION             |
    33. 12 # | MENDER_UBOOT_ENV_STORAGE_DEVICE_OFFSET_1 | CONFIG_ENV_OFFSET      |
    34. 13 # | BOOTENV_SIZE                             | CONFIG_ENV_SIZE        |
    35. 14 # | MENDER_UBOOT_STORAGE_DEVICE              | CONFIG_SYS_MMC_ENV_DEV |
    36. 17 MENDER_UBOOT_STORAGE_DEVICE_imx8mmevk              = "0"
    37. 18 MENDER_UBOOT_ENV_STORAGE_DEVICE_OFFSET_1_imx8mqevk = "0x400000"


    38. 修改之后代码编译出错提示:

    39. include/config_mender.h
    40. 72:#  if CONFIG_SYS_MMC_ENV_DEV != MENDER_UBOOT_STORAGE_DEVICE
    41. 73:#   error CONFIG_SYS_MMC_ENV_DEV is not the same as MENDER_UBOOT_STORAGE_DEVICE. Either set it to the same value (check for example in the defconfig file), or make sure it is not defined at all. Make sure that: 1) All the instructions at docs.mender.io/devices/integrating-with-u-boot have been followed. 2) All required layers are included in bblayers.conf, including any board specific layers such as meta-mender-<board>

    42. 意思是 CONFIG_SYS_MMC_ENV_DEV 相等 MENDER_UBOOT_STORAGE_DEVICE才行,CONFIG_SYS_MMC_ENV_DEV的值位于
    43. include/configs/imx8mm_evk.h -> #define CONFIG_SYS_MMC_ENV_DEV>->---1   /* USDHC2 */

    44. //修改源码之后,Yocto中编译需要注意一下

    45. bitbake core-image-base -c compile -f

    46. 修改之后在此进行编译正常启动
    47. </font>
    复制代码
    ·升级过程
    1. <font size="3" face="微软雅黑">root@imx8mmevk:~# mender -rootfs /mnt/core.mender        
    2. INFO[0000] Configuration file does not exist: /var/lib/mender/mender.conf  module=config
    3. INFO[0000] Loaded configuration file: /etc/mender/mender.conf  module=config
    4. INFO[0000] Mender running on partition: /dev/mmcblk1p2   module=main
    5. INFO[0000] Start updating from local image file: [/mnt/core.mender]  module=rootfs
    6. Installing update from the artifact of size 51602432
    7. INFO[0000] no public key was provided for authenticating the artifact  module=installer
    8. INFO[0000] opening device /dev/mmcblk1p3 for writing     module=block_device
    9. INFO[0000] partition /dev/mmcblk1p3 size: 218103808      module=block_device
    10. ................................   2% 1024 KiB
    11. ................................
    12. ................................  99% 50176 KiB
    13. ......INFO[0047] wrote 218103808/218103808 bytes of update to device /dev/mmcblk1p3  module=device
    14.                            100% 50393 KiB
    15. INFO[0056] Enabling partition with new image installed to be a boot candidate: 3  module=device
    16. </font>
    复制代码
    ·是否升级成功主要看:
    1. <font size="3" face="微软雅黑">Kernel command line: console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200 root=/dev/mmcblk1p3</font>
    复制代码
    固件挂载
    1. <font size="3" face="微软雅黑">sudo mount -t ext4 -o loop core-image-base-imx8mmevk-xxxx.ext4 core-image-base</font>
    复制代码
    OTA Mender 升级


    阅读文档
    记录文档中的注意事项


    mender -rootfs 与 mender -install 的疑惑? / 只是版本的区别


    ·USB升级
    1. <font size="3" face="微软雅黑">fdisk -l 罗列出设备,

    2. mount /dev/sda1 /mnt  挂载U盘

    3. mender -rootfs  /mnt/core.mender 进行升级</font>
    复制代码
    ·在线升级
    1. <font size="3" face="微软雅黑">1. 配置文件介绍
    2. 2. 重点修改TenantToken</font>
    复制代码
    ·云端Mender部署




    文章出处:CSDN

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-5-18 14:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    9
    最后登录
    2020-9-17
    发表于 2020-5-18 16:19:13 | 显示全部楼层
    good good
    ad123哈哈
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 10:34 , Processed in 0.113357 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表