📄 ata2.h
字号:
#define PHYS_WRITE 1
#define PHYS_ERASE 2
#define RESET 3
#define RESET_AND_LOAD 4
#define READ_ANCHOR_SECTOR 5
#define WRITE_ANCHOR_SECTOR 6
#define READ_PHYS_LONG 7
#define READ_PHYS_LONG_NO_ECC 8
#define READ_LOG_LONG 9
#define READ_LOG_LONG_NO_ECC 10
#define WRITE_PHYS_LONG 11
#define WRITE_PHYS_LONG_NO_ECC 12
#define WRITE_LOG_LONG 13
#define WRITE_LOG_LONG_NO_ECC 14
#define READ_DEVICE_ID_FIRM 15
#define READ_FIRMWARE_VERSION 16
#define READ_UNUSED_BUFFER_BLOCKS 17
#define READ_TEST_REG 18
#define WRITE_TEST_REG 19
#define CALCULATE_FIRMWARE_CRC 20
#define LOG_TO_PHYSICAL 21
#define RESOLVE_TWINS 22
#define FLUSH_IP_CACHE 23
#define ACMD45 100
#define ACMD46 101
#define ACMD47 102
#define ACMD48 103
/*--------------------------------------------------------------------------*/
/* Preformat definitions */
/*--------------------------------------------------------------------------*/
#define ANCHOR_PROGRAM_SIZE 248
// Preformat OpCodes Not present in Firmware
#define READ_DEVICE_ID 5
#define TEST_CARD 6
#define TEST_BUS 7
#define PREFORMAT_CARD 8
#define GET_PARAMETER_BUFFER 8
#define READ_DEFECT_TABLE 9
#define READ_ERROR_REG 10
#define PREF_READ_PHYS 11
#define READ_PHYS_LONG_PREF 12
#define PHYS_ERASE_PREF 13
#define WRITE_SECTOR 14
#define INT1 7
#define DeviceIdOffset 0
#define DeviceSerialOffset 4
#define ErrorRegOffset 508
#define NumberOfChipsOffset 4
#define FEATURE_16BIT (1<<0) // Features of FlashChip
#define NUMBER_OF_DEFECTBLOCK_SECTORS 4
typedef struct
{
unsigned short int DeviceId[16]; // different MAX_CHIPS for .b9 files
unsigned short int ErrorCode[16]; // but only one MAX_CHIPS for Newfmt
unsigned short int Offset[16];
unsigned char IsByte[16];
unsigned char ShouldBeByte[16];
} TestBusParameterType;
extern unsigned char GlobalSectorBuffer[SECTOR_SIZE];
#define Set16BitMode() UpdateMCR(0, (1<<4)+(1<<23))
#define Set8BitMode() UpdateMCR((1<<4)+(1<<23), 0)
/*--------------------------------------------------------------------------*/
/* Variables */
/*--------------------------------------------------------------------------*/
extern unsigned char CommandCode, MinorCommandCode;
extern unsigned char FirmwareVersion[12];
extern unsigned char EnableVendorCommands;
/*--------------------------------------------------------------------------*/
/* Function Prototypes */
/*--------------------------------------------------------------------------*/
extern void StartWriteCommand();
extern void PcmciaInterruptEntry();
extern void MainLoop();
extern void SendCSD(unsigned int *Buffer);
extern void SendCID(unsigned int *Buffer);
extern void SendOCR(unsigned int OCR);
extern void TransferToFPGA(unsigned int *Buffer);
extern void TransferFromFPGA(unsigned int *Buffer);
extern void SetSupervisorMode();
void InitCode();
extern unsigned int FmtInitCode();
extern void LoadOverlay(unsigned char *OverlayPtr,
unsigned int BlockNumber,
unsigned int OverlaySize);
extern unsigned int FillHyperstoneBuffer(unsigned int SectorCount);
extern unsigned int FillHostBuffer();
extern unsigned int WaitDRQ(unsigned int SectorCount);
extern unsigned int PartialReadSectors(unsigned int LogSectorNumber,
unsigned int SectorCount,
unsigned int SectorOffset,
unsigned int SectorLength);
extern unsigned int ReadSectors(unsigned int LogSectorNumber,
unsigned int SectorCount);
#if 1 //def CPRM
extern unsigned int WriteSectors(unsigned int LogSectorNumber,
unsigned int SectorCount,
unsigned int Mode);
#else
extern unsigned int WriteSectors(unsigned int LogSectorNumber,
unsigned int SectorCount);
#endif
#define ERASE_REQUEST (1<<1)
#define EraseSectors(a, b) WriteSectors(a, b, ERASE_REQUEST)
//extern unsigned int EraseSectors(unsigned int LogSectorNumber,
//unsigned int NumberOfSectors);
extern void CheckWearLeveling();
extern void BackGroundEraseAndSleep(unsigned int Event);
extern void BeginOfInitOverlay();
extern void EndOfInitOverlay();
extern void BeginOfOverlay();
extern void SetErrorCode(unsigned int ErrorCode);
extern unsigned int GetEraseSectorNumber();
extern unsigned int GetEraseSectorCount();
extern unsigned int GetSectorNumber();
extern unsigned int GetSectorCount();
extern unsigned int GetSectorOffset();
extern unsigned int GetSectorLength();
extern unsigned int IsWriteProtected();
extern unsigned int ShiftSectorBuffer(unsigned int offset);
extern unsigned int GetSectorsInEraseBlockMMC(unsigned int *CSD);
extern unsigned int GetSectorsInEraseBlockSD(unsigned int *CSD);
extern void PrintTable();
extern unsigned int WriteCSD(unsigned int *CSD);
extern void WaitAndSetOCR();
extern ReadWriteProtectBits(unsigned int LogSectorNumber);
extern void WriteProtectTransAction(unsigned int LogSectorNumber,
unsigned int Set);
extern void SetBuffer (void *dbuf, unsigned int value, unsigned int length);
extern void EndOfWearLeveling();
#if ROM_ACTIVE
extern void SendMMC(unsigned int MMC);
#endif
extern unsigned int clock();
extern unsigned int EraseBlockRom(unsigned int SectorNumber,
unsigned int Flags);
extern void SetBuffer (void *dbuf, unsigned int value, unsigned int length);
extern void CopyBuffer (void *dbuf, void *sbuf, unsigned int length);
extern unsigned int FillHostBufferRom();
extern unsigned int GetSectorsPerBlock();
extern void GetDefectBlock(unsigned char * Buffer, unsigned int Position);
extern void WriteToSectorBuffer(unsigned char *Buf);
extern void ConvParameterBuffer(unsigned char *Buf);
extern unsigned int PreformatCard(unsigned int QuickFlag);
extern unsigned int WriteFirmware();
extern unsigned int WriteAnchorSectorLib();
extern unsigned int WriteLongLib(unsigned int MinorCommandCode,
unsigned int SectorNumber);
extern void ReadUnusedBufferBlocksLib();
extern unsigned int ReadLongLib(unsigned int MinorCommandCode,
unsigned int SectorNumber);
extern unsigned int ReadAnchorSectorLib();
extern void SendSectorBuffer();
extern void GetSectorBuffer();
extern void WaitUntillNoReset();
extern void SendSCR(unsigned int *SCR);
extern unsigned int ReadDeviceID(unsigned int SectorNumber);
extern unsigned char DeviceId1, DeviceId2, DeviceId3, DeviceIdAddress;
extern void SendStatus(unsigned int status);
extern void NewInterrupt();
extern void SendStatus(unsigned int status);
extern unsigned int CheckOTPBits(unsigned int);
#ifdef CPRM
extern void ReadMUK(unsigned char MKBNumber);
extern unsigned int WriteMUKs(unsigned int *MUKs,
unsigned int *c1,
unsigned int *c2);
extern unsigned int PreformatWriteMKB(unsigned int Argument);
extern void EraseLogBlocks(unsigned int Start, unsigned int NumberOfSectors);
extern unsigned int UpdateMKB(unsigned int Step, unsigned int SectorCount);
#endif
extern unsigned int VendorCommands(unsigned int SectorNumber,
unsigned int MinorCommandCode);
extern unsigned int CalcCSizeMult(unsigned int LastSectorNumber);
extern unsigned int TestRegisterRead(unsigned int Address);
extern unsigned int TestRegisterWrite(unsigned int Address,
unsigned int Data);
extern unsigned int WriteSectorLogToFlash(unsigned int SectorNumber,
unsigned int InSecureArea);
extern void ResolveAllTwins(unsigned int FromFlushIPCache);
extern unsigned int LogToPhys1(unsigned int LogSectorNumber, unsigned int Opcode);
extern void WritePBlockTables();
extern void FlushIPCache(void);
extern unsigned short CalculateFirmwareCRC();
extern void WaitUntilAllChipsIdle();
extern void EnterSleepMode(unsigned int WakeEvent);
/*--------------------------------------------------------------------------*/
/* I/O Macros, Other Macros */
/*--------------------------------------------------------------------------*/
#define inp8(portid) \
({ \
register unsigned int dummy; \
\
asm volatile ("LDW.IOA 0, %0, %1" \
: "=r" (dummy) \
: "i" (portid)); \
dummy; \
})
#define inp8r(portid) \
({ \
register unsigned int dummy; \
\
asm volatile ("LDW.IOD %1, %0, 0" \
: "=r" (dummy) \
: "r" (portid)); \
dummy; \
})
#define outpw0(portid) \
asm volatile ("STW.IOA 0, 0, %0" : : "i" (portid));
#define outpw2(portid, value) \
{ \
register unsigned int dummy; \
\
dummy = value; \
asm volatile ("STW.IOA 0, %1, %0" \
: : "i" (portid), "r" (dummy));\
}
#define outpw2r(portid, value) \
{ \
register unsigned int dummy; \
\
dummy = value; \
asm volatile ("STW.IOD %0, %1, 0" \
: : "r" (portid), "r" (dummy));\
}
#define RESET_CARD(ResetType) \
({ register long dummy asm("L15"); \
\
dummy = (long)ResetType; \
asm volatile ("trap 62" \
: /* no outputs */ \
: "l" (dummy) \
: "L15"); \
})
#define DISABLE_INT1() UpdateFCR(1<<28, 0)
#define ENABLE_INT1() UpdateFCR(1<<24, 1<<28)
#define GET_COMMAND_CODE() CommandCode
#define GET_MINOR_COMMANDCODE() MinorCommandCode
#define WRITE_PROTECTED(csd) ((csd[0] & (3 << 12)) != 0)
#define SET_WRITEPROT() UpdateFCR((1<<4) , (1<<5)|(1<<6))
#define CLEAR_WRITEPROT() UpdateFCR((1<<5)|(1<<4), (1<<6))
#define CHIP_AND_BLOCK_NUMBER(SectorNumber) ((SectorNumber) >> SECTOR_BITS)
#define WRITE_BACK_PTR(x,y) x &= 0x0000ffffL, x |= (y)<<16
#define ClearLockFlag() asm volatile ("ANDNI SR, 1 << 15" : : )
#define SetLockFlag() asm volatile ("ORI SR, 1 << 15" : : )
#define FLASH_IDLE (0x800ffff0+(1<<22))
#define OVERLAPPED (1<<0)
#define WITH_ECC (1<<1)
#if defined(NORTK)
#define WriteSectorToFlash(SectorNumber,Buffer, Overhead) \
WriteSector(SectorNumber,Buffer,ChunkTab, \
WITH_ECC|OVERLAPPED|SkipProgram,Overhead)
#define EraseBlock(SectorNumber) EraseBlockRom(SectorNumber,OVERLAPPED|SkipErase)
#else
#define WriteSectorToFlash(SectorNumber,Buffer, Overhead) \
WriteSector(SectorNumber,Buffer,ChunkTab,WITH_ECC|SkipProgram,Overhead)
#define EraseBlock(SectorNumber) EraseBlockRom(SectorNumber,SkipErase)
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -