我有一个Debian 7.0 Linux 3.2嵌入式ARM TI AM335x系统。这是我们开发的自定义板,但至少SD卡部分与开发板相同。我想向卡发送一些供应商特定的SD卡命令,即使用CMD56读取一些SMART数据。
是否有任何方法可以发送命令到SD卡控制器并从用户空间读取响应?
根据http://processors.wiki.ti.com/index.php/AM335x_MMC/SD_Driver%27s_Guide,你的驱动程序是omap_hsmmc
,还有一些信息可以在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卡和控制器)。我在https://code.google.com/p/chromium/issues/detail?id=315380看到了Gwendal Grignou提交的反馈,其中指出了某些移动PC操作系统上的问题。
如果根设备是SATA设备:
- 添加命令输出 hdparm -I /dev/sda
- 添加命令输出 smartctl -a /dev/sda
如果根设备是eMMC设备:
- 当mmc-utils将成为映像的一部分时,请添加类似的命令输出。
听起来mmc-utils
是实现SD卡的SMART的首选工具。在http://git.kernel.org/cgit/linux/kernel/git/cjb/mmc-utils.git/tree/上有mmc-utils
的主页git。
我在这里没有看到“SMART”,但mmc-utils/mmc_cmds.c具有发送自定义命令到卡的代码,可以使用ioctl(fd, MMC_IOC_CMD, (struct mmc_ioc_cmd*)&ioctl_data)
(希望这对大多数SD控制器都有效) ,其中fd指向正确的mmcblkX
设备。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);
}
2011年12月20日,Shashidhar Hiremath在LKML上发布了关于MMC_IOC_CMD的一些文档和示例"[PATCH 1/1] mmc: User Application for testing SD/MMC Commands and extra IOCTL Command for MMC card reset"
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...
是的,有一些特定于供应商的SD卡命令,您可以使用CMD56从SD卡读取SMART数据到您的设备。
主机必须能够支持供应商命令“CMD61”和“CMD56”。并且在发出CMD61和CMD56之间需要有5ms的FW繁忙时间延迟。
保罗。

最简单的方法是mmap SD控制器的内存空间,然后将SD控制器数据手册中的命令写入控制器。
man mmap
。但我应该映射哪个文件和什么偏移量?我认为你的帖子不是真正的答案,这篇帖子可能会被投票降低。 - osgx
dmesg
输出)是什么? - osgxmmc-tools
和MMC_IOC_CMD
。在Windows中,有类似的DeviceIoControl(drv_hdl,IOCTL_SFFDISK_DEVICE_COMMAND,
与SDCMD_DESCRIPTOR sdCmdDescriptor
结构体。 - osgx