persist分区:帐号信息, DRM(数字版权管理)相关文件,传感器注册表,对我们的wifi,蓝牙,mac地址来说必不可少。
请注意,恢复出厂设置并不能清空persist分区,另外线刷包不包含persist分区,一旦出问题我们需要动手修复。
modem&radio基带分区:控制手机通讯功能的分区,此分区一旦损坏,通讯相关功能大概率会寄寄,具体表现为不读卡,丢失imei等
fsg
fsc
modemst1
modemst2
这4个分区必须备份
FRP(factory reset protect)
dsp
bluetooth
modem
persistsec
选择备份
misc分区
recovery用这个分区来保存一些关于升级的信息,应对升级过程中的设备掉电重启的状况。
bootloader启动的时候,会读取这个分区里面的信息,以决定系统是否进Recovery System 或 Main System。
fastboot –disable-verity –disable-verification flash vbmeta vbmeta.img
FRP 从字面意思可知,是用于对恢复出厂设置的保护。比如手机丢了,一般情况下小偷都会恢复出厂设置来绕过锁屏密码,这样就能使用了。但若是登录了 google 账号,此时在开机引导处还是要输入密码或者 google 账号才能进入,这就是使用了 FRP。若是从设置里触发恢复出厂设置,不会触发 FRP,可能 google 在设计时认为能进入到设置中操作,此时桌面已经解锁了,那大概率认为是机主所为,所以不会触发。
Label | Purpose of this partition |
---|---|
Modem | Partition for modem |
Fsc | Cookie partition to store Modem File System’s cookies. |
Ssd | Partition for ssd diag module. stores the encrypted RSA keys |
Sbl1 | Partition for secondary boot loader |
Sbl1bak | Back up Partition for secondary boot loader |
Rpm | Partition for rpm image |
Rpmbak | Back up Partition for rpm image |
Tz | Partition for tz image |
Tzbak | Back up Partition for tz image |
Hyp | Partition for hypervisor image |
Hypbak | Back up Partition for hypervisor image |
Dsp | Partition for adsp dymanic loaders image |
Modemst1 | Copy of Modem File System (Encrypted) |
Modemst2 | Copy of Modem File System (Encrypted) |
DDR | Partition for DDR. |
Fsg | Golden copy or backup of Modem File System (Encrypted). Also used to pre-populate the file system. |
Sec | Sec.dat contains fuse settings, mainly for secure boot and oem setting |
Splash | The splash screen is displayed during the apps bootloader (also called the LK). The display driver in LK will read the splash image data from a separate eMMC partition named as ’splash’ |
Aboot | Partition for apps boot loader |
Abootbak | Back up Partition for apps boot loader |
Boot | This is the boot partition of your android device,It includes the android kernel and the ramdisk. |
Recovery | This is specially designed for backup. The recovery partition can be considered as an alternative boot partition |
Devinfo | Device information including:iis_unlocked, is_tampered, is_verified, charger_screen_enabled, display_panel, bootloader_version, radio_version All these attirbutes are set based on some specific conditions and written on devinfo partition,. |
System | This partition contains the entire Android OS, other than the kernel and the ramdisk. This includes the Android GUI and all the system applications that come pre-installed on the device |
Cache | This is the partition where Android stores frequently accessed data and app components |
Persist | Partition entry for persist image. which contains data which shouldn’t be changed after the device shipped, for example: calibration data of chips(wifi, bt, camera, etc.), certificates and other security related files. |
Misc | This partition contains miscellaneous system settings in form of on/off switches. These settings may include CID (Carrier or Region ID), USB configuration and certain hardware settings etc |
Keystore | Partition for keystore service. |
Config | Partition needed during display panel initialization. More info at Display_panel_configuration_in_Device_Tree |
Oem | “It is meant for storing OEM specific info. Customer in this case can decide whether he wants to keep this partition or not typically reserved partitions are kept for future use |
Limits | Partition to store LMh params on 8976 target. LMh (Limits management) driver in SBL writes the LMh HW trimmed data into separate partition and uses the same data for later reboots |
Mota | Backup partition for M ota upgrade |
Devcfg | Partition needed by TZ for M upgrades. |
Dip | Partition needed for SafeSwitch, feature (FR26255) designed to allow OEMs and carriers to address new smartphone theft bill issues. |
Mdtp | Partition needed for SafeSwitch, feature (FR26255) designed to allow OEMs and carriers to address new smartphone theft bill issues. |
Userdata | Partition for userdata image |
Cmnlib | Verified boot feature introduced in M needLK to load cmnlib corresponding partitions |
Keymaster | Verified boot feature introduced in M needs LK to load keymaster from corresponding partitions |
Syscfg | Syscfg is internal testing for Vmin and CPR characterization |
Mcfg | All MBNs place holder in flash. Specific MBN would be loaded by mcfg image based on the SIM/Carrier. |
Msadp | Used for modem debug policy |
Apdp | Used for persisting the debug policy. “Debug policy” is used to better support development and debug on secure/fuse-blown devices One instance of the debug policy will be signed for the AP |
Dpo | This partition will store a policy override |
在5G参数和IMEI写入Modemst1分区后将Modemst1分区的所有数据
复 制 到 F S G 分 区 进 行 保 存 ;
每 次 开 机 后 检 查Modemst1分区读写是否正常:
- 当Modemst1分区读写异常时,清空Modemst1分区;
- 当Modemst1分区为空时,将FSG分区复制至Modemst1分区进行恢复;
- 当Modemst1分区读写正常时,完成后续正常开机流程。
优点在于,充分利用了FSG分区的存储空间,作为Modemst1分区的影子存在,提高分区利用率的同时,做到物联网设备实现完全恢复出
厂设置。巧妙绕开了以往Modemst1分区在出厂后不能再reset的问题,避免因5G参数异常而必须回厂维修的缺陷。
NV的工作分区被高通平台定义为modemst1或modemst2,工作中modemst1 分区或modemst2分区等价
5G参数在出厂时一直保存在modemst1分区中,路由器 在运行过程中不停的和modemst1分区进行读写交互。
存储NV参数初始化值的分区是FSG分区,高通平台会制作一个包含NV参数初始化值的image文件,将这个image文件下载到FSG分区中
高通平台在启动过程中将FSG分区copy到modemst1分区的判断依 据是,判断当前NV工作modemst1分区是否为空,如果是空的,则将FSG分区中image 文件内的NV参数初始化值更新到modemst1分区中。
一般5G设备在空片第一次下载软件后,因为modemst1分区为空,所以FSG分区中的NV参数初始化值会写入modemst1分区中。然后在生产环节会向 modemst1分区写入校准参数、IEMI等5G重要参数,导致modemst1分区以后不能擦 除。因为modemst1分区不能擦除,自然不会再出现为空的状态,FSG分区的数据也 不会再有机会写入modemst1分区中。modemst1分区不能擦除的原因不是该分区不能 读写操作,而是擦除了该分区数据后,会失去出厂时写入的校准参数、IEMI等5G重 要参数。这些5G重要参数,不回厂维修的话,在物联网设备上没有任何备份。
首先对空 片进行软件下载和软系统安装,高通平台的工作机制在modemst1分区为空时,会将 FSG分区存有NV参数初始化值全部复制至modemst1分区中。
然后对modemst1分区进行各种出厂设置和参数写入,例如依次进行:单板写号、校准综测参数写入、单板电流参数写入、单板功能写入、整机电流写入、耦合测试参 数写
入、整机功能写入以及IMEI写入等操作
最后将上述操作完毕的modemst1分区复制至FSG分区,完成物联网设备5G参数的保存工作。
物联网设备在正常使用过程中不操作fsg分区 ,fsg分区参数始终是设备出厂时的初始状态。
物联网设备上网、注册5G网络时,根据需要读取modemst1分区的参数,运行状 态会被写入本设备的modemst1分区中,因此运行过程中不停地和modemst1分区进行 数据交互。
频繁的数据交互,自然大大提高了5G参数的出错几率。当读写modemst1分区出 现异常,读写异常影响到设备注册网络和modem正常运行,此时需要将modemst1分 区恢复到出厂时的状态。
用户只需将出现异常的物联网设备重新 开机两次即可解决,
第一次是清空Modemst1分区,第二次是完全Reset Modemst1分 区(也就是将fsg复制到moemst1)
每次开机后,物联网设备都检查modemst1分区的读写功能,此时 有三种可能,一是为空,二是正常,三是异常。
1)当Modemst1分区读写异常时,清空Modemst1分区;
2)当Modemst1分区为空时,将FSG分区复制至Modemst1分区进行恢复;
3)当Modemst1分区读写正常时,完成后续正常开机流程。
fastboot flash fsg fsg.mbn
fastboot erase modemst1
fastboot erase modemst2
高通平台EFS的制作
用来制作EFS的机器称为A,用来验证EFS的机器称为B。
1.在modem_proc/core/storage/efs/inc/fs_config_i.h中增加以下三行:
#ifndef FEATURE_EFS_ENABLE_FACTORY_IMAGE_SECURITY_HOLE
#define FEATURE_EFS_ENABLE_FACTORY_IMAGE_SECURITY_HOLE
#endif
2.对于没有使能secure boot的device,在modem_proc/core/storage/fs_tar/src/fs_tar.c中增加一行:
#define FEATURE_FS_TAR_ALLOW_DUMMY_KEY
使能了secure boot的device,不需要定义上面的宏。
3.清除modem后重新编译,编译完成后进入common/build目录执行脚本python update_common_info.py,将新生成的common/build/bin/asic/NON-HLOS.bin文件通过fastboot烧进手机的modem分区。
4.重启手机,打开QPST Software Download软件,切换到Restore页面,USB连接手机,将QCN文件(该QCN文件配置了若干NV项)烧入手机,手机会自动重启。
5.重启就绪后,连接USB线至手机,确保QPST Software Download软件打开,将modem_proc/core/storage/tools/efsreadimage.pl文件放到C:\Users\yuntaohe\Desktop\EFS目录下,打开windows上的cmd窗口,进入C:\Users\yuntaohe\Desktop\EFS目录下,执行perl efsreadimage.pl -z,在当前目录下会生成新文件fs_image.tar.gz。
6.将fs_image.tar.gz上传到ubuntu的modem_proc/core/storage/tools/qdst/目录下,在该目录下执行python QDSTMBN.py fs_image.tar.gz,生成fs_image.tar.gz.mbn
7.将fs_image.tar.gz.mbn和modem_proc/build/ms/bin/8909.gen.prod/efs_image_meta.bin复制到modem_proc/core/bsp/efs_image_header/tools目录下,在该目录下执行python efs_image_create.py efs_image_meta.bin fs_image.tar.gz.mbn,生成fs_image.tar.gz.mbn.img。
至此,EFS制作完成,EFS的验证过程如下:
1.对于没有使能secure boot的device,在modem_proc/core/storage/fs_tar/src/fs_tar.c中增加一行:
#define FEATURE_FS_TAR_ALLOW_DUMMY_KEY
使能了secure boot的device,不需要定义上面的宏。
2.清除modem后重新编译,编译完成后进入common/build目录执行脚本python update_common_info.py,重新生成common/build/bin/asic/NON-HLOS.bin文件。
3.生成全0的二进制文件:在linux下执行dd if=/dev/zero of=zero.bin bs=<modem_st1 size> count=1,modem_st1 size参看rawprogram0_unspare.xml文件:
<program SECTOR_SIZE_IN_BYTES=”512″ file_sector_offset=”0″ filename=”zero.bin” label=”modemst1″ num_partition_sectors=”3072″ physical_partition_number=”0″size_in_KB=”1536.0″ sparse=”false” start_byte_hex=”0x8680000″ start_sector=”275456″ />
本例中,modem_st1 size = 1536 * 1024 = 1572864。
4.将步骤2生成的NON-HLOS.bin和步骤3生成的zero.bin以及生成EFS的fs_image.tar.gz.mbn.img放入刷机包中。
5.修改刷机包中的rawprogram0_unspare.xml文件:
-<program SECTOR_SIZE_IN_BYTES=”512″ file_sector_offset=”0″ filename=”” label=”modemst1″ num_partition_sectors=”3072″ physical_partition_number=”0″ size_in_KB=”1536.0″ sparse=”false” start_byte_hex=”0x8680000″ start_sector=”275456″ />
-<program SECTOR_SIZE_IN_BYTES=”512″ file_sector_offset=”0″ filename=”” label=”modemst2″ num_partition_sectors=”3072″ physical_partition_number=”0″ size_in_KB=”1536.0″ sparse=”false” start_byte_hex=”0x8800000″ start_sector=”278528″ />
-<program SECTOR_SIZE_IN_BYTES=”512″ file_sector_offset=”0″ filename=”” label=”fsg” num_partition_sectors=”3072″ physical_partition_number=”0″ size_in_KB=”1536.0″ sparse=”false” start_byte_hex=”0xc008000″ start_sector=”393280″ />
+<program SECTOR_SIZE_IN_BYTES=”512″ file_sector_offset=”0″ filename=”zero.bin” label=”modemst1″ num_partition_sectors=”3072″ physical_partition_number=”0″ size_in_KB=”1536.0″ sparse=”false” start_byte_hex=”0x8680000″ start_sector=”275456″ />
+<program SECTOR_SIZE_IN_BYTES=”512″ file_sector_offset=”0″ filename=”zero.bin” label=”modemst2″ num_partition_sectors=”3072″ physical_partition_number=”0″ size_in_KB=”1536.0″ sparse=”false” start_byte_hex=”0x8800000″ start_sector=”278528″ />
+<program SECTOR_SIZE_IN_BYTES=”512″ file_sector_offset=”0″ filename=”fs_image.tar.gz.mbn.img” label=”fsg” num_partition_sectors=”3072″ physical_partition_number=”0″ size_in_KB=”1536.0″ sparse=”false” start_byte_hex=”0xc008000″ start_sector=”393280″ />
6.用QFIL刷机后,USB连接PC,用QXDM查看若干NV是否生效。
注:若B机器使能了secure boot,那么生成的EFS文件fs_image.tar.gz.mbn.img需要经过签名后放入刷机包。
在大多数比较新的高通设备上有两个分区,分别叫做xbl和abl。 xbl 作为高通平台上的UEFI固件,内含基于EFI的程序和驱动(如fastboot)。对于LA平台,如果开机时Fastboot模式未被触发,xbl将会立即加载abl。 abl 只在高通LA平台上存在,其源代码可以在CodeAurora上被找到,它内含一个名叫LinuxLoader.efi的EFI程序,用来加载并启动位于boot分区里的安卓Linux内核。 不幸的是,在进入市场的大多数零售设备上,xbl与abl均需经过厂商签名,我们不能对其作任何修改。因此,用设备自带的bl是不可能直接启动Windows的。 我们所采取的途径是将我们的UEFI固件伪装成一个Linux内核。通过在映像的开头添加一段代表Linux内核的代码,并在尾部附加设备树(device tree),abl就能很高兴地加载UEFI映像了。