IMX6UL eMMC命令分析
CMD0 RESET
发送CMD0 eMMC会进入自行复位busy状态后进入idle状态
#define MMC_CMD_GO_IDLE_STATE 0 struct mmc_cmd cmd;int err;udelay(1000);cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;cmd.cmdarg = 0;cmd.resp_type = MMC_RSP_NONE;err = mmc_send_cmd(mmc, &cmd, NULL);if (err)return err;udelay(2000);
CMD1 CHECK_BUSY
CMD1命令得到eMMC的OCR寄存器值
代码发送命令,bit[31]为1表示ready状态,为0表示busy状态
#define MMC_CMD_SEND_OP_COND 1cmd.cmdidx = MMC_CMD_SEND_OP_COND;cmd.resp_type = MMC_RSP_R3;cmd.cmdarg = 0;if (use_arg && !mmc_host_is_spi(mmc))cmd.cmdarg = OCR_HCS |(mmc->cfg->voltages &(mmc->ocr & OCR_VOLTAGE_MASK)) |(mmc->ocr & OCR_ACCESS_MODE);err = mmc_send_cmd(mmc, &cmd, NULL);if (err)return err;mmc->ocr = cmd.response[0];
CMD2 GET_CID
发送CMD2进行认证(获取CID),寄存器描述,128比特,16字节
代码发送命令
#define MMC_CMD_ALL_SEND_CID 2/* Put the Card in Identify Mode */cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */cmd.resp_type = MMC_RSP_R2;cmd.cmdarg = 0;err = mmc_send_cmd(mmc, &cmd, NULL);if (err)return err;memcpy(mmc->cid, cmd.response, 16);
打印出CID数据
printf("Manufacturer ID: %x\n", mmc->cid[0] >> 24);printf("OEM: %x\n", (mmc->cid[0] >> 8) & 0xffff);printf("Name: %c%c%c%c%c \n", mmc->cid[0] & 0xff,(mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,(mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
Manufacturer ID: feOEM: 14eName: P1XXX
CMD3 STBY
然后发送CMD3,之后eMMC进入stby状态
#define SD_CMD_SEND_RELATIVE_ADDR 3if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;cmd.cmdarg = mmc->rca << 16;cmd.resp_type = MMC_RSP_R6;err = mmc_send_cmd(mmc, &cmd, NULL);if (err)return err;if (IS_SD(mmc))mmc->rca = (cmd.response[0] >> 16) & 0xffff;}
CMD7
使用CMD7进入transfer状态,此命令用来设置eMMC的状态,因为当使用CMD0使eMMC复位后,eMMC处于idle或pre_idle状态,如果需要数据传输,必须将eMMC置于transfer_state
#define MMC_CMD_SELECT_CARD 7/* Select the card, and put it into Transfer Mode */if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */cmd.cmdidx = MMC_CMD_SELECT_CARD;cmd.resp_type = MMC_RSP_R1;cmd.cmdarg = mmc->rca << 16;err = mmc_send_cmd(mmc, &cmd, NULL);if (err)return err;}
CMD8
CMD8命令用来获取EXT_CSD的值,虽然回复为R1,但是EXT_CSD的512字节值会被读取并存储到内存里,然后用户可以根据这些数据分析出eMMC当前支持的各种参数和状态,EXT_CSD是eMMC4之后才引入的寄存器组
struct mmc_cmd cmd;struct mmc_data data;int err;/* Get the Card Status Register */cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;cmd.resp_type = MMC_RSP_R1;cmd.cmdarg = 0;data.dest = (char *)ext_csd;data.blocks = 1;data.blocksize = MMC_MAX_BLOCK_LEN;data.flags = MMC_DATA_READ;err = mmc_send_cmd(mmc, &cmd, &data);
CMD9 GET_CSD
获取CSD寄存器值,描述如下
代码实现
#define MMC_CMD_SEND_CSD 9/* Get the Card-Specific Data */cmd.cmdidx = MMC_CMD_SEND_CSD;cmd.resp_type = MMC_RSP_R2;cmd.cmdarg = mmc->rca << 16;err = mmc_send_cmd(mmc, &cmd, NULL);/* Waiting for the ready status */mmc_send_status(mmc, timeout);if (err)return err;mmc->csd[0] = cmd.response[0];mmc->csd[1] = cmd.response[1];mmc->csd[2] = cmd.response[2];mmc->csd[3] = cmd.response[3];
IMX6UL eMMC命令分析相关推荐
- IMX6UL eMMC加锁和解锁代码分析与实现
背景 最近在使用eMMC作为外部存储设备过程中,出现eMMC两个分区数据全部被清空,文件系统数据和用户数据全部为0 ,在网上看到一篇文件说对eMMC加锁后强制解锁会清除用户数据,这样达到的效果与我遇到 ...
- Linux EMMC子系统分析-初始化流程
最近在解EMMC的一个bug,发现Linux EMMC有点小复杂,先整理个文档出来吧 用的是TI 平台,仅分析MMC,不分析SD和SDIO mmc_init 2769 static int __ini ...
- linux日常常用命令分析
日志处理: 测试网络路由: xargs使用方法: tcpdump命令分析: dd 写入磁盘测试 cpu个数: 查看网卡流量 查看端口联通情况,临时加端口 ntpdate同步: 可以取出变动的密码: 导 ...
- 【JVM】通过javap命令分析Java汇编指令
文章目录 javap命令简述 javap测试及内容详解 例子1 例子2 总结 转载说明 javap命令简述 javap是jdk自带的反解析工具.它的作用就是根据class字节码文件,反解析出当前类对应 ...
- ffmpeg命令分析【详细分析合集】
ffmpeg命令分析[内容包括]-vf/ac/b:v/r/re/segment/t/ss/output_ts_offset/vn/acc/print/yuv420p/yuv封装mp4/FFmpeg硬件 ...
- strace分析mysql_strace 命令分析mysql的相关的问题
strace 命令分析mysql的相关的问题 使用方式: strace -p pid or strace command 本篇博文主要简单介绍下面关于MySQL的5个问题: 利用strace观察mys ...
- ffmpeg命令分析-vn
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的.a.mp4下载链接:百度网盘,提取码:nl0s ...
- hadoop fsck命令分析 + 源码解析
fsck命令分析 HDFS支持fsck命令用以检查各种不一致.fsck用以报告各种文件问题,如block丢失或缺少block等.fsck命令用法如下: $HADOOP_HOME/bin/ hdfs f ...
- jstack分析 in java_Jstack 命令分析
Jstack 命令分析 jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Win ...
最新文章
- agv调度matlab程序,一种分布式AGV调度方法及调度系统与流程
- 微信公众号开发扫码登录(java版)
- []==![]为true
- php将数组中元素打乱顺序,PHP公开课|学会随机打乱数组元素顺序的函数,你的PHP会学的更好...
- JDK 伪异步编程(线程池)
- SpringBoot如何直接访问HTML页面
- struts集成spring官方例子
- 《编码规范和测试方法——C/C++版》作业 ·002——函数返回地址、static关键词用法整理
- C++之---class 的三种访问修饰符( public、private、protected )
- 做创业公司长期价值的共建者,高榕资本完成5亿美元新基金募资
- Excel-财务函数1
- python 计算变量的IV值
- regedit命令应用
- oracle宿主常量及变量,ORACLE之 LOB 数据类型
- Oracle rac集群笔记
- 2022最新 Emlog新版导航源码 带用户中心
- 亚马逊云科技在中国市场火了?真相令人想不到
- 无线网络设置的dns服务器,DNS怎么设置才能上网
- android 信息(mms)的故事(八)-- 彩信的解析
- Stacked DeBERT