lk中用ptentry来管理flashlayout信息。相关的只有5个函数,我们分别看一下
第一个:
void ptable_init(struct ptable *ptable)
{
ASSERT(ptable);
memset(ptable, 0, sizeof(struct ptable));
}
仅仅是将ptable中的成员变量清0.
实际使用的case如下:
ptable_init(&flash_ptable);
第二个:
void ptable_add(struct ptable *ptable, char *name, unsigned start,
unsigned length, unsigned flags, char type, char perm)
{
struct ptentry *ptn;
ASSERT(ptable && ptable->count < MAX_PTABLE_PARTS);
ptn = &ptable->parts[ptable->count++];
strlcpy(ptn->name, name, MAX_PTENTRY_NAME);
ptn->start = start;
ptn->length = length;
ptn->flags = flags;
ptn->type = type;
ptn->perm = perm;
}
向ptable中增加一个partition,并设定partition的name,start,length,flags,type,perm
其中type分两种
char* ptype[] = {"Apps", "Modem"};
perm也分两种
char* pperm[] = {"No", "Yes"};
实际使用的case:
for (i = 0; i < num_parts; i++) {
struct ptentry *ptn = &board_part_list[i];
unsigned len = ((ptn->length) * blocks_per_1MB);
if(ptn->start != 0)
ASSERT(ptn->start == DIFF_START_ADDR);
ptn->start = next_ptr_start_adr;
if(ptn->length == VARIABLE_LENGTH)
{
unsigned length_for_prt = 0;
unsigned j;
for (j = i+1; j < num_parts; j++)
{
struct ptentry *temp_ptn = &board_part_list[j];
ASSERT(temp_ptn->length != VARIABLE_LENGTH);
length_for_prt += ((temp_ptn->length) * blocks_per_1MB);
}
len = total_num_of_blocks - (offset + ptn->start + length_for_prt);
ASSERT(len >= 0);
}
next_ptr_start_adr = ptn->start + len;
ptable_add(&flash_ptable, ptn->name, offset + ptn->start,
len, ptn->flags, TYPE_APPS_PARTITION, PERM_WRITEABLE);
}
第三个:
struct ptentry *ptable_find(struct ptable *ptable, const char *name)
{
struct ptentry *ptn;
int i;
for (i = 0; i < ptable->count; ++i) {
ptn = &ptable->parts[i];
if (!strcmp(ptn->name, name))
return ptn;
}
return NULL;
}
根据partition的那么找到partition。
实际使用的case:
ptn = ptable_find(ptable, "boot");
if (ptn == NULL) {
dprintf(CRITICAL, "ERROR: No boot partition found\n");
return -1;
}
第四个:
struct ptentry *ptable_get(struct ptable *ptable, int n)
{
if (n >= ptable->count)
return NULL;
return &ptable->parts[n];
}
通过id号得到partition信息
for (i = 0; i < ptable->count; ++i)
ptentry_to_tag(ptr_addr, ptable_get(ptable, i));
}
第五个:
int ptable_size(struct ptable *ptable)
{
return ptable->count;
}
得到总的partition number
第六个:
int ptable_get_index(struct ptable *ptable, const char *name)
{
for(int i=0; i < ptable->count; i++) {
if (!strcmp(ptable->parts[i].name, name))
return i;
}
return -1;
}
通过partition name得到partition index
实际使用的case:
boot_index = ptable_get_index(&flash_ptable, "boot");
if(boot_index == -1) {
dprintf (CRITICAL, "ERROR: Boot Partition not found. \n");
return;
}
转载请注明原文地址: https://ju.6miu.com/read-1132701.html