Implement SDHCI for win32.

This commit is contained in:
2019-10-27 14:43:46 +00:00
parent d48d19ff76
commit b0d06c4d97
4 changed files with 199 additions and 4 deletions

View File

@@ -103,6 +103,37 @@
#define DICMOTE_ATA_TRANSFER_REGISTER_FEATURE 1
#define DICMOTE_ATA_TRANSFER_REGISTER_SECTOR_COUNT 2
#define DICMOTE_ATA_TRANSFER_REGISTER_SPTSIU 3
#define DICMOTE_MMC_RESPONSE_PRESENT (1 << 0)
#define DICMOTE_MMC_RESPONSE_136 (1 << 1)
#define DICMOTE_MMC_RESPONSE_CRC (1 << 2)
#define DICMOTE_MMC_RESPONSE_BUSY (1 << 3)
#define DICMOTE_MMC_RESPONSE_OPCODE (1 << 4)
#define DICMOTE_MMC_COMMAND_MASK (3 << 5)
#define DICMOTE_MMC_COMMAND_AC (0 << 5)
#define DICMOTE_MMC_COMMAND_ADTC (1 << 5)
#define DICMOTE_MMC_COMMAND_BC (2 << 5)
#define DICMOTE_MMC_COMMAND_BCR (3 << 5)
#define DICMOTE_MMC_RESPONSE_SPI_S1 (1 << 7)
#define DICMOTE_MMC_RESPONSE_SPI_S2 (1 << 8)
#define DICMOTE_MMC_RESPONSE_SPI_B4 (1 << 9)
#define DICMOTE_MMC_RESPONSE_SPI_BUSY (1 << 10)
#define DICMOTE_MMC_RESPONSE_NONE (0)
#define DICMOTE_MMC_RESPONSE_R1 DICMOTE_MMC_RESPONSE_PRESENT | DICMOTE_MMC_RESPONSE_CRC | DICMOTE_MMC_RESPONSE_OPCODE
#define DICMOTE_MMC_RESPONSE_R1B \
DICMOTE_MMC_RESPONSE_PRESENT | DICMOTE_MMC_RESPONSE_CRC | DICMOTE_MMC_RESPONSE_OPCODE | DICMOTE_MMC_RESPONSE_BUSY
#define DICMOTE_MMC_RESPONSE_R2 DICMOTE_MMC_RESPONSE_PRESENT | DICMOTE_MMC_RESPONSE_136 | DICMOTE_MMC_RESPONSE_CRC
#define DICMOTE_MMC_RESPONSE_R3 DICMOTE_MMC_RESPONSE_PRESENT
#define DICMOTE_MMC_RESPONSE_R4 DICMOTE_MMC_RESPONSE_PRESENT
#define DICMOTE_MMC_RESPONSE_R5 DICMOTE_MMC_RESPONSE_PRESENT | DICMOTE_MMC_RESPONSE_CRC | DICMOTE_MMC_RESPONSE_OPCODE
#define DICMOTE_MMC_RESPONSE_R6 DICMOTE_MMC_RESPONSE_PRESENT | DICMOTE_MMC_RESPONSE_CRC | DICMOTE_MMC_RESPONSE_OPCODE
#define DICMOTE_MMC_RESPONSE_R7 DICMOTE_MMC_RESPONSE_PRESENT | DICMOTE_MMC_RESPONSE_CRC | DICMOTE_MMC_RESPONSE_OPCODE
#define DICMOTE_MMC_RESPONSE_SPI_R1 DICMOTE_MMC_RESPONSE_SPI_S1
#define DICMOTE_MMC_RESPONSE_SPI_R1B DICMOTE_MMC_RESPONSE_SPI_S1 | DICMOTE_MMC_RESPONSE_SPI_BUSY
#define DICMOTE_MMC_RESPONSE_SPI_R2 DICMOTE_MMC_RESPONSE_SPI_S1 | DICMOTE_MMC_RESPONSE_SPI_S2
#define DICMOTE_MMC_RESPONSE_SPI_R3 DICMOTE_MMC_RESPONSE_SPI_S1 | DICMOTE_MMC_RESPONSE_SPI_B4
#define DICMOTE_MMC_RESPONSE_SPI_R4 DICMOTE_MMC_RESPONSE_SPI_S1 | DICMOTE_MMC_RESPONSE_SPI_B4
#define DICMOTE_MMC_RESPONSE_SPI_R5 DICMOTE_MMC_RESPONSE_SPI_S1 | DICMOTE_MMC_RESPONSE_SPI_S2
#define DICMOTE_MMC_RESPONSE_SPI_R7 DICMOTE_MMC_RESPONSE_SPI_S1 | DICMOTE_MMC_RESPONSE_SPI_B4
#pragma pack(push, 1)

