recovery升级系统时挂载cache分区失败

在RK3368平台使用Android 6.0系统进行recovery升级时遇到挂载/cache分区失败的问题,错误提示为"No such file or directory"。原因是recovery启动时block设备节点未生成。解决办法是在recovery.cpp的main函数中等待block设备节点生成后再挂载cache分区。

Platform: RK3368

OS: Android 6.0

Kernel: 3.10.0


文章目录

现象

重启进recovery升级update.zip时,不进升级界面,而是进入recovery界面。并有打印错误"“E:failed to mount /cache /dev/block/rknand_cache (No such file or directory)”

升级日志:

Starting recovery (pid 156) on Mon Jan 21 09:21:53 2013
read cmdline
cmdline=earlyprintk=uart8250-32bit,0xff690000 console=ttyS2 androidboot.baseband=N/A androidboot.selinux=enforcing androidboot.hardware=rk30board androidboot.console=ttyS2 init=/init mtdparts=rk29xxnand:0x00002000@0x00000000(parameter),0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(misc),0x00008000@0x00008000(resource),0x00008000@0x00010000(kernel),0x00010000@0x00018000(boot),0x00010000@0x00028000(recovery),0x00038000@0x00038000(backup),0x00040000@0x00070000(cache),0x00002000@0x000B0000(kpanic),0x00200000@0x000B2000(system),0x00008000@0x002B2000(metadata),0x00002000@0x002BA000(baseparamer),0x00020000@0x002BC000(radical_update),-@0x002DC000(userdata) storagemedia=nand loader_charged uboot_logo=0x02000000@0x7dc00000:0x01000000 loader.timestamp=2018-12-12_17:12:58

bootmode = unknown 
recovery filesystem table
=========================
  0 /mnt/internal_sd vfat /dev/block/rknand_user 0
  1 /mnt/external_sd vfat /dev/block/mmcblk0p1 0
  2 /system ext4 /dev/block/rknand_system 0
  3 /cache ext4 /dev/block/rknand_cache 0
  4 /metadata ext4 /dev/block/rknand_metadata 0
  5 /data ext4 /dev/block/rknand_userdata 0
  6 /cust ext4 /dev/block/rknand_cust 0
  7 /custom ext4 /dev/block/rknand_custom 0
  8 /radical_update ext4 /dev/block/rknand_radical_update 0
  9 /misc mtd misc 0
  10 /uboot mtd uboot 0
  11 /charge mtd charge 0
  12 /resource mtd resource 0
  13 /parameter mtd parameter 0
  14 /boot mtd boot 0
  15 /recovery mtd recovery 0
  16 /backup mtd backup 0
  17 /trust mtd trust 0
  18 /baseparamer mtd baseparamer 0
  19 /tmp ramdisk ramdisk 0

I/ [File] : bootable/recovery/recovery.cpp; [Line] : 1301; [Func] : SetSdcardRootPath; InternalSD_ROOT: /mnt/internal_sd
I/ [File] : bootable/recovery/recovery.cpp; [Line] : 1303; [Func] : SetSdcardRootPath; ExternalSD_ROOT: /mnt/external_sd
D/ [File] : bootable/recovery/recovery.cpp; [Line] : 1980; [Func] : main; to dump args befor get_args() : 
	 1 argument(s) : 
	 /sbin/recovery 
matches 0, mtdnum -1, mtdsize 0, mtderasesize 0, mtdname 
matches 4, mtdnum 0, mtdsize 400000, mtderasesize 4000, mtdname parameter
matches 4, mtdnum 1, mtdsize 400000, mtderasesize 4000, mtdname uboot
matches 4, mtdnum 2, mtdsize 400000, mtderasesize 4000, mtdname trust
matches 4, mtdnum 3, mtdsize 400000, mtderasesize 4000, mtdname misc
matches 4, mtdnum 4, mtdsize 1000000, mtderasesize 4000, mtdname resource
matches 4, mtdnum 5, mtdsize 1000000, mtderasesize 4000, mtdname kernel
matches 4, mtdnum 6, mtdsize 2000000, mtderasesize 4000, mtdname boot
matches 4, mtdnum 7, mtdsize 2000000, mtderasesize 4000, mtdname recovery
matches 4, mtdnum 8, mtdsize 7000000, mtderasesize 4000, mtdname backup
matches 4, mtdnum 9, mtdsize 8000000, mtderasesize 4000, mtdname cache
matches 4, mtdnum 10, mtdsize 400000, mtderasesize 4000, mtdname kpanic
matches 4, mtdnum 11, mtdsize 40000000, mtderasesize 4000, mtdname system
matches 4, mtdnum 12, mtdsize 1000000, mtderasesize 4000, mtdname metadata
matches 4, mtdnum 13, mtdsize 400000, mtderasesize 4000, mtdname baseparamer
matches 4, mtdnum 14, mtdsize 4000000, mtderasesize 4000, mtdname radical_update
matches 4, mtdnum 15, mtdsize 8E800000, mtderasesize 4000, mtdname userdata
find_partition : p->name parameter, name misc
find_partition : p->name uboot, name misc
find_partition : p->name trust, name misc
find_partition : p->name misc, name misc
 260 : devname : /dev/block/rknand_misc
E:Can't find misc
E/ [File] : bootable/recovery/bootloader.cpp; [Line] : 82; [Func] : get_bootloader_message_mtd; Can't find misc
failed to create /cache dir,err=File exists!
mount /cache /dev/block/rknand_cache (ext4)
E:failed to mount /cache /dev/block/rknand_cache (No such file or directory)
E/ [File] : bootable/recovery/roots.cpp; [Line] : 139; [Func] : ensure_path_mounted; f0.

解决办法

由于rk3368是在init.rc中加载flash驱动,所以在recovery运行时,block设备节点可能还未生成。

on fs
    insmod /rk30xxnand_ko.ko

所以需要等block设备节点生成后再挂载cache分区。在bootable/recovery/recovery.cpp的main函数中做以下修改:

    printf("Starting recovery (pid %d) on %s", getpid(), ctime(&start));
	if(check_sdboot()==0) 
		bSDBoot = true;	
	else if(check_usbboot()==0)
		bUsbBoot = true;
    load_volume_table();
    SetSdcardRootPath();
#ifdef LogToSDCard
    copy_log_to_sd();
#endif
+    //cache may not ready,so wait a few seconds.
+    for(int n = 0; n < 3; n++) {
+        if(0 == ensure_path_mounted(CACHE_LOG_DIR)){
+            break;
+        }else {
+             printf("delay 1sec\n");
+             sleep(1);
+        }
+    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值