我是MMC IOCTL的新手。我试图阅读我的三星4.5 eMMC的CID。但是我似乎让Connection超时了。我正在使用CMD10进行cid阅读。
使用的mmc.h文件类似于mmc-utils中的文件。
附件是我的代码和错误屏幕截图:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include "mmc.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdint.h>
#include <assert.h>
#define CID_SIZE 16
#define MMC_SEND_CID 10
int read_cid(int fd, __u8 *cid)
{
int ret = 0;
struct mmc_ioc_cmd idata;
memset(&idata, 0, sizeof(idata));
memset(cid, 0, sizeof(__u8) * CID_SIZE);
idata.write_flag = 0;
idata.opcode = MMC_SEND_CID;
idata.arg = 0;
idata.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
idata.blksz = CID_SIZE;
idata.blocks = 1;
mmc_ioc_cmd_set_data(idata, cid);
ret = ioctl(fd, MMC_IOC_CMD, &idata);
if (ret)
perror("ioctl SEND_CID");
return ret;
}
主要功能如下:
void main(int argc, const char **argv) {
int fd, ret, i=0;
if (argc != 2) {
printf("Usage: ./CIDread <device> \n");
printf("device - sd card block device e.g. /dev/block/mmcblk1\n");
printf("\n");
printf("Warning: use at own risk!\n");
return;
}
// open device
fd = open(argv[1], O_RDWR);
__u8 cid[CID_SIZE]={0};
for (i=0;i<CID_SIZE;i++)
{
printf("CID DEBUG values is:");
printf("%lu",cid[i]);
printf("\n");
}
/* 4) read the device manfid */
ret = read_cid(fd, cid);
if (ret) {
fprintf(stderr, "ERROR: Read EXT_CSD from %s: %m\n",argv[1]);
}
else{
for (i=0;i<CID_SIZE;i++){
printf("CID values is:");
printf("%lu",cid[i]);
printf("\n");
}
}
close(fd);
}
错误消息如下:
User # ./cid /dev/mmcblk1
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
CID DEBUG values is:0
ioctl SEND_CID: Connection timed out
ERROR: Read EXT_CSD from /dev/mmcblk1: Connection timed out