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

emmc是一种嵌入式多媒体卡,它是一种闪存存储器,适用于嵌入式系统中的存储需求。mmcblk0emmc设备的块设备节点,在Linux系统上表示emmc的第一个分区。而mmcblk0boot0则是emmc中的一个硬件定义的分区,与用户区域中由MBR分区表定义的mmcblk0pN分区不同。在调试EC20开发板时,如果外挂的emmc没有识别出mmcblk0boot0分区,可以通过烧写u-boot.imx和环境变量到该分区来解决。具体的操作可以参考引用中的命令。另外,如果使用的U-Boot版本支持,还可以通过配置将U-Boot访问环境变量从mmcblk0的用户区域改为mmcblk0boot0分区,具体的配置可以参考引用中的说明。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [emmc没有mmcblk boot0和boot1分区原因](https://blog.csdn.net/TSZ0000/article/details/86610808)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [eMMC mmcblk0boot0](https://blog.csdn.net/luckywang1103/article/details/87450945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值