mmc命令(do_mmcops函数的源码分析)

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

在文章如何将镜像烧写至iNand(fastboot命令的源码分析)中写到,system、kernel、bootloader的烧写都是write_to_ptn函数直接或间接调用do_mmcops函数来完成的。这里简单分析该函数。

一、mmc命令基本用法

x210 # help mmc
mmc read <device num> addr blk# cnt
mmc write <device num> addr blk# cnt
mmc rescan <device num>
mmc list - list available devicesx210 # mmc list
S3C_HSMMC0_dev0
S3C_HSMMC2_dev1x210 # mmc read 0 3A000000 17 32
MMC read: dev # 0, block # 17, count 32 ...32 blocks read: OKx210 #

(1)列出mmc设备:mmc list

列出系统中的mmc设备。

(2)读/写mmc设备:mmc read/write <device num> addr blk# cnt

device num:表示mmc设备的编号。开发板上可能有多个mmc设备,比如X210开发板的inand编号为0,外接的SD卡编号是1。

addr:表示将mmc设备上的数据读取到哪个内存地址(将哪个内存地址的内容写入mmc设备)。

blk:表示从mmc设备的哪个扇区开始读取(写入)。

cnt:表示读取(写入)多少个扇区的数据。

比如“mmc read 0 3A000000 17 32”,表示从mmc设备0上,以第17扇区为开始,读取32个扇区的数据,存储到以内存地址3A000000为开始的内存空间中。

因为环境变量就存储在inand的第17扇区开始的32个扇区内,因此这条命令其实就是把环境变量读取到内存3A000000开始的内存空间中,后续我们可以用md命令来验证一下。

一开始我以为这条命令中的17、32是16进制的,因为uboot默认采用16进制,但其实是十进制的,这取决于mmc这个命令对应的源码中如何对参数进行解析的。

注意读取到某个地址为开始的内存空间,这段内存空间不能与uboot在内存中的空间有重叠,否则uboot会被覆盖。因为uboot的链接地址对应的物理地址是33E00000,而内存空间的物理地址范围是0x30000000~0x4FFFFFFF(见博客uboot中的虚拟地址映射),所以这里选取一个比较安全的地址3A000000作为测试。

拓展:可以用md命令打印查看某段内存中的值。

经过测试证明,第二个参数是十六进制的数字,而且以字节为单位的。

