emmc没有mmcblk boot0和boot1分区原因

背景

在调试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分区也需要特殊的权限,为啥不屏蔽呢?

你可能感兴趣的:(NXP/TI)