目录

初始化

1.cmd 0

2.cmd8

3.cmd55

4.acmd41

5.cmd2

6.cmd3

7.cmd9

8.cmd13

9.cmd7

10.ACMD51

11.CMD6

12.CMD16

13.CMD17

14.CMD18

15.CMD12

tuning

CMD19

DW_SDHCI的tuning流程


初始化

1.cmd 0

/* Reset the Card */

err = mmc_go_idle(mmc);

static int mmc_go_idle(struct mmc *mmc)

{

struct mmc_cmd cmd;

int err;

usleep(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;

usleep(2000);

return 0;

}

2.cmd8

R7:

/* Test for SD version 2 */

err = mmc_send_if_cond(mmc);

static int mmc_send_if_cond(struct mmc *mmc)

{

struct mmc_cmd cmd;

int err;

cmd.cmdidx = SD_CMD_SEND_IF_COND;

/* We set the bit if the host supports voltages between 2.7 and 3.6 V */

cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;

cmd.resp_type = MMC_RSP_R7;

err = mmc_send_cmd(mmc, &cmd, NULL);

if (err)

return err;

if ((cmd.response[0] & 0xff) != 0xaa)

{

debug("UNUSABLE_ERR mmc_send_if_cond\n");

return UNUSABLE_ERR;

}

else

mmc->version = SD_VERSION_2;

return 0;

}

3.cmd55

ACMD:SD card application-specific commands.

在发所有的ACMD之前,需要先发APP_CMD(CMD55)通知SD卡下一个指令为ACMD。SD卡应答R1,然后才能发送ACMD。

cmd.cmdidx = MMC_CMD_APP_CMD;

cmd.resp_type = MMC_RSP_R1;

cmd.cmdarg = 0;

err = mmc_send_cmd(mmc, &cmd, NULL);

4.acmd41

卡片的初始化将在主机发送ACMD41命令后开始,主机每间隔1就发送一次 ACMD41 命令,直到初始化完成(OCR 寄存器的 bit31 置位)。

bit 31)指示卡片的上电操作是否完成

bit 30)指示卡片的容量状态(0代表SDSC、1代表SDHC或者SDXC)

上图OCR (bit 31)为0,即为卡busy

上图OCR (bit 31)为1,即为卡初始化完成

static int sd_send_op_cond(struct mmc *mmc) //send acmd41-- get ocr data

