Code Monkey home page Code Monkey logo

Comments (4)

weety avatar weety commented on May 13, 2024

嗯,这里是有这个问题,谢谢反馈!

2013/4/2 YafeiYan [email protected]

BSP: AT91SAM9260
在SDIO驱动初始化中,对host->flags赋值如下:
host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE;

并未设置MMCSD_SUP_HIGHSPEED标志.所以下面这段代码应该在判断此标志时会返回,但是从板子实际运行的情况来看,此标志被设置了,但搜索代码并未发现设置该flag.
可能出现问题处的代码:
static rt_int32_t sdio_set_highspeed(struct rt_mmcsd_card *card)
{
rt_int32_t ret;
rt_uint8_t speed;

if (!(card->host->flags & MMCSD_SUP_HIGHSPEED))
return 0;

if (!card->cccr.high_speed)
return 0;

speed = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_SPEED, &ret);
if (ret)
return ret;

speed |= SDIO_SPEED_EHS;

ret = sdio_io_writeb(card->sdio_function[0], SDIO_REG_CCCR_SPEED, speed);
if (ret)
return ret;

card->flags |= CARD_FLAG_HIGHSPEED;

return 0;

}


Reply to this email directly or view it on GitHubhttps://github.com//issues/73
.

from rt-thread.

wiekern avatar wiekern commented on May 13, 2024

上面提到的是探测SDIO设备时高速模式设置的.
自己觉得上面可能说的不够详细,我把我具体的实际情况说明:

  1. SD卡是class 4的SDHC 4G卡.
  2. AT91SAM9261S只支持MMC V2.2和SD Card V1.0规范.
    因此,探测的时候,调的是MMC/SD卡的初始化接口函数.实际上在我的板子上,上面提到的那段代码不会被调用到,而是调用下面的接口,但上面提出的问题仍然是存在的.
    在探测MMC/SD设备中,切换到调整模式也有类似的问题.

static rt_int32_t mmcsd_switch(struct rt_mmcsd_card *card)
{
    rt_int32_t err;
    struct rt_mmcsd_host *host = card->host;
    struct rt_mmcsd_req req;
    struct rt_mmcsd_cmd cmd;
    struct rt_mmcsd_data data;
    rt_uint8_t *buf;
    buf = (rt_uint8_t*)rt_malloc(64);
    if (!buf) 
    {
        rt_kprintf("alloc memory failed\n");
        return -RT_ENOMEM;
    }
    
    if (card->card_type != CARD_TYPE_SD)
        goto err;
    if (card->scr.sd_version < SCR_SPEC_VER_1)
        goto err;
    rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
    cmd.cmd_code = SD_SWITCH;
    cmd.arg = 0x00FFFFF1;
    cmd.flags = RESP_R1 | CMD_ADTC;
    rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
    mmcsd_set_data_timeout(&data, card);
    data.blksize = 64;
    data.blks = 1;
    data.flags = DATA_DIR_READ;
    data.buf = (rt_uint32_t *)buf;
    rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
    req.cmd = &cmd;
    req.data = &data;
    mmcsd_send_request(host, &req);
    if (cmd.err || data.err) 
    {
        goto err1;
    }
    if (buf[13] & 0x02)
        card->hs_max_data_rate = 50000000;
    rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
    cmd.cmd_code = SD_SWITCH;
    cmd.arg = 0x80FFFFF1;
    cmd.flags = RESP_R1 | CMD_ADTC;
    rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
    mmcsd_set_data_timeout(&data, card);
    data.blksize = 64;
    data.blks = 1;
    data.flags = DATA_DIR_READ;
    data.buf = (rt_uint32_t *)buf;
    rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
    req.cmd = &cmd;
    req.data = &data;
    mmcsd_send_request(host, &req);
    if (cmd.err || data.err) 
    {
        goto err1;
    }
    if ((buf[16] & 0xF) != 1) 
    {
        rt_kprintf("switching card to high speed failed\n");
        goto err;
    }
    card->flags |= CARD_FLAG_HIGHSPEED;
err:
    rt_free(buf);
    return 0;
err1:
    if (cmd.err) err = cmd.err;
    if (data.err) err = data.err;
    return err;
}

代码中有这样一句:if (card->scr.sd_version < SCR_SPEC_VER_1) 我想对于我的板子只支持V1.0规范在此应该返回.此处是否应该判断芯片支持哪个规范?而不是判断SD卡支持的规范.

from rt-thread.

weety avatar weety commented on May 13, 2024

card->scr.sd_version < SCR_SPEC_VER_1
这里是读取的SD卡的SCR寄存器,获取的是SD卡版本,<SCR_SPEC_VER_1表示是SDSC卡,SCR_SPEC_VER_2则是SDHC卡,
不是host的版本。这里SD卡没有问题实际上是没有检查host是否支持highspeed模式,等会儿加上。

在 2013年4月2日下午8:03,YafeiYan [email protected]写道:

上面提到的是探测SDIO设备时高速模式设置的.
自己觉得上面可能说的不够详细,我把我具体的实际情况说明:

  1. SD卡是class 4的SDHC 4G卡.
  2. AT91SAM9261S只支持MMC V2.2和SD Card V1.0规范.

因此,探测的时候,调的是MMC/SD卡的初始化接口函数.实际上在我的板子上,上面提到的那段代码不会被调用到,而是调用下面的接口,但上面提出的问题仍然是存在的.
在探测MMC/SD设备中,切换到调整模式也有类似的问题.

static rt_int32_t mmcsd_switch(struct rt_mmcsd_card *card)
{
rt_int32_t err;
struct rt_mmcsd_host *host = card->host;
struct rt_mmcsd_req req;
struct rt_mmcsd_cmd cmd;
struct rt_mmcsd_data data;
rt_uint8_t *buf;

buf = (rt_uint8_t*)rt_malloc(64);
if (!buf)
{
    rt_kprintf("alloc memory failed\n");
    return -RT_ENOMEM;
}

if (card->card_type != CARD_TYPE_SD)
    goto err;
if (card->scr.sd_version hs_max_data_rate = 50000000;

rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));

cmd.cmd_code = SD_SWITCH;
cmd.arg = 0x80FFFFF1;
cmd.flags = RESP_R1 | CMD_ADTC;

rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));

mmcsd_set_data_timeout(&data, card);

data.blksize = 64;
data.blks = 1;
data.flags = DATA_DIR_READ;
data.buf = (rt_uint32_t *)buf;

rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));

req.cmd = &cmd;
req.data = &data;

mmcsd_send_request(host, &req);

if (cmd.err || data.err)
{
    goto err1;
}

if ((buf[16] & 0xF) != 1)
{
    rt_kprintf("switching card to high speed failed\n");
    goto err;
}

card->flags |= CARD_FLAG_HIGHSPEED;

err:
rt_free(buf);
return 0;

err1:
if (cmd.err) err = cmd.err;
if (data.err) err = data.err;

return err;

}

代码中有这样一句:if (card->scr.sd_version < SCR_SPEC_VER_1)
我想对于我的板子只支持V1.0规范在此应该返回.


Reply to this email directly or view it on GitHubhttps://github.com//issues/73#issuecomment-15771154
.

from rt-thread.

wiekern avatar wiekern commented on May 13, 2024

是的!检查完host是否支持highspeed模式就完事儿~ ~

from rt-thread.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.