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)
- 🎯 RT-Thread roadmap for long term HOT 1
- 移植ZYNQMP设备树启动过程遇到的一些关于初始化MMU的问题 HOT 6
- GitHub CI doxygen 语法错误
- serial_v2 框架中 DMA 发送完成逻辑处理的一个讨论
- [SLAB] 初始化对于limsize进行对齐可能存在问题 HOT 2
- [Kconfig] 是不是放弃“option env=”了? HOT 3
- [utest] 单元测试框架不够完善 HOT 3
- qemu-virt64-aarch64怎么使用gic-version3
- [kernel timer]rt_timer_check 和 _soft_timer_check 函数是否可以抽出为同一份? HOT 3
- 想知道aarch64的qemu运行的内存布局 HOT 2
- Missing boundary check before sprintf in process_file function HOT 1
- 在bsp/qemu-virt64-aarch64示例中使能umqtt后无法subscribe HOT 3
- FAL组件擦除分区数据返回值并非实际擦除区域大小
- duo : gpio : rt_pin_read 无法读出引脚的状态 HOT 2
- duo : wdt : cvi_wdt_top_setting 疑问
- duo : wdt : RT_DEVICE_CTRL_WDT_SET_TIMEOUT 的单位问题
- duo : wdt : 编译告警
- duo : 管脚复用的功能支持 HOT 2
- stm32cubeMX生成的 rt-thread makefile工程似乎有bug
- duo:编译时是否可以默认加入 gpio HOT 3
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.