簡體   English   中英

有什么辦法從Linux用戶空間向SD卡發送命令?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM