📄 doch_ata.h
字号:
FLWord wCurrentCapacityInSectorsLow; /*57*/
FLWord wCurrentCapacityInSectorsHigh; /*58*/
FLByte bMultipleSectorSettingValid; /*59*/
FLByte bMultipleSectorCurrentNumber;
FLWord wTotalNumberOfSectorsLow; /*60*/
FLWord wTotalNumberOfSectorsHigh; /*61*/
FLWord wReserved8; /*was singlewordDMASelect+Support in ATA-2*/
FLByte bMultiwordDMASelected; /*63*/
FLByte bMultiwordDMASupported;
FLByte bReserved9; /*64*/
FLByte bAdvancedPIOsupported;
FLWord wMinDMACycleTimePerWord;
FLWord wRecommndedMinDMACycleTimePerWord;
FLWord wMinPIOCycleTimeWithoutFlowControl;
FLWord wMinPIOCycleTimeWithIORDY;
FLWord wReserved10[6];
FLWord wQueueDepth; /*75 ata-4*/
FLWord wReserved11[4];
FLWord wMajorVersionNumber; /*80*/
FLWord wMinorVersionNumber;
FLWord wCommandSetsupported1; /*82*/
FLWord wCommandSetsupported2;
FLWord wCommandSetFeatureExtension; /*84 ata-4*/
FLWord wCommandSetFeatureEnabled1; /*ata-4*/
FLWord wCommandSetFeatureEnabled2; /*86 ata-4*/
FLWord wCommandSetFeatureDefault; /*ata-4*/
FLByte bUltraDMASelected; /*88 ata-4*/
FLByte bUltraDMASupported;
FLWord wTimeForSecurityEraseCompletion; /*ata-4*/
FLWord wTimeForEnhancedSecurityEraseCompletion; /*90 ata-4*/
FLWord wCurrentAdvancedPowerManagementValue; /*ata-4*/
FLWord wMasterPasswordRevision; /*92 ata-5*/
FLWord wHardwareResetResult; /*ata-5*/
FLWord wReserved12[33];
FLWord wRemovableMediaNotificationSupport; /*127 ata-4*/
FLWord wSecurityStatus; /*128, i.e. 127 words left*/
FLWord wVendorSpecific[31]; /*129-159*/
FLWord wCFApowermode1;
FLWord wCFAreserved[15];
FLWord wCurrentMediaSerialNumber[30];
FLWord wReserved13[49];
FLWord wIntegrityWord;
} DOCH_DriveParameters;
typedef struct {
FLSDword activeMode;
FLSDword inActiveMode;
FLSDword timeOut;
} DOCH_DpdSettings;
/*IDENTIFY DEVICE information bits*/
/*================================*/
/*for generalConfiguration*/
#define GENERAL_CONFIG_ATAPI 0x8000 /*otherwise ATA*/
#define GENERAL_CONFIG_REMOVABLE_MEDIA 0x80 /*otherwise not*/
#define GENERAL_CONFIG_NON_REMOVABLE_DRIVE 0x40 /*and/or device*/
#define GENERAL_CONFIG_RESPONSE_INCOMPLETE 0x04 /*ATA-5*/
/*for specificConfiguration*/
#define DEVICE_REQUIRES_SET_FEATURES_ID_INCOMPLETE 0x37C8
#define DEVICE_REQUIRES_SET_FEATURES_ID_COMPLETE 0x738C
#define DEVICE_NOT_REQUIRE_SET_FEATURES_ID_INCOMPLETE 0x8C73
#define DEVICE_NOT_REQUIRE_SET_FEATURES_ID_COMPLETE 0xC837
/*for capabilities*/
#define CAPABILITY_STANDBY_TIMER_AS_IN_STANDARD 0x2000 /*1<<13*/
#define CAPABILITY_IORDY_SUPPORTED 0x0800 /*1<<11*/
#define CAPABILITY_IORDY_CAN_BE_DISABLED 0x0400 /*1<<10*/
#define CAPABILITY_MUST 0x0300 /*just must be*/
/*for capabilities2*/
#define CAPABILITY2_MUST 0x4000
#define CAPABILITY2_DEVICE_HAS_STANDBY_TIMER_MINIMUM 0x0001
/*for wordSupported*/
#define FIELDS54_58_VALID 1 /*geometry*/
#define FIELDS64_70_VALID 2 /*timing*/
#define FIELD88_VALID 4 /*ATA-4: Ultra-DMA modes*/
/*for multipleSectorSetting*/
/*#define MULTI_SECTOR_SETTING_CORRECT 0x100*/
/*for multiwordDma*/
#define MULTI_WORD_DMA_0 1
#define MULTI_WORD_DMA_1 2
#define MULTI_WORD_DMA_2 4 /*ATA-4*/
/*dma 'selected' - one bit*/
/*dma 'supported' - also one bit, but with ATA-4/5 it MUST support*/
/*all modes below. AND must have their bits in 1 too.*/
/*for advancedPIOsupported; 1 for pio3 3 for pio4*/
#define ADVANCED_PIO_3_SUPPORTED 1
#define ADVANCED_PIO_4_SUPPORTED 2
/*for majorVersionNumber*/
#define SUPPORTS_ATA_1 2
#define SUPPORTS_ATA_2 4
#define SUPPORTS_ATA_3 8
#define SUPPORTS_ATA_4 0x10
#define SUPPORTS_ATA_5 0x20
/*for minorVersionNumber*/
#define ATA3_PUBLISHED 0x0A
#define ATA_ATAPI4_PUBLISHED 0x12
#define ATA_ATAPI5_PUBLISHED 0x18
/*#error download last draft & find out!*/
/*for commandSetsupported1, commandSetFeatureEnabled1*/
#define SUPPORTS1_SMART 0x01
#define SUPPORTS1_SECURITY 0x02
#define SUPPORTS1_REMOVABLE 0x04
#define SUPPORTS1_POWER_MANAGEMENT 0x08
#define SUPPORTS1_PACKET_COMMAND 0x10 /*ATA-4. ATA-5: must be zero*/
#define SUPPORTS1_WRITE_CACHE 0x20 /*ATA-4*/
#define SUPPORTS1_LOOK_AHEAD 0x40 /*ATA-4*/
#define SUPPORTS1_RELEASE_INTERRUPT 0x80 /*ATA-4*/
#define SUPPORTS1_SERVICE_INTERRUPT 0x100 /*ATA-4*/
#define SUPPORTS1_DEVICE_RESET_CMD 0x200 /*ATA-4*/
#define SUPPORTS1_HOST_PROTECTED_AREA_FEATURE 0x400 /*ATA-4*/
#define SUPPORTS1_WRITE_BUFFER 0x1000 /*ATA-4*/
#define SUPPORTS1_READ_BUFFER 0x2000 /*ATA-4*/
#define SUPPORTS1_NOP 0x4000 /*ATA-4*/
/*1<<11 obsolete*/
/*1<<15 obsolete*/
/*for commandSetsupported2, commandSetFeatureEnabled2*/
#define SUPPORTS2_MUST 0x4000
#define SUPPORTS2_DOWNLOAD_MICROCODE 0x01 /*ATA-4*/
#define SUPPORTS2_READ_WRITE_DMA_QUEUED 0x02 /*ATA-4*/
#define SUPPORTS2_CFA_FEATURE 0x04 /*ATA-4*/
#define SUPPORTS2_ADVANCED_POWER_MANAGEMENT 0x08 /*ATA-4*/
#define SUPPORTS2_REMOVABLE_MEDIA_NOTIFICATION 0x10 /*ATA-4*/
#define SUPPORTS2_POWERUP_IN_STANDBY 0x20 /*ATA-5*/
#define SUPPORTS2_NEEDS_SET_FEATURES_TO_SPIN 0x40 /*ATA-5*/
#define SUPPORTS2_ADDRESS_OFFSET_RESERVED_BOOT 0x80 /*ATA-5*/
#define SUPPORTS2_SET_MAX_SECURITY_EXTENSION 0x100 /*ATA-5*/
/*for commandSetFeatureExtension, commandSetFeatureDefault*/
#define CMDSET_EXTENSION_MUST 0x4000
/*for ultraDma*/
#define ULTRA_DMA_0 1
#define ULTRA_DMA_1 2
#define ULTRA_DMA_2 4
#define ULTRA_DMA_3 8 /*ATA-5*/
#define ULTRA_DMA_4 0x10 /*ATA-5*/
/*selected: one, supported: one and below*/
/*for hardwareResetResult (ATA-5)*/
#define HARDRESET_RESULT_MUST 0x4101
#define HARDRESET_CBLID_ABOVE_VIH 0x2000
#define HARDRESET_DEVICE_0_JUMPER 0x02
#define HARDRESET_DEVICE_0_CSEL 0x04
#define HARDRESET_DEVICE_0_OTHER 0x06
#define HARDRESET_DEVICE_0_PASSED_DIAGNOSTICS 0x08
#define HARDRESET_DEVICE_0_DETECTED_PDIAG 0x10
#define HARDRESET_DEVICE_0_DETECTED_DASP 0x20
#define HARDRESET_DEVICE_0_RESPONDS_FOR_1 0x40
#define HARDRESET_DEVICE_1_JUMPER 0x200
#define HARDRESET_DEVICE_1_CSEL 0x400
#define HARDRESET_DEVICE_1_OTHER 0x600
#define HARDRESET_DEVICE_1_ASSERTED_PDIAG 0x800
/*for removableMediaNotificationSupport*/
#define REMOVABLE_MEDIA_STATUS_NOTIFICATION_SUPPORTED 1
/*for securityStatus*/
#define SECURITY_MAXIMUM 0x100 /*otherwise HIGH*/
#define SECURITY_ENCHANCED_ERASE_SUPPORTED 0x20 /*ATA-4*/
#define SECURITY_COUNT_EXPIRED 0x10
#define SECURITY_FROZEN 0x08
#define SECURITY_LOCKED 0x04
#define SECURITY_ENABLED 0x02
#define SECURITY_SUPPORTED 0x01
typedef struct {
FLByte bReserved[0x200];
} DOCH_DeviceAttributes;
/* long-word-aligned buffer */
typedef union { unsigned char cbuf [DOCH_SECTOR_SIZE];
unsigned short sbuf [DOCH_SECTOR_SIZE / sizeof(short)];
unsigned long lbuf [DOCH_SECTOR_SIZE / sizeof(long)];
} DOCH_Buf;
#define DOCH_CHIP_ID_H3 0x4833
#define DOCH_CHIP_ID_H4 0x4834
#define DOCH_CHIP_ID_H5 0x4835
/* Runtime configuration flags*/
/*DOCH Flags Offsets*/
#define DOCH_FLAGSO_USE_CHS 0
#define DOCH_FLAGSO_USE_DMA_READ 1
#define DOCH_FLAGSO_USE_DMA_WRITE 2
#define DOCH_FLAGSO_USE_INTERRUPT 3
/*DOCH Flags Bits*/
#define DOCH_FLAGSB_USE_CHS 0x00000001 /* use Cyl/Head/Sector block addressing */
#define DOCH_FLAGSB_USE_DMA_READ 0x00000002 /* use h/w DMA when reading sectors */
#define DOCH_FLAGSB_USE_DMA_WRITE 0x00000004 /* use h/w DMA when writing sectors */
#define DOCH_FLAGSB_USE_INTERRUPT 0x00000008 /* use DOCH interrupt */
/* single DOCH device */
typedef struct {
DOCH_DriveParameters driveParameters; /* ATA::IDENTIFY DEVICE data */
FLWord wNumOfPartitions;
FLWord ETFFS_Identified; /*ETFFS exists on device*/
FLDword flags;
FLDword dwMulti_MAX;
FLDword dwSpare1;
FLDword dwMulti_Current;
DOCH_TransferMode dataTransferMode;
} DOCH;
typedef struct {
volatile FLByte * bRegBase;
FLByte bAtaDevNum; /* Indicates which ATA device to send command to (0..1)*/
FLDword dwPhysicalAddress; /* NOT USED, returned by the SDK by a specific API */
FLWord wSocketNo; /* [0.. DOCH_MAX_SOCKETS-1] */
FLMutex mutex; /* Mutex for the socket*/
FLBoolean bUseInterrupt; /* Wait on interrupt */
FLBoolean bUseDMA; /* Use DMA for current data xfer */
FLBoolean bUseBurst; /* Use Burst for current data xfer */
FLWord wNumOfDevices; /* 2 if device #1 exists */
FLNative nTotalCapacity;
FLWord wTotalNumOfPartitions; /* In both devices */
DOCH_PartitionAttr partitionAttr[DOCH_MAX_PARTITIONS]; /* Partitions attributes */
FLWord wLastPartitionSpanned; /* Last partition of device #0 spans to device #1 */
DOCH device[ATA_MAX_NUM_OF_DEVICES]; /* ATA device #0, #1 */
DOCH_HALRoutnies halRoutines; /* HAL routines structure*/
DOCH_PartitionSpanData sSpanData; /*Span data as retrieved from Device User Attributes sector*/
} DOCH_Socket;
/* structure that holds addressing data (CHS/LBA) */
typedef struct {
FLByte bSecNum;
FLByte bCylLow;
FLByte bCylHi;
FLByte bDevHead;
} Addressing_Values_s;
#ifdef __cplusplus
extern "C" {
#endif
extern DOCH_Socket sockets [DOCH_MAX_SOCKETS];
#define DOCH_get_socket(pdev, socketNo) \
if(socketNo > (DOCH_MAX_SOCKETS-1)) \
pdev = NULL; \
else \
pdev = &sockets[socketNo];
/* API routines */
extern DOCH* DOCH_get_disk(FLSNative socketNo, FLSNative devNum);
extern DOCH_Error doch_init_window (FLSNative socketNo, DOCH_InitSocket initSocket);
extern DOCH_Error doch_init_socket (FLSNative socketNo, DOCH_InitSocket);
extern DOCH_Error doch_get_flags (FLSNative socketNo, FLSNative devNum, FLDword* flags);
extern DOCH_Error doch_set_flags (FLSNative socketNo, FLSNative devNum, FLDword flags);
extern DOCH_Error doch_command (FLSNative socketNo, FLSNative devNum, DOCH_Registers* in_regs, DOCH_Registers* out_regs, void* buf, FLNative secNum);
extern DOCH_Error doch_reset (FLSNative socketNo, FLSNative devNum, FLBoolean waitOnBusy);
extern DOCH_Error doch_setTransferMode (FLSNative socketNo, FLSNative devNum, DOCH_TransferMode tm, FLDword drqSize);
extern DOCH_TransferMode doch_getTransferMode (FLSNative socketNo, FLSNative devNum);
extern DOCH_Error doch_setConfigReg16(IOreq* ioreq, FLDword registerOffset, FLNative registerValue);
extern FLWord doch_getConfigReg16(IOreq *ioreq, FLSNative registerOffset);
extern DOCH_Error DOCH_init_config_regs(IOreq *ioreq);
extern DOCH_Error clearATAInterrupt(FLSNative socketNo);
extern DOCH_Error doch_ata_passthru ( FLSNative socketNo,
FLSNative devNum,
DOCH_PassThru_Op ptOP,
DOCH_Registers * in_regs,
DOCH_Registers * out_regs,
void * buf,
FLNative secNum
);
extern DOCH_Error update_device_info(DOCH_Socket* pdev,
DOCH_DeviceInfo* diskOnChipDeviceInfo,
int devNum);
extern DOCH_Error dochEnableATAInterrupt (FLDword socketNum, FLBoolean enable, FLByte type);
DOCH_Error dochCheckPFSymptom(FLSNative socketNo, FLByte devNum, FLBoolean beforOrAfterCommand /* Used for debug prints */);
#define WAIT_FOR_UPLOAD_MAX_CYCLES 100
#ifdef __cplusplus
}
#endif
#endif /* DOCH_ATA_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -