flashsectorerase.c 1.92 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: flashsectorerase.c,v 1.1.1.1 2002/10/29 08:06:43 blythe Exp $
   ---------------------------------------------------------------------*/
/**************************************************************************
 *
 *  $Revision: 1.1.1.1 $
 *  $Date: 2002/10/29 08:06:43 $
 *  $Source: 
 *
 **************************************************************************/

#include	<ultra64.h>
#include        "osint_flash.h"

/* PAGE ERASE */
s32	osFlashSectorErase(u32 page_num)
{
  u32 status;
  OSTimer mytimer;
  OSMesgQueue timerMesgQueue;
  OSMesg  dummy;

  /* Page Erase Reserve*/
  osEPiWriteIo(&__osFlashHandler,(__osFlashHandler.baseAddress|0x10000),0x4b000000|page_num);

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

  /* Timerで12.5ms毎にErase終了かをポーリング (Sector Erase: typ:200ms)*/
  osCreateMesgQueue(&timerMesgQueue, &dummy, 1);
  do {
    osSetTimer(&mytimer,OS_USEC_TO_CYCLES(12500), 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のビットだけでOK */
  if (((status & 0x000000ff) == 0x08) || 
      ((status & 0x000000ff) == 0x48) ||
      ((status & 0x00000008) == 0x08))	
    return 0;
  else
    return -1;
}