flashwritearray.c 2.1 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.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"

/* WRITE ARRAY */
s32	osFlashWriteArray(u32 page_num)
{
  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;
}