Comments (4)
嗯,这里是有这个问题,谢谢反馈!
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.
上面提到的是探测SDIO设备时高速模式设置的.
自己觉得上面可能说的不够详细,我把我具体的实际情况说明:
- SD卡是class 4的SDHC 4G卡.
- 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.
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设备时高速模式设置的.
自己觉得上面可能说的不够详细,我把我具体的实际情况说明:
- SD卡是class 4的SDHC 4G卡.
- 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.
是的!检查完host是否支持highspeed模式就完事儿~ ~
from rt-thread.
Related Issues (20)
- 异步I/O的aio_write函数
- [bsp] loongson 下 ls2kdev 链接时报错 undefined reference to `sbrk' HOT 1
- v5.1.1 需要推进的点 HOT 6
- 5.0.2版本stm32f103-100ask-pro的spi_flash_init.c缺少#include "drv_gpio.h" HOT 2
- [drv_eth] STM32以太网BSP驱动的PHY物理地址问题 HOT 1
- rt_can_read memory write out of boundary HOT 1
- RTThread不支持 STM32CUBEMX 生成的Advanced工程,只支持Basic工程。
- RT-thread 移植到RISC-V裸片的问题 HOT 1
- shell.c 文件中finsh_get_prompt()函数使用strcat()函数会造成数据访问异常 HOT 1
- [msh] 自动补全子选项 没有使用说明与注释
- [finsh] finsh_syscall_lookup是否应该删除
- 使用DUO开发板,编译RT-Thread大核时编译不过 HOT 2
- [ipc]负值不明确的转换导致编译警告
- [mem]MIN_SIZE宏定义 不易于理解 HOT 1
- 关于LWP的修改带来的问题 HOT 6
- 使用RT-Studio生产的STM32F407VE工程运行一段时间后自动停止, update -> 发现是串口无法持续输出 HOT 11
- 目前不使用设备树的aarch64 BSP不能使用PSCI方案管理CPU,能否针对这种情况做一下兼容呢? HOT 5
- rt-thread/bsp/qemu-vexpress-a9下编译失败 HOT 1
- bsp/renesas/rzt2m_rsk bsp目录是否可以优化一下? HOT 5
- 关于野火霸道开发版的bsp包,本地编译后显示Undefined symbol rt_condvar_init (referred from pipe.o)问题 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rt-thread.