关键词:eMMC boot、PARTITION_CONFIG、force_ro等。

1. eMMC的分区

大部分eMMC都有类似如下的分区,其中BOOT、RPMB和UDA一般是默认存在的,gpp分区需要手动创建。

BOOT主要是为了支持从eMMC启动系统而设计的;RPMB即Replay Protected Memory Block简称,通常用来保存安全线管的数据;GPP主要用于存储系统或者用户数据。

UDA通常会进行再分区,然后根据不同目的存放相关数据,或者格式化成不同文件系统。

2. Linux下读写boot分区

因为boot分区中一般存放的是bootloader或者相关配置参数,这些参数一般是不允许修改的,所以默认情况下是能读boot分区,不能写。

2.1 使能读写

如果需要些则需要,修改/sys/block/mmcblk0boot1/force_ro。

使能写:

echo 0 > /sys/block/mmcblk0boot1/force_ro

关闭写:

echo 1 > /sys/block/mmcblk0boot1/force_ro

在重启之后,force_ro会恢复为1。

2.2 内核force_ro实现

下面来看看force_ro是如何起作用的?

eMMC在被初始化的时候,调用mmc_blk_probe(),这里面会在每个设备下创建force_ro sysfs节点。

static int mmc_blk_probe(struct mmc_card *card)

{...ifgoto out;...

}static int mmc_add_disk(struct mmc_blk_data *md)

{intret;struct mmc_card *card = md->queue.card;

device_add_disk(md->parent, md->disk);

md->force_ro.show =force_ro_store;----------------------------------------------设置分区是否只读,0可读写;1只读。

sysfs_attr_init(&md->force_ro.attr);

md->force_ro.attr.name = "force_ro";

md->force_ro.attr.mode = S_IRUGO |S_IWUSR;

ret= device_create_file(disk_to_dev(md->disk), &md->force_ro);if(ret)gotoforce_ro_fail;if ((md->area_type & MMC_BLK_DATA_AREA_BOOT) &&card->ext_csd.boot_ro_lockable) {

umode_t mode;if (card->ext_csd.boot_ro_lock &EXT_CSD_BOOT_WP_B_PWR_WP_DIS)

mode=S_IRUGO;elsemode= S_IRUGO |S_IWUSR;

md->power_ro_lock.show =power_ro_lock_show;

md->power_ro_lock.store =power_ro_lock_store;

sysfs_attr_init(&md->power_ro_lock.attr);

md->power_ro_lock.attr.mode =mode;

md->power_ro_lock.attr.name =

"ro_lock_until_next_power_on";

ret= device_create_file(disk_to_dev(md->disk),&md->power_ro_lock);if(ret)gotopower_ro_lock_fail;

}returnret;

power_ro_lock_fail:

device_remove_file(disk_to_dev(md->disk), &md->force_ro);

force_ro_fail:

del_gendisk(md->disk);returnret;

}static ssize_t force_ro_show(struct device *dev, struct device_attribute *attr,char *buf)

{intret;struct mmc_blk_data *md =mmc_blk_get(dev_to_disk(dev));

ret= snprintf(buf, PAGE_SIZE, "%d\n",

get_disk_ro(dev_to_disk(dev))^md->read_only);

mmc_blk_put(md);returnret;

}static ssize_t force_ro_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t count)

{intret;char *end;struct mmc_blk_data *md =mmc_blk_get(dev_to_disk(dev));

unsignedlong set = simple_strtoul(buf, &end, 0);if (end ==buf) {

ret= -EINVAL;goto out;

}

set_disk_ro(dev_to_disk(dev),set || md->read_only);

ret=count;out:

mmc_blk_put(md);returnret;

}

2.3 读写boot分区操作

在force_ro为1的情况下,写boot分区返回Operation not permitted。

echo updt | dd of=/dev/mmcblk0boot1 bs=4 count=1 seek=0 &&sync

