1.确定分区大小
name | start | length |
bootloader | 49 | ~2M |
boot | 8M | |
recovery | 8M | |
system | 512M | |
data | 1024M | |
cache | 256M | |
sdcard | all reserved |
3.set_partition_table中设置分区的信息,以供fastboot和sdfuse使用,其中bootloader, kernel, ramdisk不设置,而是采用硬编码。
4.int init_raw_area_table (block_dev_desc_t * dev_desc)分析
init_raw_area_table用于给变量raw_area_t raw_area_control赋值,此函数在mmc_startup是被调用,raw_area_t raw_area_control变量会在刷bootloader, kernel, ramdisk时被用到用于硬编码这些分区的烧写位置,主要在do_movi函数中被使用。do_movi函数最终也是调用do_mmcops函数来实现的,只是do_movi比起do_mmcops封装了分区的名字,可以使用名字来,从分区raw_area_t raw_area_control中找到具体的读写位置,操作分区读写时比mmc方便(此处提到的分区并不是pc硬盘分区的概念,是指人为指定的各个存储区域,每个区域用于存储一个image)。
5.s5pv210是如何分区的?
文件common/cmd_fastboot.c中的变量static fastboot_ptentry ptable[MAX_PTN]保存flash的分区划分情况。其中的fwbl1, bootloader, kernel , ramdisk是用硬编码即此处不设分区的开始位置和大小而是实际调用do_movi时从raw_area_t raw_area_contro变量中读取分区的硬编码位置和大小。其他的分区system, userdata, cache和fat格式的分区则是从mbr中读取的开始位置和大小,并在do_mmcops中被使用。patable中的flag变量则指定对分区读写时是采用do_movi还是do_mmcops。
6.do_fdisk命令对flash创建分区表并写入mbr。
7.此数据架构中的transger_buffery用于保存执行fastboot和sdfuse时下载的或从fat分区中读取的image文件的内容,rx_handler用于把文件写到对应分区
119 static struct cmd_fastboot_interface interface =
120 {
121 .rx_handler = rx_handler,
122 .reset_handler = reset_handler,
123 .product_name = NULL,
124 .serial_no = NULL,
125 .nand_block_size = 0,
126 .transfer_buffer = (unsigned char *)0xffffffff,
127 .transfer_buffer_size = 0,
128 };
130 static unsigned int download_size;//当执行fastboot是保存下载的数据大小,执行sdfuse时为0
131 static unsigned int download_bytes;