View File

@@ -5,13 +5,26 @@ if (NOT "${CMAKE_SYSTEM}" MATCHES "Windows")
endif ()
CHECK_INCLUDE_FILES("ntddscsi.h" HAVE_NTDDSCSI_H)
CHECK_INCLUDE_FILES("sffdisk.h" HAVE_SFFDISK_H)
CHECK_INCLUDE_FILES("sddef.h" HAVE_SDDEF_H)
CHECK_TYPE_SIZE(ATA_PASS_THROUGH_EX APTE)
CHECK_TYPE_SIZE(SCSI_PASS_THROUGH_DIRECT SPTD)
CHECK_TYPE_SIZE(SFFDISK_DEVICE_COMMAND_DATA SDCD)
CHECK_TYPE_SIZE(SDCMD_DESCRIPTOR SDCMDD)
if (HAVE_NTDDSCSI_H)
add_definitions(-DHAS_NTDDSCSI_H)
endif ()
if (HAVE_SFFDISK_H)
add_definitions(-DHAS_SFFDISK_H)
endif ()
if (HAVE_SDDEF_H)
add_definitions(-DHAS_SDDEF_H)
endif ()
if (HAVE_APTE)
add_definitions(-DHAS_APTE)
endif ()
@@ -20,6 +33,14 @@ if (HAVE_SPTD)
add_definitions(-DHAS_SPTD)
endif ()
if (HAVE_SDCD)
add_definitions(-DHAS_SDCD)
endif ()
if (HAVE_SDCMDD)
add_definitions(-DHAS_SDCMDD)
endif ()
set(PLATFORM_SOURCES "win32.h" network.c hello.c "win32.c" list_devices.c ata.c device.c ieee1394.c pcmcia.c scsi.c sdhci.c usb.c ntioctl.h)
add_executable(dicremote ${PLATFORM_SOURCES})

View File

@@ -24,6 +24,14 @@
#include <ntddscsi.h>
#endif
#ifdef HAVE_SFFDISK_H
#include <sffdisk.h>
#endif
#ifdef HAVE_SDDEF_H
#include <sddef.h>
#endif
#ifndef ATA_FLAGS_DRDY_REQUIRED
#define ATA_FLAGS_DRDY_REQUIRED (1 << 0)
#endif
@@ -68,6 +76,10 @@
#define IOCTL_SCSI_PASS_THROUGH_DIRECT 0x4D014
#endif
#ifndef IOCTL_SFFDISK_DEVICE_COMMAND
#define IOCTL_SFFDISK_DEVICE_COMMAND 0x79E84
#endif
#ifndef HAS_SPTD
typedef struct _SCSI_PASS_THROUGH_DIRECT
{
@@ -105,4 +117,74 @@ typedef struct _ATA_PASS_THROUGH_EX
} ATA_PASS_THROUGH_EX, *PATA_PASS_THROUGH_EX;
#endif
#ifndef HAS_SDCD
typedef enum
{
SFFDISK_DC_GET_VERSION,
SFFDISK_DC_LOCK_CHANNEL,
SFFDISK_DC_UNLOCK_CHANNEL,
SFFDISK_DC_DEVICE_COMMAND
} SFFDISK_DCMD;
typedef struct _SFFDISK_DEVICE_COMMAND_DATA
{
USHORT HeaderSize;
USHORT Reserved;
SFFDISK_DCMD Command;
USHORT ProtocolArgumentSize;
ULONG DeviceDataBufferSize;
ULONG_PTR Information;
UCHAR Data[];
} SFFDISK_DEVICE_COMMAND_DATA, *PSFFDISK_DEVICE_COMMAND_DATA;
#endif
#ifndef SDCMDD
typedef UCHAR SD_COMMAND_CODE;
typedef enum
{
SDCC_STANDARD,
SDCC_APP_CMD
} SD_COMMAND_CLASS;
typedef enum
{
SDTD_UNSPECIFIED = 0,
SDTD_READ = 1,
SDTD_WRITE = 2
} SD_TRANSFER_DIRECTION;
typedef enum
{
SDTT_UNSPECIFIED,
SDTT_CMD_ONLY,
SDTT_SINGLE_BLOCK,
SDTT_MULTI_BLOCK,
SDTT_MULTI_BLOCK_NO_CMD12
} SD_TRANSFER_TYPE;
typedef enum
{
SDRT_UNSPECIFIED,
SDRT_NONE,
SDRT_1,
SDRT_1B,
SDRT_2,
SDRT_3,
SDRT_4,
SDRT_5,
SDRT_5B,
SDRT_6
} SD_RESPONSE_TYPE;
typedef struct _SDCMD_DESCRIPTOR
{
SD_COMMAND_CODE Cmd;
SD_COMMAND_CLASS CmdClass;
SD_TRANSFER_DIRECTION TransferDirection;
SD_TRANSFER_TYPE TransferType;
SD_RESPONSE_TYPE ResponseType;
} SDCMD_DESCRIPTOR, *PSDCMD_DESCRIPTOR;
#endif
#endif // DICREMOTE_WIN32_NTIOCTL_H_