x210 # mmc read 0 3A000000 17 32
MMC read: dev # 0, block # 17, count 32 ...32 blocks read: OKx210 # help md
md [.b, .w, .l] address [# of objects]- memory displayx210 # md.b 3A000000 9
3a000000: ca 25 4f 80 6d 74 64 70 61    .%O.mtdpax210 # md.b 3A000000 22
3a000000: ca 25 4f 80 6d 74 64 70 61 72 74 3d 38 30 30 30    .%O.mtdpart=8000
3a000010: 30 20 34 30 30 30 30 30 20 33 30 30 30 30 30 30    0 400000 3000000
3a000020: 00 62    .b
x210 #x210 # md.b 3A000000 200        
3a000000: ca 25 4f 80 6d 74 64 70 61 72 74 3d 38 30 30 30    .%O.mtdpart=8000
3a000010: 30 20 34 30 30 30 30 30 20 33 30 30 30 30 30 30    0 400000 3000000
3a000020: 00 62 6f 6f 74 64 65 6c 61 79 3d 33 00 62 61 75    .bootdelay=3.bau
3a000030: 64 72 61 74 65 3d 31 31 35 32 30 30 00 65 74 68    drate=115200.eth
3a000040: 61 64 64 72 3d 30 30 3a 34 30 3a 35 63 3a 32 36    addr=00:40:5c:26
3a000050: 3a 30 61 3a 35 62 00 73 65 72 76 65 72 69 70 3d    :0a:5b.serverip=
3a000060: 31 39 32 2e 31 36 38 2e 31 2e 31 34 31 00 67 61    192.168.1.141.ga
3a000070: 74 65 77 61 79 69 70 3d 31 39 32 2e 31 36 38 2e    tewayip=192.168.
3a000080: 31 2e 31 00 69 70 61 64 64 72 3d 31 39 32 2e 31    1.1.ipaddr=192.1
3a000090: 36 38 2e 31 2e 38 38 00 6e 65 74 6d 61 73 6b 3d    68.1.88.netmask=
3a0000a0: 32 35 35 2e 32 35 35 2e 32 35 35 2e 30 00 62 6f    255.255.255.0.bo
3a0000b0: 6f 74 61 72 67 73 3d 63 6f 6e 73 6f 6c 65 3d 74    otargs=console=t
3a0000c0: 74 79 53 41 43 32 2c 31 31 35 32 30 30 20 72 6f    tySAC2,115200 ro
3a0000d0: 6f 74 3d 2f 64 65 76 2f 6d 6d 63 62 6c 6b 30 70    ot=/dev/mmcblk0p
3a0000e0: 32 20 72 77 20 69 6e 69 74 3d 2f 6c 69 6e 75 78    2 rw init=/linux
3a0000f0: 72 63 20 72 6f 6f 74 66 73 74 79 70 65 3d 65 78    rc rootfstype=ex
3a000100: 74 33 00 62 6f 6f 74 63 6d 64 3d 6d 6f 76 69 20    t3.bootcmd=movi 
3a000110: 72 65 61 64 20 6b 65 72 6e 65 6c 20 33 30 30 30    read kernel 3000
3a000120: 38 30 30 30 3b 20 62 6f 6f 74 6d 20 33 30 30 30    8000; bootm 3000
3a000130: 38 30 30 30 00 00 73 6f 6c 65 3d 74 74 79 53 41    8000..sole=ttySA
3a000140: 43 32 2c 31 31 35 32 30 30 00 69 70 61 64 64 72    C2,115200.ipaddr
3a000150: 3d 31 39 32 2e 31 36 38 2e 31 2e 38 38 00 62 6f    =192.168.1.88.bo
3a000160: 6f 74 63 6d 64 3d 6d 6f 76 69 20 72 65 61 64 20    otcmd=movi read 
3a000170: 6b 65 72 6e 65 6c 20 33 30 30 30 38 30 30 30 3b    kernel 30008000;
3a000180: 20 62 6f 6f 74 6d 20 33 30 30 30 38 30 30 30 00     bootm 30008000.
3a000190: 00 6e 6f 6e 65 00 00 38 2e 31 2e 32 30 00 00 30    .none..8.1.20..0
3a0001a0: 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    0...............
3a0001b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
3a0001c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
3a0001d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
3a0001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
3a0001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
x210 # 

二、do_mmcops函数的源码分析

当执行mmc相关命令时,实际执行的是do_mmcops函数。

该函数位于/common/cmd_mmc.c文件中,内容与分析如下:

/*以“mmc read 0 3A000000 17 32”为例进行说明
argc=6
argv[0]="mmc"
argv[1]="read"
argv[2]="0"  选取哪个mmc设备
argv[3]="3A000000" 读取到哪个内容地址
argv[4]="17" 从哪个扇区开始读写
argv[5]="32" 读取多少个扇区
*/int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{int rc = 0;switch (argc) {default: /* at least 5 args */if (strcmp(argv[1], "read") == 0){int dev = simple_strtoul(argv[2], NULL, 10);//dev=0void *addr = (void *)simple_strtoul(argv[3], NULL, 16);//读取数据到哪个内存地址u32 cnt = simple_strtoul(argv[5], NULL, 10);//读取多少个扇区u32 blk = simple_strtoul(argv[4], NULL, 10);//从哪个扇区开始读写u32 n;u32 read_cnt;u32 cnt_to_read;void *addr_to_read;struct mmc *mmc = find_mmc_device(dev);//寻找dev=0的这个设备if (!mmc)return 1;printf("\nMMC read: dev # %d, block # %d, count %d ...",dev, blk, cnt);rc = mmc_init(mmc);if(rc)return rc;n = 0;addr_to_read = addr;do {if (cnt - n > MAXIMUM_BLOCK_COUNT)cnt_to_read = MAXIMUM_BLOCK_COUNT;elsecnt_to_read = cnt - n;        //设备0read_cnt = mmc->block_dev.block_read(dev, blk, cnt_to_read, addr_to_read);n += read_cnt;blk += read_cnt;addr_to_read += read_cnt * 512;if(cnt_to_read != read_cnt) {printf("%d blocks read: %s\n",n, "ERROR");return -1;}} while(cnt > n);/* flush cache after read */flush_cache((ulong)addr, cnt * 512); /* FIXME */printf("%d blocks read: %s\n",n, "OK");return 0;} else if (strcmp(argv[1], "write") == 0){int dev = simple_strtoul(argv[2], NULL, 10);void *addr = (void *)simple_strtoul(argv[3], NULL, 16);u32 cnt = simple_strtoul(argv[5], NULL, 10);int blk = simple_strtoul(argv[4], NULL, 10);u32 n;u32 written_cnt;u32 cnt_to_write;void *addr_to_write = addr;struct mmc *mmc = find_mmc_device(dev);if (!mmc)return 1;printf("\nMMC write: dev # %d, block # %d, count %d ... ",dev, blk, cnt);rc = mmc_init(mmc);if(rc)return rc;n = 0;addr_to_write = addr;do {if (cnt - n > MAXIMUM_BLOCK_COUNT)cnt_to_write = MAXIMUM_BLOCK_COUNT;elsecnt_to_write = cnt - n;written_cnt = mmc->block_dev.block_write(dev, blk, cnt_to_write, addr_to_write);n += written_cnt;blk += written_cnt;addr_to_write += written_cnt * 512;if(cnt_to_write != written_cnt) {printf("%d blocks written: %s\n",n, "ERROR");return -1;}} while(cnt > n);printf("%d blocks written: %s\n",n, "OK");return 0;} else {printf("Usage:\n%s\n", cmdtp->usage);rc = 1;}return rc;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你知道自己执行的是哪个jre吗?

多个JRE 我在做《Java日志工具之java.util.logging.Logger》的DEMO时&#xff0c;修改java.util.logging.Logger的配置文件&#xff0c;怎么修改都不起作用&#xff0c;因此打印了系统属性"java.home"&#xff0c;才知道自己使用的是 C:\Program Files\Java\jre7 &am…

lvs-健康检查方式

一、TCP 4层检查virtual_server 192.168.2.213 80 { delay_loop 6 lb_algo wlc #采取权重式最少链接分配 lb_kind DR #采取DR模式protocol TCPreal_server 192.168.2.220 80 { TCP_CHECK { #TCP 检查 connect_port 4000 con…

Leetcode编程事宜

中文网站 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 英文网站 Problems - LeetCode 账号相关 账号是主邮箱账号&#xff0c;密码是“姓的拼音身份证后6位”。 编程计划 &#xff08;1&#xff09;先从简单的题目刷起。 &#xff08;2&#xff09;不要求每道题都要解答…

JAXB解析XML

首先根据XML文件编写.xsd文件&#xff0c;例如&#xff1a; <?xml version"1.0" encoding"UTF-8"?><schema xmlns:tns"www.hisense.com" xmlns"http://www.w3.org/2001/XMLSchema" targetNamespace"www.hisense.com&q…

无需写try/catch,也能正常处理异常

对于企业应用的开发者来说&#xff0c;异常处理是一件既简单又复杂的事情。说其简单&#xff0c;是因为相关的编程无外乎try/catch/finallythrow而已&#xff1b;说其复杂&#xff0c;是因为我们往往很难按照我们真正需要的策略来处理异常。我一直有这样的想法&#xff0c;理想…

vs2010插件

转载于:https://www.cnblogs.com/tinytiny/p/3608030.html

leetcode1——两数之和

一、提出问题 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按…

iOS性能优化技术

小小总结&#xff0c;后续继续跟进。 1. 提高应用性能的几个开发细节 * 尽量避免使用constraint实现动画 * 尽量避免使用数组的删除操作 * 尽量避免使用 NSString&#xff1a;&#xff1a;stringWithFormat * 尽量避免使用 NSImage&#xff1a;&#xff1a;imageWithContentOfF…

如何脱离SDK,使用DW5.5和phonegap以及JQMobile搭建开发环境

也许有些人是学C出身&#xff0c;对于Java几乎不了解。一时心血来潮想学学android开发&#xff0c;于是下载了Eclipse&#xff0c;安装了SDK&#xff0c;有模有样的学习起来。也许是懒惰了&#xff0c;对于java一直总是提不起精神。于是确定使用DreamweaverJquery mobilePhoneg…

leetcode2——两数相加

一、提出问题 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以…

7-5 单源最短路径

7-5 单源最短路径 请编写程序求给定正权有向图的单源最短路径长度。图中包含n个顶点&#xff0c;编号为0至n-1&#xff0c;以顶点0作为源点。 输入格式: 输入第一行为两个正整数n和e&#xff0c;分别表示图的顶点数和边数&#xff0c;其中n不超过20000&#xff0c;e不超过10…

32为Linux安卓AVD启动报错

2019独角兽企业重金招聘Python工程师标准>>> 当使用android的AVD时提示以下错误&#xff1a;Starting emulator for AVD NexusOne ERROR: 32-bit Linux Android emulator binaries are DEPRECATED, to use them you will have to do at least one of the following:…

hdu 2007 - 平方和与立方和

题目大意&#xff1a; 给定一段连续的整数&#xff0c;求出他们中所有偶数的平方和以及所有奇数的立方和。 解答&#xff1a; 坑你没商量&#xff01;要考虑输入数a,b的大小。如果a>b,需要交换a&#xff0c;b的值。转载于:https://www.cnblogs.com/ZJUT-jiangnan/p/3613488.…

(原创)优酷androidclient 下载中 bug 解决

在网络情况不好的情况下&#xff0c;优酷androidclient下载视频会终止&#xff0c;用户放弃下载点击 删除该任务以后&#xff0c;切换到网络好的情况下进行下载&#xff0c;会显示该视频已在下载队列里&#xff0c;然后clientUI界面却什么都看不到。导致用户根本无法下载。 事实…

填问卷,得《2015中国呼叫中心知识库现状与问题报告》

为了解中国呼叫中心知识库运营现状和存在的主要问题&#xff0c;掌握呼叫中心知识库的总体发展水平&#xff0c;中国知识管理中心&#xff08;KMCenter&#xff09;面向全国呼叫中心发起“2015中国呼叫中心知识库现状与问题调研”活动&#xff0c;主要通过问卷调研和典型用户访…

C语言经典算法100例-031-判断星期几

题目如下&#xff1a; 请输入星期几的第一个字母来判断一下是星期几&#xff0c;如果第一个字母一样&#xff0c;则继续判断第二个字母。 比较简单&#xff0c;直接看程序吧。 #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() {char …

ARM汇编的特点

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、LDR/STR架构 ARM采用RISC架构&#xff0c;CPU本身不能直接读取内存&#xff0c;需要先将内存中的内容加载到CPU的通用寄存器中才能被CPU处理。换言之&#xff0c;寄存器是CPU和内存进行数据交换的中介。…

持久代是方法区还是堆中的?

2019独角兽企业重金招聘Python工程师标准>>> 昨天跟一哥们讨论&#xff0c;持久代在方法区&#xff0c;属不属于堆中的? 它的意思是持久代不属于堆,属于方法区&#xff0c;而我则认为持久代属于方法区也属于堆。 结果今天上网一查,还真的是。下面是解释: 持久代”仅…

妈的我好像发现是哪出问题了

我不能被这个破玩意卡这么久。 今晚的第一个收获是&#xff0c;我在下载方法里面&#xff0c;获取了API写完了文件而且关闭了之后又加上了一段代码用来测试。 内容是打开刚刚写好的文件&#xff0c;把里面的内容打印到日志上&#xff0c;结果我发现不但文件存在&#xff0c;而且…

Web 前端攻防(2014版)-baidu ux前端研发部

http://fex.baidu.com/articles/page2/ Web 前端攻防&#xff08;2014版&#xff09; zjcqoo | 20 Jun 2014禁止一切外链资源 外链会产生站外请求&#xff0c;因此可以被利用实施 CSRF 攻击。 目前国内有大量路由器存在 CSRF 漏洞&#xff0c;其中相当部分用户使用默认的管理账…