dd: writing'/dev/mmcblk0boot1': Operation not permitted1+0 records in

0+0 records out

然后打开force_ro=0:

echo 0 > /sys/block/mmcblk0boot1/force_ro && echo updt | dd of=/dev/mmcblk0boot1 bs=4 count=1 seek=0 && sync

通过hexdump验证一下:

hexdump -v -n 4 -s 0 /dev/mmcblk0boot10000000 7075 7464

0000004

3. uboot下读写boot分区

uboot下操作boot分区需要打开CONFIG_SUPPORT_EMMC_BOOT。

在Linux下/dev/mmcblk0boot1就表示切换到boot分区了,在uboot下需要先切换到boot分区。

3.1 PARTITION_CONFIG寄存器

由于默认分区是UDA,而eMMC每个分区都是独立编址的。所以要使用boot分区需要切换分区。

PARTITION_CONFIG寄存器,通过EXT_CSD_PART_CONF命令来设置。

根据下面的寄存解释,BOOT_ACK设置为0x0,;BOOT_PARTITION_ENABLE设置为0x2;PARTITION_ACCESS设置为0x2。

3.2 读取boot分区

uboot中读取boot分区,首先需要将分区切换到boot分区,然后读写分区,最后将分区切换回原来分区。

static int do_mmc_bootmode(cmd_tbl_t *cmdtp, intflag,int argc, char * constargv[])

{struct mmc *mmc;int ret =BOOTMODE_NORMAL;

u32 blk, cnt, n;void *addr;charoriginal_part;

addr= (void *)malloc(512);

blk=BOOTMODE_BLK_NUM;

cnt=BOOTMODE_BLK_COUNT;

mmc= init_mmc_device(curr_device, false);if (!mmc)

{

free(addr);returnCMD_RET_FAILURE;

}/*Switch to the Boot 2 partition*/original_part= mmc->block_dev.hwpart;

blk_select_hwpart_devnum(IF_TYPE_MMC, curr_device, MMC_PART_BOOT2);

mmc_set_part_conf(mmc,0, MMC_PART_BOOT2, 2);------------------------------------------切换到eMMC boot1分区。

n=blk_dread(mmc_get_blk_desc(mmc), blk, cnt, addr);----------------------------------读取一个block。if(n !=cnt)

{

free(addr);returnCMD_RET_FAILURE;

}/*flush cache after read*/flush_cache((ulong)addr, cnt * 512); /*FIXME*/

if(*(unsigned int *)addr ==BOOTMODE_UPDATE_MAGIC)

{ ret =BOOTMODE_UPDATE;

}else{ ret =BOOTMODE_NORMAL;

}#if 0

for(int i = 0; i < 512/16; i++)

printf("%08x %08x %08x %08x\n", *((int *)addr+i*4), *((int *)addr+i*4+1), *((int *)addr+i*4+2), *((int *)addr+i*4+3));#endif

/*Switch to original partition.*/blk_select_hwpart_devnum(IF_TYPE_MMC, curr_device, original_part);----------------------切换到默认分区。

free(addr);returnret;

}

至此可以在Linux和Uboot下对boot分区进行操作,进行bootloader烧写或者进行重要数据更新。

