mirror of
https://github.com/aaru-dps/aaruremote.git
synced 2025-12-16 19:24:37 +00:00
Implement SDHCI for win32.
This commit is contained in:
31
dicmote.h
31
dicmote.h
@@ -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)
|
||||
|
||||
|
||||
@@ -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})
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user