View File

@@ -15,6 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ntioctl.h"
#include "win32.h"
#include <stdint.h>
@@ -33,10 +34,70 @@ int32_t Win32SendSdhciCommand(void* device_ctx,
uint32_t* duration,
uint32_t* sense)
{
Win32DeviceContext* ctx = device_ctx;
Win32DeviceContext* ctx = device_ctx;
DWORD cmdbuf_len;
PCHAR cmdbuf;
DWORD buf_len;
PSFFDISK_DEVICE_COMMAND_DATA cmd_data;
PSDCMD_DESCRIPTOR cmd_descriptor;
PCHAR data_buf;
DWORD error = 0;
DWORD k = 0;
LARGE_INTEGER frequency;
LARGE_INTEGER start;
LARGE_INTEGER end;
DOUBLE interval;
if(!ctx) return -1;
// TODO: Implement
return -1;
}
buf_len = blocks * block_size;
cmdbuf_len = sizeof(SFFDISK_DEVICE_COMMAND_DATA) + sizeof(SDCMD_DESCRIPTOR) + buf_len;
cmdbuf = malloc(cmdbuf_len);
if(!cmdbuf) return -1;
memset(cmdbuf, 0, cmdbuf_len);
cmd_data = (PSFFDISK_DEVICE_COMMAND_DATA)cmdbuf;
cmd_descriptor = (PSDCMD_DESCRIPTOR)(cmdbuf + sizeof(SFFDISK_DEVICE_COMMAND_DATA));
data_buf = cmdbuf + sizeof(SFFDISK_DEVICE_COMMAND_DATA) + sizeof(SDCMD_DESCRIPTOR);
memcpy(data_buf, buffer, buf_len);
cmd_data->HeaderSize = sizeof(SFFDISK_DEVICE_COMMAND_DATA);
cmd_data->Command = SFFDISK_DC_DEVICE_COMMAND;
cmd_data->ProtocolArgumentSize = sizeof(SDCMD_DESCRIPTOR);
cmd_data->DeviceDataBufferSize = buf_len;
cmd_descriptor->Cmd = command;
cmd_descriptor->CmdClass = application ? SDCC_APP_CMD : SDCC_STANDARD;
cmd_descriptor->TransferDirection = write ? SDTD_WRITE : SDTD_READ;
cmd_descriptor->TransferType = (flags & DICMOTE_MMC_COMMAND_ADTC) ? SDTT_SINGLE_BLOCK : SDTT_CMD_ONLY;
cmd_descriptor->ResponseType = 0;
if((flags & DICMOTE_MMC_RESPONSE_R1) || (flags & DICMOTE_MMC_RESPONSE_SPI_R1))
cmd_descriptor->ResponseType = SDRT_1;
if((flags & DICMOTE_MMC_RESPONSE_R1B) || (flags & DICMOTE_MMC_RESPONSE_SPI_R1B))
cmd_descriptor->ResponseType = SDRT_1B;
if((flags & DICMOTE_MMC_RESPONSE_R2) || (flags & DICMOTE_MMC_RESPONSE_SPI_R2))
cmd_descriptor->ResponseType = SDRT_2;
if((flags & DICMOTE_MMC_RESPONSE_R3) || (flags & DICMOTE_MMC_RESPONSE_SPI_R3))
cmd_descriptor->ResponseType = SDRT_3;
if((flags & DICMOTE_MMC_RESPONSE_R4) || (flags & DICMOTE_MMC_RESPONSE_SPI_R4))
cmd_descriptor->ResponseType = SDRT_4;
if((flags & DICMOTE_MMC_RESPONSE_R5) || (flags & DICMOTE_MMC_RESPONSE_SPI_R5))
cmd_descriptor->ResponseType = SDRT_5;
if((flags & DICMOTE_MMC_RESPONSE_R6)) cmd_descriptor->ResponseType = SDRT_6;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&start);
*sense =
!DeviceIoControl(ctx->handle, IOCTL_SFFDISK_DEVICE_COMMAND, cmdbuf, cmdbuf_len, cmdbuf, cmdbuf_len, &k, NULL);
QueryPerformanceCounter(&end);
if(*sense) error = GetLastError();
memcpy(buffer, data_buf, buf_len);
free(cmdbuf);
return error;
}