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

📄 ata.c

📁 Utils and test SD card read write cycles
💻 C
📖 第 1 页 / 共 3 页
字号:
#if RTK
  CLEAR_HY_RESET();
  SendMMC(2);  // 2 = SD Card
               // 1 = MMC Card
  InitUserTrap(17, &SetSupervisorMode);
  asm volatile ("TRAP 17");
#endif 

  InitCode();
  MMCInitCode();
  WaitUntillNoReset();
  SendCID(CID);
  SendCSD(CSD);
  SendOCR(0x80ff8000);                // set OCR-Register: Ready & VoltageRange
  ENABLE_INT1();
  MainLoop();
}

/*===========================================================================*/
/* MMCInitCode                                                            */
/*===========================================================================*/

static void MMCInitCode()
{
  DISABLE_FSMS();
  CLEAR_HY_CMD();
  CLEAR_HY_READ();
  CLEAR_HY_WRITE();
  CLEAR_HY_CLEAR();
  CLEAR_HY_STOP();
  CLEAR_HY_AGAIN();
  CLEAR_HY_DEBUG_CMD();
  CLEAR_HY_DEBUG_RES();
  CLEAR_WRITEPROT();
  CLEAR_DUMMY();
}

#if RTK
/*===========================================================================*/
/* InitDrivers                                                               */
/*===========================================================================*/

void InitDrivers()
{
  CreateTask (&PcmciaDriverTCB);
  CreateTask (&FlashReadyTCB);
}

void MakeIRAMTrapTable()
{
unsigned int *SRAMTrapTable = (unsigned int *)0x40000000;
unsigned int *IRAMTrapTable = (unsigned int *)0xc0000000;
unsigned int i, TrapTableInstruction;
register int GReg7 asm("G7");

  IRAMTrapTable[0] = 0;
  memcpy(&IRAMTrapTable[1], &SRAMTrapTable[1], 508);
  for (i=2; i<128; i++)
    {
      TrapTableInstruction = IRAMTrapTable[i] >> 16;
      if ((TrapTableInstruction == 0x6903) ||  // addi
	  (TrapTableInstruction == 0x6902) ||  // addi
	  (TrapTableInstruction == 0xfc80))    // br
	IRAMTrapTable[i] = ((SRAMTrapTable[i] & 0xffff) +
			   (unsigned int)&SRAMTrapTable[i+1])-GReg7;
	IRAMTrapTable[i] &= 0x00007fff;
	IRAMTrapTable[i] |= 0x18070000;        // sum pc, g7, const
    }
  UpdateMCR((3<<12), (4<<12));	// relocate trap table to IRAM
}

