[英]Any way to send commands to SD card from Linux userspace?
我有一个Debian 7.0 Linux 3.2嵌入式ARM TI AM335x系统。 这是我们开发的定制板,但SD卡部分至少与开发板相同。 我想向卡发出一些供应商特定的SD卡命令,即使用CMD56读取一些SMART数据。
有没有办法向SD卡控制器发送命令并从用户空间读取响应?
您的驱动程序是omap_hsmmc
根据http://processors.wiki.ti.com/index.php/AM335x_MMC/SD_Driver%27s_Guide一些信息也可以在https://www.kernel.org/doc/Documentation/devicetree/bindings/mmc /ti-omap-hsmmc.txt
在网上搜索SD卡中的SMART监控支持后,我得到了搜索查询mmc smartctl
(因为smartctl
是Linux中* ATA的SMART监控实用程序的名称,而mmc
是实现MMC,SD,SDHC卡和控制器的内核子系统我发现了一些移动PC操作系统的bug, https://code.google.com/p/chromium/issues/detail? id = 315380,Gwendal Grignou
如果根设备是SATA设备:
- 添加hdparm -I / dev / sda的输出
- 添加smartctl -a / dev / sda的输出
如果根设备是eMMC设备:
- 当mmc-utils成为图像的一部分时,添加类似的命令输出。
听起来像mmc-utils
它是实现SMART SD卡的首选工具。 在kernel.org上有mmc-utils
主页git: http : //git.kernel.org/cgit/linux/kernel/git/cjb/mmc-utils.git/tree/
我在这里看不到“SMART”,但mmc-utils / mmc_cmds.c有代码通过使用ioctl(fd, MMC_IOC_CMD, (struct mmc_ioc_cmd*) &ioctl_data)
将自定义命令发送到卡,fd指向正确的mmcblkX
设备(I希望这适用于大多数SD控制器)。 代码:Johan RUDHOLM(来自st-ericsson,2012,GPLv2):
int read_extcsd(int fd, __u8 *ext_csd)
{
struct mmc_ioc_cmd idata;
memset(&idata, 0, sizeof(idata));
memset(ext_csd, 0, sizeof(__u8) * 512);
idata.write_flag = 0;
idata.opcode = MMC_SEND_EXT_CSD;
idata.arg = 0;
idata.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
idata.blksz = 512;
idata.blocks = 1;
mmc_ioc_cmd_set_data(idata, ext_csd);
return ioctl(fd, MMC_IOC_CMD, &idata);
}
int write_extcsd_value(int fd, __u8 index, __u8 value)
{
struct mmc_ioc_cmd idata;
memset(&idata, 0, sizeof(idata));
idata.write_flag = 1;
idata.opcode = MMC_SWITCH;
idata.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
(index << 16) |
(value << 8) |
EXT_CSD_CMD_SET_NORMAL;
idata.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
return ioctl(fd, MMC_IOC_CMD, &idata);
}
MMC_IOC_CMD的一些文档和示例由Shashidhar Hiremath于2011年12月20日14:54发布在LKML中“[PATCH 1/1] mmc:用于测试SD / MMC命令的用户应用程序和用于MMC卡重置的额外IOCTL命令”
struct mmc_ioc_cmd
的官方用户API(uapi)在linux源代码树中include/uapi/linux/mmc/ioctl.h
:
6 struct mmc_ioc_cmd {
...
10 /* Application-specific command. true = precede with CMD55 */
11 int is_acmd;
...
51 * Since this ioctl is only meant to enhance (and not replace) normal access
52 * to the mmc bus device...
最简单的方法是mmap SD控制器的存储空间,然后将sd控制器数据表的命令写入控制器。
是的,有供应商特定的SD卡命令,您可以使用CMD56从SD卡读取SMART数据到您的设备。
主机必须能够支持供应商命令“CMD61”和“CMD56”。 并且在问题CMD61和CMD56之间的FW忙时间需要5ms延迟。
保罗。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.