2

谁能指导我如何通过 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。

任何帮助都感激不尽。

问候

4

0 回答 0