有人可以指导我如何通过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注册。
非常感谢任何帮助。
此致