unsigned int InitIRAMTrap(unsigned int TrapNumber,
			  void *Address)
{
unsigned int *IRAMTrapTable = (unsigned int *)0xc0000000;
unsigned int EntryAddress = (unsigned int)Address;
register int GReg7 asm("G7");
register int GReg8 asm("G8");

  if ((EntryAddress - (unsigned int)&IRAMTrapTable[64-TrapNumber]) < 64*1024)
    {
      IRAMTrapTable[63-TrapNumber] = 0x69020000 +  // addi pc, const
	(EntryAddress - (unsigned int)&IRAMTrapTable[64-TrapNumber]);
      return 1;
    }
  if (((EntryAddress - GReg7) < 14*1024) ||
      ((GReg7 - EntryAddress ) <= 14*1024))
    {
      IRAMTrapTable[63-TrapNumber] = 0x18070000 +  // sum pc, g7, const
	((EntryAddress - GReg7) & 0x7fff);
      return 1;
    }
  if (((EntryAddress - GReg8) < 14*1024) ||
      ((GReg8 - EntryAddress ) <= 14*1024))
    {
      IRAMTrapTable[63-TrapNumber] = 0x18080000 +  // sum pc, g8, const
	((EntryAddress - GReg8) & 0x7fff);
      return 1;
    }
  return 0;
}
#endif
/*===========================================================================*/
/* InitCode                                                                  */
/*===========================================================================*/
#if RTK
void InitCode()
{
  EventFlags = 0;
  InitUserTrap(18, &MyOwnWaitGuard);
  InitUserTrap(19, &MyOwnWaitGuardMax);
  InitUserTrap(20, &FlashTrap);
  InitUserTrap(21, &FlashIdle1TrapEntry);
  asm volatile ("ORI  SR,$20");
  asm volatile ("MOVI TPR,14<<16");

  UpdateBCR((15<<20), 0);
  UpdateMCR((1<<9), 0);      // Mem1BusHoldBreak disable

  UpdateBCR(0, (7<<11));
  UpdateBCR((1<<24)+0, (14<<24)|15);  /* Mem2: 0 setup, 2 access, 0 hold */
  UpdateBCR((1<<23), 0);              /* Mem1: 1 hold */
  /* settings for pads on hyFlash bus */
//  UpdateMCR((3<<4), 0);
  UpdateMCR(3<<24, 0);       /* Output RailToRail, Input According 5.0V */
/*  printf("BCR:%08X MCR:%08X FCR:%08X\n", GetBCR(), GetMCR(), GetFCR()); */
//  BCRShadow = GetBCR();
//  UpdateFCR(0 << 0, 1<<3);  /* switch to slow frequency */
  UpdateFCR(7 << 0, 1<<6);  /* IO1 input, interrupt disabled */
			    /* IO2 output, no Write Protect,
			       interrupt disabled */
  BCRShadow = GetBCR();
  MCRShadow = GetMCR();
  FCRShadow = GetFCR();

  InitDrivers();
  MakeIRAMTrapTable();
  if (!InitIRAMTrap(17, &SetSupervisorMode))
    printf("Cannot install interrupt 17\n");
  if (!InitIRAMTrap(18, &MyOwnWaitGuard))
    printf("Cannot install interrupt 18\n");
  if (!InitIRAMTrap(19, &MyOwnWaitGuardMax))
    printf("Cannot install interrupt 19\n");
  if (!InitIRAMTrap(20, &FlashTrap))
    printf("Cannot install interrupt 20\n");
  if (!InitIRAMTrap(21, &FlashIdle1TrapEntry))
    printf("Cannot install interrupt 21\n");
  if (!InitIRAMTrap(49, &FlashReadyInterruptEntry))
    printf("Cannot install interrupt 49\n");
  if (!InitIRAMTrap(53, &PcmciaInterruptEntry))
    printf("Cannot install interrupt 53\n");
  UpdateFCR(1<<26, 1<<26);  /* toggle Interrupt3polarity */
  UpdateBCR((0<<24)+1, (15<<24)|14);  /* Mem2: 0 setup, 1 access, 1 hold */
  //UpdateBCR((1<<24)+1, (14<<24)|14);  /* Mem2: 0 setup, 2 access, 1 hold */
  FCRShadow = GetFCR();
  return; 
}

#else

void InitCode()
{
#if !FLASH_POWEROFF && LED
  ENABLE_INT4();
#endif
  UpdateFCR(7 << 0, 1<<6);  /* IO1 input, interrupt disabled */
			    /* IO2 output, no Write Protect */
  UpdateFCR(1<<26, 1<<26);  /* toggle Interrupt3polarity */
  EventFlags = 0;
  OverlappedFlags = 0;
  UpdateBCR(0,3 | (1<<14) | (3<<16)); 
    // Set MEM2 Timing, 0 Setup, 1 Access, 0 Hold
  return;
}
#endif

/*===========================================================================*/
/* CycleTest macros                                                          */
/*===========================================================================*/

#define BUFFER_LOAD_BIT(x)              (x & (1<<4))
#define DO_NOT_READ_AND_VERIFY_BIT(x)   (x & (1<<5))
#define USE_ECC_BIT(x)                  (x & (1<<6)) // default is: ECC not in use

// (1<<9) reserved
#define ALL_ERRORS_BIT(x)               (x & (1<<10))
#define UNKNOWN_ERROR_BIT(x)            (x & (1<<11))
#define ERASE_FAILURE_ERROR_BIT(x)      (x & (1<<12))
#define PROGRAM_FAILURE_ERROR_BIT(x)    (x & (1<<13))
#define DIFF_ERROR_BIT(x)               (x & (1<<14))
#define HALT_ON_ERROR_BIT(x)            (x & (1<<22))

#define BUFFER_INDEX(x)                 ((x>>1) & 0x00000007)
#define ERROR_COUNT_LIMIT(x)            ((x>>18) & 0x00000007)


static unsigned int RegisterCycError(unsigned int page, unsigned char errorCode)
{
    if (++CyclingErrors == MAX_CYC_ERRORS)
    {
        return (1);
    }
    cycErrorArray[CyclingErrors].cycle         = TotalCycles;
    cycErrorArray[CyclingErrors].eraseSector   = page >> 5; // translate page to EG number
    cycErrorArray[CyclingErrors].errorCode     = errorCode;
    return (0);
}

/*===========================================================================*/
/* CycleTest      @yona                                                 */
/*===========================================================================*/

