Windows IOCTL:如何写入SD卡外部CSD寄存器?

时间:2015-11-05 11:45:00

标签: windows storage sd-card ioctl deviceiocontrol

有人可以指导我如何通过IOCTL在Windows上写入外部CSD SD卡寄存器。

我正在使用IOCTL_SFFDISK_DEVICE_COMMAND发送CMD6(SWITCH)并修改eMMC外部CSD寄存器的某些字段。但DeviceIoControl抛出错误(ERROR_ACCESS_DENIED),我无法写入寄存器。 例如,我试图将值= 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;

现在,我已经厌倦了两种填充和发送数据的方法:

Method1 :将数据字段复制到信息字段,即:

sdcd.Information = value;

Method2 :将数据字段复制到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注册。

非常感谢任何帮助。

此致

0 个答案:

没有答案