kernel/eka/drivers/medata/ata.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// e32\drivers\medata\ata.h
// 
//

#include <partitions.h>

#if defined (SELECT_PRIMARY_IO_CONFIG)
//
// ATA Register addresses (for primary)
// 
const TUint KAtaDataRdWr16=0x000001F0;
const TUint KAtaDataRdWr8=0x000001F0;

const TUint KAtaErrorRd8=0x000001F1;
const TUint KAtaFeaturesWr8=0x000001F1;

const TUint KAtaSectorCountRdWr8=0x000001F2;

const TUint KAtaSectorNoRdWr8=0x000001F3;
const TUint KAtaLba7_0RdWr8=0x000001F3;

const TUint KAtaCylinderLowRdWr8=0x000001F4;
const TUint KAtaLba15_8RdWr8=0x000001F4;

const TUint KAtaCylinderHighRdWr8=0x000001F5;
const TUint KAtaLba23_16RdWr8=0x000001F5;

const TUint KAtaSelectDriveHeadRdWr8=0x000001F6;
const TUint KAtaDriveLba27_24RdWr8=0x000001F6;

const TUint KAtaStatusRd8=0x000001F7;
const TUint KAtaCommandWr8=0x000001F7;

#else
//
// ATA Register addresses (for either contiguous I/O or memory mapped)
// 
const TUint KAtaDataRdWr16=0x00000000;
const TUint KAtaDataRdWr8=0x00000000;
const TUint KAtaDataRdWrWinBase16=0x00000400;	// Memory mapped only
const TUint KAtaDataRdWrWinBase8=0x00000400;	// Memory mapped only

const TUint KAtaErrorRd8=0x00000001;
const TUint KAtaFeaturesWr8=0x00000001;

const TUint KAtaSectorCountRdWr8=0x00000002;

const TUint KAtaSectorNoRdWr8=0x00000003;
const TUint KAtaLba7_0RdWr8=0x00000003;

const TUint KAtaCylinderLowRdWr8=0x00000004;
const TUint KAtaLba15_8RdWr8=0x00000004;

const TUint KAtaCylinderHighRdWr8=0x00000005;
const TUint KAtaLba23_16RdWr8=0x00000005;

const TUint KAtaSelectDriveHeadRdWr8=0x00000006;
const TUint KAtaDriveLba27_24RdWr8=0x00000006;

const TUint KAtaStatusRd8=0x00000007;
const TUint KAtaCommandWr8=0x00000007;
#endif

//
// ATA Register addresses (for contiguous I/O or memory mapped)
// 
const TUint KAtaDupEvenDataRdWr8=0x00000008;
const TUint KAtaDupOddDataRdWr8=0x00000009;
const TUint KAtaDupErrorRd8=0x0000000D;
const TUint KAtaDupFeaturesWr8=0x0000000D;
const TUint KAtaAltStatusRd8=0x0000000E;
const TUint KAtaDeviceCtlWr8=0x0000000E;
const TUint KAtaDriveAddressRd8=0x0000000F;

//
// ATA Register bit fields 
// 
// KAtaErrorRd8
const TUint8	KAtaErrorAmnf=0x01;
const TUint8	KAtaErrorAbort=0x04;
const TUint8	KAtaErrorIdnf=0x10;
const TUint8	KAtaErrorUnc=0x40;
const TUint8	KAtaErrorBbk=0x80;

// KAtaSelectDriveHeadRdWr8
// KAtaDriveLba27_24RdWr8
const TUint8	KAtaDrvHeadLba27_24=0x0F;
const TUint8	KAtaDrvHeadDrive1=0x10;
const TUint8	KAtaDrvHeadLbaOn=0x40;

// KAtaStatusRd8
const TUint8	KAtaStatusErr=0x01;
const TUint8	KAtaStatusCorr=0x04;
const TUint8	KAtaStatusDrq=0x08;
const TUint8	KAtaStatusDsc=0x10;
const TUint8	KAtaStatusDwf=0x20;
const TUint8	KAtaStatusRdy=0x40;
const TUint8	KAtaStatusBusy=0x80;

// KAtaDeviceCtlWr8
const TUint8	KAtaDeviceCtlIntDis=0x02;
const TUint8	KAtaDeviceCtlSwRes=0x04;

//
// ATA commands
// 
const TUint8 KAtaCmdIdentifyDrive=0xEC;
const TUint8 KAtaCmdReadSectors=0x20;
const TUint8 KAtaCmdWriteSectors=0x30;
const TUint8 KAtaCmdSetFeatures=0xEF;
const TUint8 KAtaCmdRequestSense=0x03;
const TUint8 KAtaCmdFormatTrack=0x50;
const TUint8 KAtaCmdIdle=0xE3;

//
// Defines for Identify Drive Command
//
const TInt KAtaIdDefaultCylinders=2;			// Offset in bytes
const TInt KAtaIdDefaultHeads=6;			
const TInt KAtaIdDefaultSectorsPerTrack=12;			
const TInt KAtaIdCapabilities=98;			
const TUint16	KAtaIdCapLbaSupported=0x0200;
const TInt KAtaIdTranslationParams=106;		
const TUint16 	KAtaIdTrParamsValid=0x0001;		
const TInt KAtaIdCurrentCylinders=108;		
const TInt KAtaIdCurrentHeads=110;			
const TInt KAtaIdCurrentSectorsPerTrack=112;			
const TInt KAtaIdCurrentTotalSectors=114;			
const TInt KAtaIdTotalSectorsInLba=120;		

//
// Drive parameters
//
class TDriveParameters
	{
public:
	TInt iCylinders;
	TInt iHeads;
	TInt iSectorsPerTrack;
	TInt iSectorsPerCylinder;
	TBool iSupportsLba;
	TInt iTotalSectorsInLba;
	};

const TInt KAtaSectorSize=512;
const TInt KAtaSectorSizeMinusOne=(KAtaSectorSize-1);
const TInt KAtaSectorShift=9;
const TUint KAtaSectorMask=0xFFFFFE00;

const TInt KMaxSectorsPerCmd=256; // Maximum sectors that can be transfered in single command

enum TAtaDriveSelect
	{
	ESelectDrive1=KAtaDrvHeadDrive1,
	ESelectDrive0=0x00
	};