背景
在调试EC20开发板时,外挂在mmc0的emmc没有识别出mmcblk boot0和boot1分区,现查询原因。
分析
查看datasheet中,默认是支持2个boot分区的
EXT_CSD Register
开机打印
代码
mmc_blk_alloc_parts
card->nr_parts == 1【所以只有rpmb】
mmc_blk_alloc_part
pr_info("%s: %s %s partition %u %s\n",
part_md->disk->disk_name, mmc_card_id(card),
mmc_card_name(card), part_md->part_type, cap_str);
card.h
static inline void mmc_part_add(struct mmc_card *card, unsigned int size,
unsigned int part_cfg, char *name, int idx, bool ro,
int area_type)
{
card->part[card->nr_parts].size = size;
card->part[card->nr_parts].part_cfg = part_cfg;
sprintf(card->part[card->nr_parts].name, name, idx);
card->part[card->nr_parts].force_ro = ro;
card->part[card->nr_parts].area_type = area_type;
card->nr_parts++;
}
查看没有boot分区的设置项
mmc.c
mmc_read_ext_csd
ext_csd[EXT_CSD_BOOT_MULT] == 0x20【寄存器值正常】
if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_boot_partition_access(card->host)) {
pr_info("%s,%d\n",__func__,__LINE__);
for (idx = 0; idx < MMC_NUM_BOOT_PARTITION; idx++) {
part_size = ext_csd[EXT_CSD_BOOT_MULT] << 17;
mmc_part_add(card, part_size,
EXT_CSD_PART_CONFIG_ACC_BOOT0 + idx,
"boot%d", idx, true,
MMC_BLK_DATA_AREA_BOOT);
}
}
#define MMC_CAP2_BOOTPART_NOACC (1 << 0) /* Boot partition no access */没有访问权限
static inline int mmc_boot_partition_access(struct mmc_host *host)
{
return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC);
}
#define EXT_CSD_RPMB_MULT 168 /* RO */
if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_cmd23(card->host)) {
mmc_part_add(card, ext_csd[EXT_CSD_RPMB_MULT] << 17,
EXT_CSD_PART_CONFIG_ACC_RPMB,
"rpmb", 0, false,
MMC_BLK_DATA_AREA_RPMB);
}
sdhci-msm.c
sdhci_msm_probe
msm_host->mmc->caps2 |= MMC_CAP2_BOOTPART_NOACC;【设置了boot分区没有访问权限,所以在增加分区时忽略】
sdhci_add_host
sdhci.c
sdhci_add_host
mmc->caps |= MMC_CAP_SDIO_IRQ | MMC_CAP_ERASE | MMC_CAP_CMD23;【设置MMC_CAP_CMD23就会给rpmb分区】
总结
由于boot分区在Linux下没有访问权限,所以在内核代码中设置不添加boot分区,但是rpmb分区也需要特殊的权限,为啥不屏蔽呢?