bsp: cvitek: fix cv18xx_aarch64 mnt init blocking
The aarch64 core of duo on the master cannot enter the console interface. It can only print the RT flag and hold it. Analysis: The latest commit that can work isae6a328
("Add psoc62, 61 config"). This phenomenon will occur after adding754c59a
("[Feature] DFS mount auto by kernel parameters"). The specific reason is that when aarch bsp enables the device tree, the current u-boot will pass in bootargs, which contains "root=/dev/mmcblk0p2 rootwait rw", which means that the kernel is required to wait until the rootfs in /dev/mmcblk0p2 loaded successfully. However, the current aarch64 bsp default does not implement sdmmc device mounting, causing the kernel file system mounting module (rootfs_mnt_init() of components/drivers/core/mnt.c) to enter an infinite loop waiting. Solution: At present, we do not plan to modify the startup parameters of u-boot. The temporary solution adopted is to create a pseudo /dev/mmcblk0p2 device during the board initialization process, and then cancel the pseudo device after mnt is completed. This allows the kernel boot to be completed successfully. Signed-off-by: Shicheng Chu <1468559561@qq.com> Reviewed-by: Chen Wang <unicorn_wang@outlook.com>
This commit is contained in:
parent
bde4817b9e
commit
a1b01ee865
|
@ -81,6 +81,46 @@ void rt_hw_board_init(void)
|
|||
{
|
||||
rt_hw_common_setup();
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: This is a temporary workaround.
|
||||
* When aarch bsp enables the device tree, the current u-boot will
|
||||
* pass in bootargs, which contains "root=/dev/mmcblk0p2 rootwait rw",
|
||||
* which means that the kernel is required to wait until the rootfs
|
||||
* in /dev/mmcblk0p2 loaded successfully. However, the current aarch64 bsp
|
||||
* default does not implement sdmmc device mounting, causing the kernel file
|
||||
* system mounting module (rootfs_mnt_init() of components/drivers/core/mnt.c)
|
||||
* to enter an infinite loop waiting.
|
||||
* Solution: At present, we do not plan to modify the startup parameters
|
||||
* of u-boot. The temporary solution adopted is to create a pseudo
|
||||
* /dev/mmcblk0p2 device during the board initialization process, and
|
||||
* then cancel the pseudo device after mnt is completed. This allows the
|
||||
* kernel boot to be completed successfully.
|
||||
*/
|
||||
static struct rt_device *pseudo_mmcblk;
|
||||
|
||||
static int pseudo_mmcblk_setup(void)
|
||||
{
|
||||
pseudo_mmcblk = rt_calloc(1, sizeof(*pseudo_mmcblk));
|
||||
|
||||
RT_ASSERT(pseudo_mmcblk != RT_NULL);
|
||||
|
||||
pseudo_mmcblk->type = RT_Device_Class_Graphic;
|
||||
|
||||
return (int)rt_device_register(pseudo_mmcblk, "/dev/mmcblk0p2", RT_DEVICE_FLAG_DEACTIVATE);
|
||||
}
|
||||
INIT_BOARD_EXPORT(pseudo_mmcblk_setup);
|
||||
|
||||
static int pseudo_mmcblk_remove(void)
|
||||
{
|
||||
if (pseudo_mmcblk)
|
||||
{
|
||||
return (int)rt_device_unregister(pseudo_mmcblk);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
INIT_FS_EXPORT(pseudo_mmcblk_remove);
|
||||
#endif /* RT_USING_OFW */
|
||||
|
||||
static rt_ubase_t pinmux_base = RT_NULL;
|
||||
|
|
Loading…
Reference in New Issue