lk中的ptable

    xiaoxiao2022-08-12  52

    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
    最新回复(0)