static void CycleTest()
{
    unsigned int Overhead;
    unsigned int Argument;
    
    Overhead = 0;
    WRITE_BACK_PTR(Overhead, 0);
    Argument = READ_ADDRESS();
    StartBlock     = (*(unsigned int *) (SECTOR_BUFFER)) + LOG_TO_PHYS;
    NumberOfBlocks =  *(unsigned int *) (SECTOR_BUFFER + 4);
    NumberOfCycles =  *(unsigned int *) (SECTOR_BUFFER + 8);
#if RTK
    printf("cmd56 Argument = 0x%X\n", Argument);
    printf("StartBlock = 0x%X\n", StartBlock);
    printf("NumberOfBlocks = %d\n", NumberOfBlocks);
    printf("NumberOfCycles = %d\n", NumberOfCycles);
#endif

    ErrorSector = 0xFFFFFFFF;
    TotalCycles = 0;

    // load a new buffer (actually - save it in the program buffer)
    // assumption: the host sends the buffers sequentially and it is saved
    // in an incremental order
    if (BUFFER_LOAD_BIT(Argument))
    {
        if (MaxBufferIndex == MAX_CYCLING_BUFFERS)
        {
            // all the buffers are full
            ErrorSector = CYC_ERROR_BUFFERS_FULL;
            // and return TotalCycles=0 and ErrorSector as above
        }
        else
        {
            for (index=0; index<512; index++)
                cycBuffer[MaxBufferIndex][index] = *(SECTOR_BUFFER + index);
            // and return TotalCycles=0 and ErrorSector=0xFFFFFFFF
        }
        MaxBufferIndex++;    
        return;     
    }

//    ReadSectorFromFlash(PatternBlock, SECTOR_BUFFER); no need any more

    while ( TotalCycles < NumberOfCycles )
    {
        if ( EVENT(STOP_EVENT) )
        {
            RESET_EVENT(STOP_EVENT);
            break;
        }

        for ( index=0; index<NumberOfBlocks; index+=32 )    
        {
            if (EraseBlock(StartBlock+index))    // erase 32 pages, an EG
               if (RegisterCycError(StartBlock + index - LOG_TO_PHYS, CYC_ERROR_PROGRAM))
                   return;
        }

        if ( EVENT(STOP_EVENT) )
        {
            RESET_EVENT(STOP_EVENT);
            break;
        }

        for ( index=0; index<NumberOfBlocks; index++ )
            WriteSectorToFlash(StartBlock+index, cycBuffer[0], Overhead);
            // WriteSectorToFlash(StartBlock+i, SECTOR_BUFFER, Overhead);

        if ( EVENT(STOP_EVENT) )
        {
            RESET_EVENT(STOP_EVENT);
            break;
        }

        if ( ! PROGRAM_FAILURE_ERROR_BIT(Argument) )
        {
            for ( index=0; index<NumberOfBlocks; index++ )
            {
                if (ReadSectorFromFlash(StartBlock+index, EraseSectorBuffer))
                    if (RegisterCycError(StartBlock+index-LOG_TO_PHYS, CYC_ERROR_READ))
                        return;

                // compare the two buffers
                if ( CheckSector((unsigned int *) EraseSectorBuffer, (unsigned int *) cycBuffer[0]) == ERROR )
                    if (RegisterCycError(StartBlock+index-LOG_TO_PHYS, CYC_ERROR_COMPARE))
                        return;
            }
        }
        TotalCycles++;
    }
} // end of CycleTest

/*===========================================================================*/
/* CycleTestRead                                                             */
/*===========================================================================*/

static void CycleTestRead()
{
    unsigned int i, Argument;

    Argument = READ_ADDRESS();

    // a buffer unload (read a program buffer and send it to the host)
    if (BUFFER_LOAD_BIT(Argument))
    {
        if (BUFFER_INDEX(Argument) < MaxBufferIndex )
        {
            for (i=0; i<512; i++)
                cycBuffer[BUFFER_INDEX(Argument)][i] = *(SECTOR_BUFFER + i);
            // and return TotalCycles=0 and ErrorSector=0xFFFFFFFF

        }
        else
        {
            // all the buffers are full
            ErrorSector = CYC_ERROR_BUFFER_INDEX_EXCEED;
            // and return TotalCycles=0 and ErrorSector as above
        }
    } // end of new buffer to load

    * (unsigned int *) SECTOR_BUFFER = TotalCycles;
    * (unsigned int *) (SECTOR_BUFFER+4) = ErrorSector;

} // end of CycleTestRead

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -