flashwritearray.c 2.38 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: flashwritearray.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

/* WRITE ARRAY */
s32	osFlashWriteArray(u32 page_num)
{
#ifdef BBPLAYER
  if (__osBbFlashSize && page_num*128+128 <= __osBbFlashSize) {
      extern u8 __osBbFlashBuffer[];
      bcopy(__osBbFlashBuffer, __osBbFlashAddress+page_num*128, 128);
      return 0;
  } else
    return -1;
#else
  u32	status;
  OSTimer mytimer;
  OSMesgQueue timerMesgQueue;
  OSMesg  dummy;

  /* MXのB,Dバージョンと松下フラッシュのみ 
     Set Read Buffer(Buffer Access Mode) を実行 */
  if (__osFlashVersion == NEW_FLASH)
    osEPiWriteIo(&__osFlashHandler,(__osFlashHandler.baseAddress|0x10000),0xb4000000);
  
  /* Write Start */
  osEPiWriteIo(&__osFlashHandler,(__osFlashHandler.baseAddress|0x10000),0xa5000000|page_num);
  
  /* Status Read */
  /* In Progress Program bit(AD0) が立っている間は待つ*/
  /* Timerで 0.2ms毎にWriteArray終了かをポーリング (Write Array: typ:3ms)*/
  osCreateMesgQueue(&timerMesgQueue, &dummy, 1);
  do {
    osSetTimer(&mytimer,OS_USEC_TO_CYCLES(200), 0, 
	       &timerMesgQueue,&dummy);
    (void)osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK);
    osEPiReadIo(&__osFlashHandler,__osFlashHandler.baseAddress,&status);
  } while((status & 0x00000001) == 0x01);

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

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

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