首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法从Linux用户空间向SD卡发送命令?

有没有办法从Linux用户空间向SD卡发送命令?
EN

Stack Overflow用户
提问于 2014-04-26 23:28:42
回答 3查看 15.9K关注 0票数 6

我有一个Debian7.0Linux3.2嵌入式ARM TI AM335x系统。这是我们开发的定制板,但SD卡部分至少与开发板相同。有一些特定于供应商的SD卡命令,我想向该卡发出,即使用CMD56读取一些智能数据。

有没有办法向SD卡控制器发送命令并读取来自用户空间的响应?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-28 09:12:47

你的驱动程序是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卡中的智能监控支持后,我得到了搜索查询mmc smartctl (因为smartctl是Linux中*ATA的智能监控实用程序的名称,而mmc是实现MMC卡、SDHC卡和控制器的核心子系统。我发现Gwendal Grignou开发的https://code.google.com/p/chromium/issues/detail?id=315380在一些移动PC操作系统上出现了漏洞

如果根设备是SATA设备,则为

  • 添加hdparm -I /dev/sda
  • 的输出添加smartctl -a /dev/sda

的输出

如果根设备是eMMC设备:

  • 当mmc-utils将成为映像的一部分时,请添加类似的命令输出。

听起来mmc-utils是为SD卡实现SMART的首选工具。在kernel.org上有mmc-utils的主页git:http://git.kernel.org/cgit/linux/kernel/git/cjb/mmc-utils.git/tree/

我在这里看不到“智能”,但mmc-utils/mmc_cmds.c有代码发送自定义命令到卡通过使用ioctl(fd, MMC_IOC_CMD, (struct mmc_ioc_cmd*) &ioctl_data)和fd指向正确的mmcblkX设备(我希望这与大多数SD控制器一起工作)。Johan RUDHOLM编写的代码(来自st-ericsson,2012,GPLv2):

代码语言:javascript
运行
复制
   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日14:54 "[PATCH 1/1] mmc: User Application for testing SD/MMC Commands and extra IOCTL Command for MMC card reset",Shashidhar以LKML语言发布了一些MMC_IOC_CMD文档和示例

struct mmc_ioc_cmd的官方userAPI (uapi)在linux源码树include/uapi/linux/mmc/ioctl.h中。

代码语言:javascript
运行
复制
  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...
票数 10
EN

Stack Overflow用户

发布于 2014-04-28 18:44:41

最简单的方法是映射SD控制器的存储空间,然后将sd控制器的数据表命令写入控制器。

票数 -1
EN

Stack Overflow用户

发布于 2014-11-22 01:38:07

是的,有供应商特定的SD卡命令,您可以使用CMD56将SD卡中的智能数据读取到您的设备中。

主机必须能够支持供应商命令“CMD61”和“CMD56”。并且在发出CMD61和CMD56之间的固件忙碌时间需要有5ms的延迟。

保罗。



票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23312933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档