formatdisk.c 3.17 KB

#include "ddwriteint.h"


/*
 * ディスクに書き込んである disk type, load addr, ipl size を
 * 覚えておく
 *  (ユーザが -1 とか指定したときのために)
 */
DDInfo	__ddInfo;

void __ddFormatDisk(DDCmd *command)
{
  u32			result;
  __SystemInfo_s	sys;
  __DefectInfo_s	def;
  u32			formatType;
  s32			doFormat = 0;

  /*
   * Write bad ecc
   */
  result = __ddWriteErrorECC();
  if(result)
  {
    __ddWriteError = (s32)result;
    return;
  }
  
  /*
   * format する必要があるかのチェック。
   * format するのは、FORMAT フラグが立てられている場合と、システム情
   * 報を読んだときにエラー23が出た場合である。
   * format するときは doFormat の値を1にする。
   */
  if (command->flags & DDWRITE_FLG_FORMAT)
    doFormat = 1;
  else
  {
    result = __ddReadSystemBlock(&sys, &def, &formatType);
    
    if ( result == 0 )
      doFormat = 0;
    else if ( result == LEO_ERROR_UNRECOVERED_READ_ERROR )
      doFormat = 1;
    else 
    {
      __ddWriteError = (s32)result;
      return;
    }

  }
  
  if (doFormat)
  {
    /*
     * フォーマットする。
     * 呼び出し側にそのことを通知する(formatHook)
     */
    if ( command->formatHook != (void (*)(void))0 )
      (*command->formatHook)();

    result = __ddReadDefectBlock(&def, &formatType);
    
    if (result)
    {
      __ddWriteError = (s32)result;
      return;
    }
  }
  else
  {
      /*
       * フォーマットする必要はなく、かつ load addr,
       * ipl size, disk type 全てが変更なしの指定であれば、
       * システム領域を書く必要はない
       */
      if ( (command->diskType == -1) &&
	  (command->iplSize == 0) && (command->startLBA != 0) &&
	  (command->loadAddr == 0) )
      {
	  __ddInfo.diskType = (s32)(sys.diskType);
	  __ddInfo.loadAddr = sys.loadAddr;
	  __ddInfo.iplSize = sys.iplSize;

	  if ( command->infoHook != (void (*)(DDInfo *))0 )
	      (*command->infoHook)(&__ddInfo);

	  __ddWriteError = (s32)0;
	  return;
      }
      
  }
  
  
  /*
   * doFormat が立っていない場合は、systemData には現在のディスクから
   * 読み出した情報が入っていることに注意
   */
  
  /*
   * Put the specified values to the buffer
   */
  sys.country = 0;
  
  if (command->diskType != -1)
    sys.diskType = (u32)command->diskType;
  
  if (command->iplSize == 0)
  {
    if (command->startLBA == 0)
    {
      /*
       * getdata が指定されていない場合は writeSize, 指定されている
       * 場合は totalSize がファイルサイズになる。
       */
      if (command->getdata)
	sys.iplSize = (u32)((command->totalSize + 19719) / 19720);
      else
	sys.iplSize = (u32)((command->writeSize + 19719) / 19720);
    }
      
  }
  else
  {
    sys.iplSize	= (u32)command->iplSize;
  }
  
  if (command->loadAddr != 0)
    sys.loadAddr	= command->loadAddr;
  
  /*
   * Write it to the system information block
   */
  result = __ddWriteSystemBlock(&sys, &def, formatType);

  if (result)
  {
    __ddWriteError = (s32)result;
    return;
  }
    
  __ddInfo.diskType = (s32)(sys.diskType);
  __ddInfo.loadAddr = sys.loadAddr;
  __ddInfo.iplSize = sys.iplSize;

  /*
   * diskType, loadAddr, iplSize を呼び出し側に通知する
   */
  if ( command->infoHook != (void (*)(DDInfo *))0 )
      (*command->infoHook)(&__ddInfo);

  __ddWriteError = (s32)0;
  return;

} /* formatDisk() */