OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5239|回复: 2

IMX6ULL eMMC板添加 "A/B(无缝)系统"之三:第一次启动

[复制链接]

5

主题

120

帖子

0

精华

高级会员

Rank: 4

积分
813
金钱
813
注册时间
2021-2-26
在线时间
117 小时
发表于 2021-3-13 21:40:59 | 显示全部楼层 |阅读模式
前面我们添加了分区以及将相应的文件烧录到了分区里面去,那么紧张而激动的第一次上电的时刻终于来到了。
上电开机,串口有输出,uboot一切正常,kernel也boot起来了,分区也正确认识到了,但是很遗憾,kernel panic
查看kernel panic的log
  1. [20210303_21:04:12] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
  2. [20210303_21:04:12] ---[ end Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
复制代码

很明显,这是由于rootfs没有正确mount上而导致的。那我们来看看uboot的bootargs里面的rootfs是怎么配置的。
进到uboot,执行printenv,会显示如下env:
  1. [20210303_21:04:23] => printenv
  2. [20210303_21:04:23] baudrate=115200
  3. [20210303_21:04:23] board_name=EVK
  4. [20210303_21:04:23] board_rev=14X14
  5. [20210303_21:04:23] boot_fdt=try
  6. [20210303_21:04:23] bootcmd=run findfdt;mmc dev ${mmcdev};mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi
  7. [20210303_21:04:23] bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};
  8. [20210303_21:04:23] bootdelay=3
  9. [20210303_21:04:23] bootscript=echo Running bootscript from mmc ...; source
  10. [20210303_21:04:23] console=ttymxc0
  11. [20210303_21:04:23] ethact=FEC1
  12. [20210303_21:04:23] ethprime=FEC
  13. [20210303_21:04:23] fdt_addr=0x83000000
  14. [20210303_21:04:23] fdt_file=undefined
  15. [20210303_21:04:23] fdt_high=0xffffffff
  16. [20210303_21:04:23] findfdt=if test $fdt_file = undefined; then setenv fdt_file imx6ull-alientek-emmc.dtb; fi;
  17. [20210303_21:04:23] image=zImage
  18. [20210303_21:04:23] initrd_addr=0x83800000
  19. [20210303_21:04:23] initrd_high=0xffffffff
  20. [20210303_21:04:23] ip_dyn=yes
  21. [20210303_21:04:23] loadaddr=0x80800000
  22. [20210303_21:04:23] loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};
  23. [20210303_21:04:23] loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}
  24. [20210303_21:04:23] loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
  25. [20210303_21:04:23] mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass[20210303_21:04:23] _storage.file=/fat g_mass_storage.ro=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="[20210303_21:04:23] " clk_ignore_unused
  26. [20210303_21:04:23] mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot}
  27. [20210303_21:04:23] mmcautodetect=yes
  28. [20210303_21:04:23] mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz[20210303_21:04:23]  ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
  29. [20210303_21:04:23] mmcdev=1
  30. [20210303_21:04:23] mmcpart=1
  31. [20210303_21:04:23] mmcroot=/dev/mmcblk1p2 rootwait rw
  32. [20210303_21:04:23] netargs=setenv bootargs console=${console},${baudrate} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
  33. [20210303_21:04:23] netboot=echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${g[20210303_21:04:23] et_cmd} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then bootz ${load[20210303_21:04:23] addr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
  34. [20210303_21:04:23] panel=TFT7016
  35. [20210303_21:04:23] script=boot.scr
  36. [20210303_21:04:23]
  37. [20210303_21:04:23] Environment size: 2188/8188 bytes
复制代码

我们先来看bootcmd
  1. bootcmd=run findfdt;mmc dev ${mmcdev};mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run[20210302_18:54:28]  loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi
复制代码

这么看很费劲,手动编辑缩进一下:
  1. bootcmd=run findfdt;
  2.               mmc dev ${mmcdev};
  3.               mmc dev ${mmcdev};
  4.               if mmc rescan; then
  5.                   if run loadbootscript; then
  6.                       run bootscript;
  7.                  else if run loadimage; then
  8.                      run mmcboot;
  9.                  else run netboot;
  10.                  fi;
  11.              fi;
  12.              else
  13.                  run netboot;
  14.              fi
复制代码

结合各种环境变量,最终会跑到 run mmcboot这一行,具体就不在这里讲解了,大家可以直接顺一下逻辑。
我们再来看mmcboot是什么。
  1. mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz[20210302_18:54:28]  ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
复制代码
我们手动编辑缩进一下:
  1. mmcboot=echo Booting from mmc ...;
  2.                run mmcargs;
  3.                if test ${boot_fdt} = yes || test ${boot_fdt} = try; then
  4.                    if run loadfdt; then
  5.                        bootz ${loadaddr} - ${fdt_addr};
  6.                    else if test ${boot_fdt} = try; then
  7.                        bootz;
  8.                    else
  9.                        echo WARN: Cannot load the DT;
  10.                    fi;
  11.               fi;
  12.               else
  13.                    bootz;
  14.               fi;
复制代码
简而言之,执行mmcargs,然后load image,最后用bootz启动kernel
然而:
  1. mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot}
  2. console=ttymxc0

  3. baudrate=115200

  4. mmcroot=/dev/mmcblk1p2 rootwait rw
