谁能指导我如何通过 IOCTL 在 Windows 上写入 SD 卡的外部 CSD 寄存器。
我正在使用 IOCTL_SFFDISK_DEVICE_COMMAND 发送 CMD6(SWITCH) 并修改 eMMC 外部 CSD 寄存器的一些字段。但是 DeviceIoControl 引发错误(ERROR_ACCESS_DENIED),我无法写入寄存器。例如,我试图将 Value=0x00 写入 POWER_OFF_NOTIFICATION 字段,即 ExCSD[34]。按照 linux 中 mmc_ioc_cmd 结构的填充方式
UINT32 value = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | (index << 16) | (val << 8) | EXT_CSD_CMD_SET_NORMAL;
我将命令数据填写为:
SFFDISK_DEVICE_COMMAND_DATA &sdcd = GetCommandData();
sdcd.HeaderSize = sizeof(SFFDISK_DEVICE_COMMAND_DATA);
sdcd.Command = SFFDISK_DC_DEVICE_COMMAND;
sdcd.ProtocolArgumentSize = sizeof(SDCMD_DESCRIPTOR);
sdcd.DeviceDataBufferSize = BufferSize;
我的描述符数据为:
SDCMD_DESCRIPTOR Desc;
Desc.Cmd = SDCMD_SWITCH ; /*CMD6*/
Desc.CmdClass = SDCC_STANDARD;
Desc.TransferDirection = SDTD_WRITE;
Desc.TransferType = SDTT_CMD_ONLY;
Desc.ResponseType = SDRT_1B;
现在,我已经厌倦了两种填充和发送数据的方法:
方法1:将数据字段复制到信息字段中,即:
sdcd.Information = value;
Method2 : 将 Data 字段复制到 DataBuffer 区域。我的缓冲区被声明为:
struct SDBuffer {
char dcd[sizeof(SFFDISK_DEVICE_COMMAND_DATA)];
SDCMD_DESCRIPTOR Descriptor;
BYTE Buffer[0];
} *data;
因此,
memcpy(data->Buffer, &value, sizeof(value));
PS:我已经在运行 IOCTL 以成功读取 CID 和 CSD 寄存器的值。此外,外部 CSD 寄存器的内容通过 IOCTL_SFFDISK_MMC_QUERY_EXT_CSD。
任何帮助都感激不尽。
问候