{

int timeout = 1000;

int err;

struct mmc_cmd cmd;

while (1)

{

cmd.cmdidx = MMC_CMD_APP_CMD;

cmd.resp_type = MMC_RSP_R1;

cmd.cmdarg = 0;

err = mmc_send_cmd(mmc, &cmd, NULL);

if (err)

return err;

cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;

cmd.resp_type = MMC_RSP_R3;

/*

* Most cards do not answer if some reserved bits

* in the ocr are set. However, Some controller

* can set bit 7 (reserved for low voltages), but

* how to manage low voltages SD card is not yet

* specified.

*/

cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :

(mmc->voltages & 0xff8000);

if (mmc->version == SD_VERSION_2)

cmd.cmdarg |= OCR_HCS;

err = mmc_send_cmd(mmc, &cmd, NULL);

if (err)

return err;

if (cmd.response[0] & OCR_BUSY)//等待OCR[31]1后跳出循环,完成初始化。

break;

if (timeout-- <= 0)

return -EOPNOTSUPP;

usleep(1000);

}

5.cmd2

CMD2,验证SD卡是否接入,获取(CID)

/* 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((void*)mmc->cid, (void*)cmd.response, 16);

6.cmd3

读取卡相对地址RCA, 当卡收到RCA(CMD3)后,卡就会进入数据传输模式。

/*

* For MMC cards, set the Relative Address.

* For SD cards, get the Relatvie Address.

* This also puts the cards into Standby State

*/

if (!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;

}

7.cmd9

CMD9,读取CSD寄存器获取卡的相关信息

RCA是之前CMD3读取到的卡RCA

PS:R2回复CMD9时为CSD,回复CMD2时为CID

CSD(具体信息)寄存器也是 128 bits,提供了访问卡片内容的一些信息如:传输速率、数据格式、错误类型、最大是数据访问时间、DSR 寄存器是否启用的。其中 bit[126:127] 记录了 CSD 的版本号,CSD version 1.0 为标准容量卡所用,CSD version 2.0 为大容量或超大容量卡所用

---------------------

8.cmd13

读取卡状态

RCA是之前CMD3读取到的卡RCA

9.cmd7

发送CMD7+RCA选中卡片, 发送CMD7+0不选中卡片,RCA是之前CMD3读取到的卡RCA

/* 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;

}

10.ACMD51

发送CMD55+ACMD51读取SCR寄存器,SD卡可以通过该值获得位宽,如果是MMC卡则需要使用主线测试来确定卡的位宽。

PS:slave回复ACMD51是R1+data。SCR 是放在data中的,一共8个字节。

cmd.cmdidx = SD_CMD_APP_SEND_SCR;//51

cmd.resp_type = MMC_RSP_R1;

cmd.cmdarg = 0;

timeout = 3;

retry_scr:

data.dest = (char *)mmc->scr;

data.blocksize = 8;

data.blocks = 1;

data.flags = MMC_DATA_READ;

err = mmc_send_cmd(mmc, &cmd, &data);

if (err) {

if (timeout--)

goto retry_scr;

return err;

}

mmc->scr[0] = __be32_to_cpu(mmc->scr[0]);

mmc->scr[1] = __be32_to_cpu(mmc->scr[1]);

//     debug("scr_0=0x%x scr_1=0x%x\n",mmc->scr[0],mmc->scr[1]);

switch ((mmc->scr[0] >> 24) & 0xf) {//SD_SPEC

case 0:

mmc->version = SD_VERSION_1_0;

break;

case 1:

mmc->version = SD_VERSION_1_10;

break;

case 2:

mmc->version = SD_VERSION_2;

if ((mmc->scr[0] >> 15) & 0x1)

mmc->version = SD_VERSION_3;

break;

default:

mmc->version = SD_VERSION_1_0;

break;

}

if (mmc->scr[0] & SD_DATA_4BIT)

mmc->card_caps |= MMC_MODE_4BIT;

11.CMD6

CMD6是SD卡速度模式切换的一个重要命令,它定义了4种不同的功能组:

  1. 访问模式:SD总线接口速度模式的选择;
  2. 命令系统:通过一套莫共有的命令来扩展和控制特定的功能;
  3. 驱动强度:在UHS-I模式下等选择合适的输出驱动强度,和主机环境相关;
  4. 电流/功率限制:UHS-I卡在UHS-I模式选择,和主机环境相关;

MODE0: 查询模式,卡返回R1 + data[511:0]

data中存放了卡对每种功能的支持情况及当前选中的功能状态,及忙状态。

MODE1: 切换模式

每次发送切换只能选中一个功能组进行切换,其他功能组全部为1.

static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)

{

struct mmc_cmd cmd;

struct mmc_data data;

/* Switch the frequency */

cmd.cmdidx = SD_CMD_SWITCH_FUNC;

cmd.resp_type = MMC_RSP_R1;

       cmd.cmdarg = (mode << 31) | 0xffffff;

       cmd.cmdarg &= ~(0xf << (group << 2));

       cmd.cmdarg |= value << (group << 2);

data.dest = (char *)resp;

data.blocksize = 64;

data.blocks = 1;

data.flags = MMC_DATA_READ;

return mmc_send_cmd(mmc, &cmd, &data);

}

12.CMD16

设置块大小

13.CMD17

读单个块参数为block地址

卡回复R1 +DATA

14.CMD18

读多块

15.CMD12

停止传输

tuning

CMD19

发送tuning block

host发送CMD19,卡回复R1+data,tuning data 的数据长度及内容是固定的,host可以根据收到的数据调整采样的timing。

DW_SDHCI的tuning流程

