flashallerase.c 2.13 KB
/*---------------------------------------------------------------------
        Copyright (C) 1998 Nintendo.
        
        File            flash.c
        Coded    by     Atushi Watanabe. Dec  1, 1998.
        Modified by     Atushi Watanabe. Apr 4, 2000.
        Comments        1M Flash ROM access functions(Ver.7.6)
   
 	$Id: flashallerase.c,v 1.2 2003/03/26 02:00:13 blythe Exp $
   ---------------------------------------------------------------------*/
/**************************************************************************
 *
 *  $Revision: 1.2 $
 *  $Date: 2003/03/26 02:00:13 $
 *  $Source: 
 *
 **************************************************************************/

#include	<ultra64.h>
#include        "osint_flash.h"
#ifdef BBPLAYER
#include	"bbint.h"
#endif

/* ALL ERASE */
s32	osFlashAllErase(void)
{
#ifdef BBPLAYER
  if (__osBbFlashSize) {
      int i;
      u32* p = __osBbFlashAddress;
      for(i = 0; i < __osBbFlashSize/4; i++)
	p[i] = 0xffffffff;
      return 0;
  } else
      return -1;
#else
  u32	status;
  OSTimer mytimer;
  OSMesgQueue timerMesgQueue;
  OSMesg  dummy;

  /* All Erase Reserve */
  osEPiWriteIo(&__osFlashHandler,(__osFlashHandler.baseAddress|0x10000),0x3c000000);
  /* Erase Start */
  osEPiWriteIo(&__osFlashHandler,(__osFlashHandler.baseAddress|0x10000),0x78000000);

  /* Timerで15ms毎にErase終了かをポーリング (Sector Erase: typ:300ms)*/
  osCreateMesgQueue(&timerMesgQueue, &dummy, 1);
  do {
    osSetTimer(&mytimer,OS_USEC_TO_CYCLES(15000), 0, 
	       &timerMesgQueue,&dummy);
    (void)osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK);
    osEPiReadIo(&__osFlashHandler,__osFlashHandler.baseAddress,&status);
  } while((status & 0x00000002) == 0x02);

  /* 再リード(Status の全bitが立つまでタイムラグがあるため) */
  osEPiReadIo(&__osFlashHandler,__osFlashHandler.baseAddress,&status);

  /* 割り込みありバージョンへの対応のためステータスクリア */
  osFlashClearStatus();

  /* 本来は 0x08または0x48が正しいが、試作版では0x08のbitだけでOK */	
  if (((status & 0x000000ff) == 0x08) || 
      ((status & 0x000000ff) == 0x48) ||
      ((status & 0x00000008) == 0x08))
    return 0;
  else
    return -1;
#endif
}