按照nand方案,ubi卷创建过程分析如下:
1、载入分区配置表
用下载工具下载编译镜像时,完成下载功能代码之后,首先会载入分区配置表,作为一个打包的packet发送到手机端。按照packet的封装方式:
unsigned short size = pakcet->packet_body.size;
unsigned short *data = (unsigned short *)
(pakcet->packet_body.content);
获取包内容:data
获取分区数:total_partition_num
=
size/(MAX_PARTITION_NAME_SIZE +
PARTITION_SIZE_LENGTH);
可以看出封装包内容由一个纯粹的列表构成:分区名+分区大小
所以总的分区数就可以确定下来。
2、重分区
接下来调用重分区函数:
repartition(void* vol_cfg,
unsigned short total_vol_num);
其中,
vol_cfg = data;
total_vol_num = total_partition_num;
根据data和分区数total_partition_num,检测原有的卷配置,首先分配了total_partition_num个卷:
fdl_ubi_vtbl_t *vtbl=NULL;
vtbl = malloc(total_vol_num *
sizeof(fdl_ubi_vtbl_t));
2.1、解析卷配置
调用_parse_volume_cfg(vol_cfg, total_vol_num,
vtbl);
此函数实际上是根据vol_cfg来填充vtbl,卷表主要包含三个元素:
typedef struct{
char
name[UBI_VOL_NAME_MAX+1];
long
long size;//size in byte
int
autoresize;
}fdl_ubi_vtbl_t;
因此,此函数就是根据分区表来填充相应的位域;
size = *(unsigned long *)(vol_cfg+38*(i+1)-2);
vtbl[i].name[j] = *(vol_cfg+38*i+j)
& 0xFF;//j=1~36,最大卷名长度
autoresize 由AUTO_RESIZE_FLAG确定。
2.2、卷表检测
_vtbl_check(vtbl, total_vol_num,
&remove, &create);
卷表检测需要决定出:
全部重分区:卷表记录与NAND存储卷表完全不一致
局部重分区:卷表记录与NAND存储卷表部分一致
不进行重分区:卷表记录与NAND存储卷表完全一致
structubi_device{
struct cdev cdev;
struct device dev;
int ubi_num;
char ubi_name[sizeof(UBI_NAME_STR)+5];
int vol_count;
structubi_volume*volumes[UBI_MAX_VOLUMES+UBI_INT_VOL_COUNT];
……
int rsvd_pebs;