[SDIO] SD card 初始化及常用命令解析(附波形,uboot代码)相关推荐

  1. [sd card] sd card初始化流程

    以SD 3.0为例. 建议先参考<[sd card] SD card初始化时的总线设置>. 一.sd card初始化流程思路说明 通过<SD_Ver3.00_Final_090416 ...

  2. Linux驱动——mmc sd card初始化流程(十一)

    Linux驱动--mmc sd card初始化流程(十一) 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客:   (1)[sd ...

  3. 运维之道 | Git分布式版本控制常用命令解析

    Git分布式版本控制常用命令解析 一.创建版本库 版本库(repository)也叫仓库,可以看做一个目录,这个目录里的所以文件都由Git进行管理,每个文件的修改.删除,Git都能跟踪 1.选择一个合 ...

  4. [sd card] SD card初始化时的总线设置

    ============================================================== 零.在sd card初始化过程中,对于bus主要设置以下东西 1.时钟,输 ...

  5. [转]VBA常用命令解析之001——On Error(将错就错)

    VBA常用命令解析之001--On Error(将错就错) 谁都希望自己的程序能一顺百顺,但是错误却一直是我们心中的痛.总是时不时地跳出来影响我们的情绪.虽然跳出来的错误提示会中断我们程序的运行,但是 ...

  6. linux常用rm命令详解,Linux常用命令解析- rm命令

    今天小编要跟大家分享的文章是关于Linux常用命令解析- rm命令.rm 是一个命令行工具,用于删除文件和目录.这是每个Linux用户都应该熟悉的基本命令之一. 在本指南中,我们将通过最常见的rm选项 ...

  7. strongswan常用命令解析(二)

    strongswan常用命令解析 0 > ipsec reload //重新加载 ipsec.conf文件 1 > ipsec rereadsecrets //重新加载ipsec.secr ...

  8. bat脚本常用命令及亲测示例代码超详细讲解

    这篇文章主要介绍了bat脚本常用命令及亲测示例代码超详细讲解,在这里需要注意编辑bat文件请使用ANSI编码,不然容易出现中文乱码,需要的朋友可以参考下 目录一 1.语句注释 2.暂停 3.输出和换行 ...

  9. Docker从入门到放弃-----Dockerfile常用命令解析与实战(使用docker制作一个开箱即用的consul镜像)

    前言 在上一篇文章docker常用命令的实践与解析中,我们提到了可以使用commit命令来在本地创建镜像,但是commit创建的镜像其实是不够正规的,第三方无法了解镜像创建的过程,所以只能作为我们在本 ...

  10. 【Windows批处理】常用命令解析

    0.[背景]常用参数: /* Win XP实测,测试方法:echo %userprofile% */%systemdrive% -- C: %windir% -- C:\WINDOWS %userpr ...

最新文章

  1. arm 流水线和pc值
  2. 一文读懂 HTTP/1HTTP/2HTTP/3
  3. c++创建虚拟串口_linux虚拟串口控制器驱动实现——适用于无开发板学习串口驱动...
  4. 苹果AirPower总是跳票的原因找到了?或因商标被抢注
  5. JWT的Java使用 (JJWT)
  6. 编写高质量java代码_编写高质量的Java代码
  7. stm32学习------stm32控制L298N电动机
  8. sqlplus基础命令
  9. CROW-5 WEB APP引擎商业计划书(HTML5方向)-微信网页版微信公众平台登录-水仙谷...
  10. 计算机专业毕业论文选题方向,计算机毕业方向论文选题 计算机毕业论文题目选什么比较好...
  11. Baxter学习笔记
  12. java 如何调用数组_Java中数组的使用
  13. ldoce5 android,朗文Longman 5词典界面修改优化补丁终极版(直接显示词典功能)
  14. 惠普计算机电源怎么设置充电,HP笔记本的三芯电源怎么改二芯实现充电?
  15. nyoj 191 小柯的问题
  16. 安卓系统格式化SD卡
  17. redis应用之安装配置介绍
  18. 海关179接口终极解决方案
  19. 华为上研所无线嵌入式优招面经
  20. Pandas库的学习

热门文章

  1. 服务器架设项目实训,计算机组网项目实训
  2. blackscholes matlab,基于MATLAB的Black-Scholes-Merton欧式期权定价模型的计算研究
  3. Android Banner Indicator 轮播图指示器
  4. WIFI接口定义知识介绍
  5. portal认证 java_华为5700交换机通过外部开源protal和本地aaa用户认证的一些问题
  6. 【转】 CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
  7. 微分方程3_求解偏微分方程
  8. hadoop3.3.1搭建过程遇到的坑
  9. 一本书读懂大数据时代
  10. audio autoplay无效的问题