[英]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.