lk中的ptable

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值