NT4/private/ntos/miniport/mitsumi/mitsumi.h
2020-09-30 17:12:29 +02:00

146 lines
3.6 KiB
C

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
mitsumi.h
Abstract:
Author:
Revision History:
--*/
#include "scsi.h"
typedef struct _REGISTERS {
UCHAR Data;
UCHAR Status;
UCHAR Control;
UCHAR Reset;
} REGISTERS, *PREGISTERS;
//
// Control signals
//
#define DTEN 0x02
#define STEN 0x04
typedef struct _CMD_PACKET {
UCHAR OperationCode;
UCHAR Parameters[6];
UCHAR ParameterLength;
} CMD_PACKET, *PCMD_PACKET;
//
// Drive version identifiers
//
typedef enum _DRIVE_TYPE{
LU005,
FX001,
FX001D
} DRIVE_TYPE, *PDRIVE_TYPE;
//
// Status register codes.
//
#define STATUS_CMD_ERROR 0x01
#define STATUS_AUDIO 0x02
#define STATUS_READ_ERROR 0x04
#define STATUS_DISC_TYPE 0x08
#define STATUS_SPIN_UP 0x10
#define STATUS_MEDIA_CHANGE 0x20
#define STATUS_DISC_IN 0x40
#define STATUS_DOOR_OPEN 0x80
//
// Audio State status
//
#define AUDIO_STATUS_PLAYING 0x11
#define AUDIO_STATUS_PAUSED 0x12
#define AUDIO_STATUS_SUCCESS 0x13
#define AUDIO_STATUS_ERROR 0x14
#define AUDIO_STATUS_NO_STATUS 0x15
//
// Command code indexes.
//
//#define OP_SPIN_UP
#define OP_SPIN_DOWN 0xF0
#define OP_READ_STATUS 0x40
#define OP_EJECT 0xF6
#define OP_LOAD 0xF8
#define OP_SET_DRV_MODE 0x50
#define OP_READ_PLAY 0xC0
#define OP_READ_PLAY_DBL 0xC1
#define OP_PREVENT_ALLOW_REMOVAL 0xFE
#define OP_PAUSE 0x70
#define OP_REQUEST_SENSE 0x30
#define OP_READ_DRIVE_ID 0xDC
#define OP_MODE_SENSE 0xC2
#define OP_READ_SUB_CHANNEL 0x20
#define OP_READ_TOC 0x10
#define OP_READ_SESSION 0x11
//
// Error codes from Request Sense command.
//
#define NO_ERROR 0x00
#define MODE_ERROR 0x01
#define ADDRESS_ERROR 0x02
#define FATAL_ERROR 0x03
#define SEEK_ERROR 0x04
#define LBA_TO_MSF(Cdb,Minutes,Seconds,Frames) \
{ \
PCDB convertCdb = (Cdb); \
ULONG lba; \
lba = (ULONG)(convertCdb->CDB10.LogicalBlockByte0 * 0x1000000 + \
convertCdb->CDB10.LogicalBlockByte1 * 0x10000 + \
convertCdb->CDB10.LogicalBlockByte2 * 0x100 + \
convertCdb->CDB10.LogicalBlockByte3 + 150 \
); \
(Minutes) = (UCHAR)(lba / (60 * 75)); \
(Seconds) = (UCHAR)((lba % (60 * 75)) / 75); \
(Frames) = (UCHAR)((lba % (60 * 75)) % 75); \
}
#define MSF_TO_LBA(Minutes,Seconds,Frames) \
(ULONG)((60 * 75 * (Minutes)) + (75 * (Seconds)) + ((Frames) - 150))
#define BCD_TO_DEC(x) ( ((x) >> 4) * 10 + ((x) & 0x0F) )
#define DEC_TO_BCD(x) ( (((x) / 10) << 4) + ((x) % 10) )
#define ReadStatus(DevExtension,BaseIoAddress, Status)\
{\
Status = WaitForSTEN(DevExtension);\
if (Status != 0xFF) {\
ScsiPortWritePortUchar(&BaseIoAddress->Control, 0x04);\
Status = ScsiPortReadPortUchar(&BaseIoAddress->Data);\
DevExtension->DriveStatus = Status;\
ScsiPortWritePortUchar(&BaseIoAddress->Control, 0x0C);\
}\
}
#define SUCCESS(Status)\
(((Status & (STATUS_CMD_ERROR | STATUS_READ_ERROR | STATUS_MEDIA_CHANGE | STATUS_DOOR_OPEN)) == 0) && (Status & (STATUS_DISC_IN | STATUS_SPIN_UP)))