⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doch_ata.h

📁 H3 M-system NAND flash driver in Linux OS, M-DOC driver
💻 H
📖 第 1 页 / 共 2 页
字号:

	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 + -