复制代码
看到了,这里指定了mmcroot=/dev/mmcblk1p2,但是我们当前的分区情况来看,rootfs_a ====> /dev/mmcblk1p5,rootfs_b ====> /dev/mmcblk1p6
那我们就来修改一下mmcroot
修改成如下:
  1. mmcroot=/dev/mmcblk1p5 rootwait rw
  2. saveenv
复制代码

重启板子,你会发现,他还是出现rootfs挂在不上的问题
重启到uboot,printenv发现,我们修改完的mmcroot有变回去了,又是mmcblk1p2了,这是怎么回事呢?


我们首先来查找一下uboot的这些env是在哪里定义的,需要关注的是2个文件
[uboot]/include/env_default.h
[uboot]/configs/mx6ull_alientek_emmc.h

我们先来看[uboot]/include/env_default.h,可以看到这里都是使用宏定义来判断并且设定default env的。我们关注的bootargs是由CONFIG_BOOTARGS这个宏来定义的。
  1. #ifdef DEFAULT_ENV_INSTANCE_EMBEDDED
  2. env_t environment __PPCENV__ = {
  3.         ENV_CRC,        /* CRC Sum */
  4. #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
  5.         1,                /* Flags: valid */
  6. #endif
  7.         {
  8. #elif defined(DEFAULT_ENV_INSTANCE_STATIC)
  9. static char default_environment[] = {
  10. #else
  11. const uchar default_environment[] = {
  12. #endif
  13. #ifdef        CONFIG_ENV_CALLBACK_LIST_DEFAULT
  14.         ENV_CALLBACK_VAR "=" CONFIG_ENV_CALLBACK_LIST_DEFAULT "\0"
  15. #endif
  16. #ifdef        CONFIG_ENV_FLAGS_LIST_DEFAULT
  17.         ENV_FLAGS_VAR "=" CONFIG_ENV_FLAGS_LIST_DEFAULT "\0"
  18. #endif
  19. #ifdef        CONFIG_BOOTARGS
  20.         "bootargs="        CONFIG_BOOTARGS                        "\0"
  21. #endif
  22. #ifdef        CONFIG_BOOTCOMMAND
  23.         "bootcmd="        CONFIG_BOOTCOMMAND                "\0"
  24. #endif
  25. #ifdef        CONFIG_RAMBOOTCOMMAND
  26.         "ramboot="        CONFIG_RAMBOOTCOMMAND                "\0"
  27. #endif
  28. #ifdef        CONFIG_NFSBOOTCOMMAND
  29.         "nfsboot="        CONFIG_NFSBOOTCOMMAND                "\0"
  30. #endif
  31. #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
  32.         "bootdelay="        __stringify(CONFIG_BOOTDELAY)        "\0"
  33. #endif
  34. #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
  35.         "baudrate="        __stringify(CONFIG_BAUDRATE)        "\0"
  36. #endif
  37. #ifdef        CONFIG_LOADS_ECHO
  38.         "loads_echo="        __stringify(CONFIG_LOADS_ECHO)        "\0"
  39. #endif
  40. #ifdef        CONFIG_ETHPRIME
  41.         "ethprime="        CONFIG_ETHPRIME                        "\0"
  42. #endif
  43. #ifdef        CONFIG_IPADDR
  44.         "ipaddr="        __stringify(CONFIG_IPADDR)        "\0"
  45. #endif
  46. #ifdef        CONFIG_SERVERIP
  47.         "serverip="        __stringify(CONFIG_SERVERIP)        "\0"
  48. #endif
  49. #ifdef        CONFIG_SYS_AUTOLOAD
  50.         "autoload="        CONFIG_SYS_AUTOLOAD                "\0"
  51. #endif
  52. #ifdef        CONFIG_PREBOOT
  53.         "preboot="        CONFIG_PREBOOT                        "\0"
  54. #endif
  55. #ifdef        CONFIG_ROOTPATH
  56.         "rootpath="        CONFIG_ROOTPATH                        "\0"
  57. #endif
  58. #ifdef        CONFIG_GATEWAYIP
  59.         "gatewayip="        __stringify(CONFIG_GATEWAYIP)        "\0"
  60. #endif
  61. #ifdef        CONFIG_NETMASK
  62.         "netmask="        __stringify(CONFIG_NETMASK)        "\0"
  63. #endif
  64. #ifdef        CONFIG_HOSTNAME
  65.         "hostname="        __stringify(CONFIG_HOSTNAME)        "\0"
  66. #endif
  67. #ifdef        CONFIG_BOOTFILE
  68.         "bootfile="        CONFIG_BOOTFILE                        "\0"
  69. #endif
  70. #ifdef        CONFIG_LOADADDR
  71.         "loadaddr="        __stringify(CONFIG_LOADADDR)        "\0"
  72. #endif
  73. #ifdef        CONFIG_CLOCKS_IN_MHZ
  74.         "clocks_in_mhz=1\0"
  75. #endif
  76. #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
  77.         "pcidelay="        __stringify(CONFIG_PCI_BOOTDELAY)"\0"
  78. #endif
  79. #ifdef        CONFIG_ENV_VARS_UBOOT_CONFIG
  80.         "arch="                CONFIG_SYS_ARCH                        "\0"
  81.         "cpu="                CONFIG_SYS_CPU                        "\0"
  82.         "board="        CONFIG_SYS_BOARD                "\0"
  83.         "board_name="        CONFIG_SYS_BOARD                "\0"
  84. #ifdef CONFIG_SYS_VENDOR
  85.         "vendor="        CONFIG_SYS_VENDOR                "\0"
  86. #endif
  87. #ifdef CONFIG_SYS_SOC
  88.         "soc="                CONFIG_SYS_SOC                        "\0"
  89. #endif
  90. #endif
  91. #ifdef        CONFIG_EXTRA_ENV_SETTINGS
  92.         CONFIG_EXTRA_ENV_SETTINGS
  93. #endif
  94.         "\0"
  95. #ifdef DEFAULT_ENV_INSTANCE_EMBEDDED
  96.         }
  97. #endif
  98. };
复制代码

那么,这些宏都是在哪里定义的呢?很明显就是[uboot]/configs/mx6ull_alientek_emmc.h
我们详细查看这个文件,就发现了除了CONFIG_EXTRA_ENV_SETTINGS其余都没有定义,而且CONFIG_EXTRA_ENV_SETTINGS里的内容都是hardcode写死的。这就是为什么当我们去修改mmcboot的时候,修改的时候我们可以保存成功,但是一重启,代码就又变回default了。

  1. #define CONFIG_EXTRA_ENV_SETTINGS \
  2.         CONFIG_MFG_ENV_SETTINGS \
  3.         "script=boot.scr\0" \
  4.         "image=zImage\0" \
  5.         "console=ttymxc0\0" \
  6.         "fdt_high=0xffffffff\0" \
  7.         "initrd_high=0xffffffff\0" \
  8.         "fdt_file=undefined\0" \
  9.         "fdt_addr=0x83000000\0" \
  10.         "boot_fdt=try\0" \
  11.         "ip_dyn=yes\0" \
  12.         "panel=TFT7016\0" \
  13.         "mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \
  14.         "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \
  15.         "mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
  16.         "mmcautodetect=yes\0" \
  17.         "mmcargs=setenv bootargs console=${console},${baudrate} " \
  18.                 CONFIG_BOOTARGS_CMA_SIZE \
  19.                 "root=${mmcroot}\0" \
  20.         "loadbootscript=" \
  21.                 "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
  22.         "bootscript=echo Running bootscript from mmc ...; " \
  23.                 "source\0" \
  24.         "loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
  25.         "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
  26.         "mmcboot=echo Booting from mmc ...; " \
  27.                 "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
  28.                         "if run loadfdt; then " \
  29.                                 "bootz ${loadaddr} - ${fdt_addr}; " \
  30.                         "else " \
  31.                                 "if test ${boot_fdt} = try; then " \
  32.                                         "bootz; " \
  33.                                 "else " \
  34.                                         "echo WARN: Cannot load the DT; " \
  35.                                 "fi; " \
  36.                         "fi; " \
  37.                 "else " \
  38.                         "bootz; " \
  39.                 "fi;\0" \
  40.         "netargs=setenv bootargs console=${console},${baudrate} " \
  41.                 CONFIG_BOOTARGS_CMA_SIZE \
  42.                 "root=/dev/nfs " \
  43.         "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
  44.                 "netboot=echo Booting from net ...; " \
  45.                 "run netargs; " \
  46.                 "if test ${ip_dyn} = yes; then " \
  47.                         "setenv get_cmd dhcp; " \
  48.                 "else " \
  49.                         "setenv get_cmd tftp; " \
  50.                 "fi; " \
  51.                 "${get_cmd} ${image}; " \
  52.                 "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
  53.                         "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
  54.                                 "bootz ${loadaddr} - ${fdt_addr}; " \
  55.                         "else " \
  56.                                 "if test ${boot_fdt} = try; then " \
  57.                                         "bootz; " \
  58.                                 "else " \
  59.                                         "echo WARN: Cannot load the DT; " \
  60.                                 "fi; " \
  61.                         "fi; " \
  62.                 "else " \
  63.                         "bootz; " \
  64.                 "fi;\0" \
  65.                 "findfdt="\
  66.                         "if test $fdt_file = undefined; then " \
  67.                                 "setenv fdt_file imx6ull-alientek-emmc.dtb; " \
  68.                         "fi;\0" \
复制代码

针对我们的case,解决方法也很简单,在[uboot]/configs/mx6ull_alientek_emmc.h添加宏定义:
#define CONFIG_BOOTARGS                        "console=ttymxc0,115200 root=/dev/mmcblk1p5 rootwait rw"
删除CONFIG_EXTRA_ENV_SETTINGS 里删除run mmcargs;
重新编译uboot烧录,上电启动,一切正常。
既然启动没问题了,下面我们就要实现自动A/B启动了,敬请期待。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2016-4-24
在线时间
69 小时
发表于 2021-6-29 16:15:42 | 显示全部楼层
大佬,能加我一下QQ吗,1247789822。我目前正在研究这个,想探讨一下
回复 支持 反对

使用道具 举报

5

主题

120

帖子

0

精华

高级会员

Rank: 4

积分
813
金钱
813
注册时间
2021-2-26
在线时间
117 小时
 楼主| 发表于 2021-6-29 19:47:01 | 显示全部楼层
Alion_Vector 发表于 2021-6-29 16:15
大佬,能加我一下QQ吗,1247789822。我目前正在研究这个,想探讨一下

这个没什么难的,理解了启动流程,就随便折腾好了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 19:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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