linux 查看emmc分区表_Linux和Uboot下eMMC boot分区读写相关推荐

  1. emmc linux 识别分区_Linux和Uboot下eMMC boot分区读写

    关键词:eMMC boot.PARTITION_CONFIG.force_ro等. 1. eMMC的分区 大部分eMMC都有类似如下的分区,其中BOOT.RPMB和UDA一般是默认存在的,gpp分区需 ...

  2. linux分区表与uboot,Linux和Uboot下eMMC boot分区读写

    关键词:eMMC boot.PARTITION_CONFIG.force_ro等. 1. eMMC的分区 大部分eMMC都有类似如下的分区,其中BOOT.RPMB和UDA一般是默认存在的,gpp分区需 ...

  3. linux boot分区作用,Linux和Uboot下eMMC boot分区读写

    关键词:eMMC boot.PARTITION_CONFIG.force_ro等. 1. eMMC的分区 大部分eMMC都有类似如下的分区,其中BOOT.RPMB和UDA一般是默认存在的,gpp分区需 ...

  4. linux 查看磁盘空间 拷贝不同目录下的文件

    linux 查看磁盘空间 df -h 拷贝不同目录下的文件 cp -rf 目录1 目录2 目录1是需要拷贝的文件所在目录 目录2是需要存放的位置 cp -rf /data/ws/m2e2/ ././表 ...

  5. linux 查看当前状态_Linux视频编辑的当前状态2018

    linux 查看当前状态 众所周知,Linux在现代电影制作中意义重大. Linux是标准的基础,是数字效果的字面工业标准 ,但是,像所有具有发展动力的技术一样,剪辑镜头的过程似乎仍然默认为非Linu ...

  6. linux网络驱动rtl8211f,RTL8211F在uboot下使用mii工具配置RJ45网口灯详解

    RTL8211F在uboot下使用mii工具配置RJ45网口灯详解. 首先要明确使用这个工具的目的,类似于i2c-test工具测试i2c,使用这个工具验证测试网口灯的配置.然后再通过软件或者驱动来实现 ...

  7. linux查看java进程_linux查看java进程命令

    在linux系统下可以通过命令查看进程,那么具体是那个命令呢?下面由学习啦小编为大家整理了linux查看进程的命令,希望对大家有帮助! 一.linux查看进程的命令 有ps.pstree.pgrep等 ...

  8. linux 查看空间(内存、磁盘、文件目录、分区)的几个命令

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. free free命令用于显示内存状态. free指令会显示内存的使用情况,包括实体内存,虚拟 ...

  9. 解决Ubuntu 16.04下提示boot分区空间不足的办法

    原文地址: http://www.jb51.net/article/106976.htm https://www.linuxidc.com/Linux/2015-09/123227.htm 因为lin ...

最新文章

  1. CUDA Samples: Streams' usage
  2. 两个数组进行比较_LeetCode 718. 最长重复子数组 | Python
  3. 【Linux】scp“免密” 远程copy较多文件
  4. SWT的UI线程和非UI线程
  5. 开发iOS即时通讯工具参考的一些开源、框架和教程
  6. i茅台app上线首日,直接冲到了App Store免费榜第一
  7. C++学习笔记系列一
  8. oracle 11 启动不了,求助,oracle 11g 启动失败,求大神帮忙看看,谢谢
  9. azure 免费帐户注册_如何使用模拟器模拟Azure SQL数据库存储帐户行为
  10. 阿里云技术团队原创力作震撼上市,强力解析云上Kubernetes!
  11. 使用 PHP Curl 做数据中转
  12. python github 12306 文贤平_GitHub排名第一!免费最强“抢票神器”在手,程序员抢票再不用跪求加速包...
  13. 《Shell脚本学习指南》学习笔记
  14. 新萝卜家园 ghost xp3 2013 5月纯净版
  15. 程序员是做什么的?怎么成为程序员?
  16. 《时代三部曲》感悟四
  17. java clob 读取_java 实现读取clob
  18. OpenCV——硬币检测与计数的设计实现
  19. 5.服务网关:GateWay
  20. TCP之快重传与快恢复

热门文章

  1. nginx-http-sysguard模块
  2. 自动记录电脑开关机时间
  3. spring boot 2.5.5 reference chapter 5 生词
  4. 无法连接到本地daytime服务 connect到daytime时返回-1 处理
  5. 【作业】非结构化数据相关知识整理
  6. 小括号、中括号、大括号(正则表达式)
  7. win10电脑声音调节图标上有个红叉
  8. arduino烧写失败,改用progisp烧写
  9. Python3.6实现图片转文字
  10. 1071: 数塔 (动态规划)