
// optflash.c

static const UINT32 first_free_address[NUMBER_OF_FLASH_ID] =
{
    INTEL_28F400_B_FIRST_FREE_ADDRESS,
    INTEL_28F800_B_FIRST_FREE_ADDRESS,
    INTEL_28F800_B3_FIRST_FREE_ADDRESS,
	SHARP_28F160_S3H_FIRST_FREE_ADDRESS,
 	SHARP_28F800_BGH_FIRST_FREE_ADDRESS,
	SHARP_LRS1329_FIRST_FREE_ADDRESS,
	SHARP_LRS1336_FIRST_FREE_ADDRESS,
	SHARP_LRS1350A_FIRST_FREE_ADDRESS,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	AMD_AM29DL800BB_FIRST_FREE_ADDRESS,
    AMD_AM29LV160BB_FIRST_FREE_ADDRESS,
    AMD_AM29DL323CB_FIRST_FREE_ADDRESS,
    AMD_AM29DL323CT_FIRST_FREE_ADDRESS,
	FUJITSU_29DL161TD_FIRST_FREE_ADDRESS,
	FUJITSU_29DL161BD_FIRST_FREE_ADDRESS,
	FUJITSU_MB84VD22194EC_FIRST_FREE_ADDRESS,
	FUJITSU_MB84VD22183EE_FIRST_FREE_ADDRESS,
	FUJITSU_MBM29DL322TE_FIRST_FREE_ADDRESS,
	TOSHIBA_TH50VSF2581_FIRST_FREE_ADDRESS,
	TOSHIBA_TH50VSF2580_FIRST_FREE_ADDRESS,
	FUJITSU_MB84VF5F5F4J2_FIRST_FREE_ADDRESS,
	FUJITSU_MB84VD23481FJ_FIRST_FREE_ADDRESS,		// MON730 : 0 --> FUJITSU_MB84VD23481FJ_FIRST_FREE_ADDRESS
	0,
	0,
	0,
	SST_SST39VF800_FIRST_FREE_ADDRESS,
    0,
    0,
    0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
    0,
	0  /* Not supported. */
};

static const char *flash_name[NUMBER_OF_FLASH_ID] =
{
    "Intel 28F400-B",
    "Intel 28F800-B",
    "Intel 28F800-B3",
	"Sharp 28F160_S3H",
	"Sharp 28F800_BGH",
	"Sharp LRS1329",
	"Sharp LRS1336",
	"Sharp LRS1350A",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
	"AMD AM29DL800BB",
	"AMD AM29LV160BB",
	"AMD AM29DL323CB",
	"AMD AM29DL323CT",
	"Fujitsu 29DL161TD",
	"Fujitsu 29DL161BD",
	"Fujitsu MB84VD22194EC",
    "Fujitsu MB84VD22183EE",
    "Fujitsu MBM29DL322TE",
	"TOSHIBA_TH50VSF2581",
	"TOSHIBA_TH50VSF2580",
	"FUJITSU_MB84VF5F5F4J2",
    "FUJITSU_MB84VD23481FJ",		// MON730 "Not supported!" --> "FUJITSU_MB84VD23481FJ"
    "Not supported!",
	"Not supported!",
	"Not supported!",
    "SST SST39VF800",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
    "Not supported!",
	"Not supported!"
};


FlashErasingWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    char               message[80];
    int                erasing_result;
    LRESULT            result;
    t_com_request      request;
    t_com_confirmation confirmation;
    UBYTE              serial_request[COM_SERIAL_COMMAND_LENGTH];
    static UBYTE       serial_confirmation[COM_SERIAL_COMMAND_LENGTH];
    static int         erasing_timeout;
    static HWND        hwndPB;
    UBYTE		monitor_id;	// MON730 ߰

    switch (msg) {

    case WM_INITDIALOG:

// MON730 COM_ERASE_FLASH    flash type detectϿ Progressive Bar range 
        if (get_downloading_parameters (hwnd, &monitor_id)) {

			(void) SetTimer (hwnd, ID_TIMER_CNF_READING, DELAY_TO_UPDATE_FLASH_ERASE_BAR, NULL);
			hwndPB = GetDlgItem (hwnd, IDC_ERASING_PROGRESS_BAR);
			if(flash_detected_pc == FLA_FUJITSU_MB84VD23481FJ)
				(void) SendMessage (hwndPB, PBM_SETRANGE32, 0, DELAY_TO_ERASE_FLASH/2);	// 648Mbit --> 70 sec
			else
				(void) SendMessage (hwndPB, PBM_SETRANGE32, 0, DELAY_TO_ERASE_FLASH);	// 64Mbit --> 140 sec
			erasing_timeout = 0;
			result = TRUE;
        
        } else {

            (void) EndDialog (hwnd, CNF_ERROR);
        }
// MON730

        COM_COMMAND_WORD (&request) = COM_ERASE_FLASH;

        if (com_build_request (&request, serial_request) != COM_SUCCESS)
            assert (0); /* Internal error. */
        
        else {

            ser_purge_buffers ();
            ser_send_command (serial_request);
        }


        break;

    case WM_MOUSEMOVE:

        (void) SetCursor (LoadCursor (NULL, IDC_WAIT));
        result = TRUE;

        break;

    case WM_TIMER:

        erasing_timeout += DELAY_FOR_TIMEOUT;
        (void) SendMessage (hwndPB, PBM_SETPOS, erasing_timeout, 0);

        if (erasing_timeout >= (DELAY_TO_ERASE_FLASH * 12 / 10)) {
            
            (void) KillTimer (hwnd, ID_TIMER_CNF_READING);
            (void) EndDialog (hwnd, ERASING_TIMEOUT);

        } else if (ser_receive_command (0,serial_confirmation)) {

            (void) KillTimer (hwnd, ID_TIMER_CNF_READING);

            if (com_analyze_confirmation (
                    serial_confirmation, &confirmation) != COM_SUCCESS) {

                (void) sprintf (message,
                                "Error in confirmation format ! (CW=%d)",
                                COM_ERASE_FLASH);
                (void) MessageBox (hwnd, message, "Protocol", MB_ICONERROR);
                erasing_result = CNF_ERROR;

            } else if (COM_COMMAND_WORD (&confirmation) != COM_ERASE_FLASH) {

                (void) sprintf (message,
                                "Bad command word ! (CW=%d)",
                                COM_COMMAND_WORD (&confirmation));
                (void) MessageBox (hwnd, message, "Protocol", MB_ICONERROR);
                erasing_result = CNF_ERROR;

            } else if (COM_RESULT (&confirmation) == COM_NOT_SUPPORTED) {
                err_analyze_command_result (hwnd, &confirmation);
                erasing_result = CNF_ERROR;
			
			} else if (COM_RESULT (&confirmation) != COM_SUCCESS)
                err_analyze_command_result (hwnd, &confirmation);

            else
                erasing_result = FLASH_ERASED;

            (void) EndDialog (hwnd, erasing_result);
        }

        result = TRUE;

        break;

    default:

        result = FALSE;
        break;
    }

    return (result);
}

// serial.h

#define DELAY_TO_UPDATE_FLASH_ERASE_BAR   (100)		// MON730 1 --> 100    
#define DELAY_TO_ERASE_FLASH              (7000)	// MON730 70000 --> 7000

// flash.h

#define FUJITSU_MB84VD23481FJ_FIRST_FREE_ADDRESS (0x2000)	// MON730 ߰

enum {
    /* Intel family flashes */
    FLA_INTEL_28F400_B, 
    FLA_INTEL_28F800_B,
    FLA_INTEL_28F800_B3,
    FLA_SHARP_28F160_S3H,  /* Sharp 28F160 */
    FLA_SHARP_28F800_BGH,  /* Sharp 28F800 */
    FLA_SHARP_LRS1329,     /* Sharp LRS1329 */
    FLA_SHARP_LRS1336,     /* Sharp LRS1336 */
    FLA_SHARP_LRS1350A,    /* Sharp LRS1350A */
    FLA_INTEL_UNDEF_8,
    FLA_INTEL_UNDEF_9,
    FLA_INTEL_UNDEF_10,
    FLA_INTEL_UNDEF_11,
    FLA_INTEL_UNDEF_12,
    FLA_INTEL_UNDEF_13,
    FLA_INTEL_UNDEF_14,
    FLA_INTEL_UNDEF_15,
    /* AMD family flashes */
    FLA_AMD_AM29DL800BB,
	FLA_AMD_AM29LV160BB,
	FLA_AMD_AM29DL323CB,
	FLA_AMD_AM29DL323CT,
    FLA_FUJITSU_29DL161TD,
    FLA_FUJITSU_29DL161BD,
    FLA_FUJITSU_MB84VD22194EC,
    FLA_FUJITSU_MB84VD22183EE,
    FLA_FUJITSU_MBM29DL322TE,
    FLA_TOSHIBA_TH50VSF2581, /* jms */
    FLA_TOSHIBA_TH50VSF2580,
    FLA_FUJITSU_MB84VF5F5F4J2,
    FLA_FUJITSU_MB84VD23481FJ,			// MON730  (FLA_AMD_UNDEF_12 --> FLA_FUJITSU_MB84VD23481FJ)
    FLA_AMD_UNDEF_13,
    FLA_AMD_UNDEF_14,
    FLA_AMD_UNDEF_15,
    /* SST family flashes */
	FLA_SST_SST39VF800,
	FLA_SST_UNDEF_1,
	FLA_SST_UNDEF_2,
	FLA_SST_UNDEF_3,
	FLA_SST_UNDEF_4,
	FLA_SST_UNDEF_5,
	FLA_SST_UNDEF_6,
	FLA_SST_UNDEF_7,
	FLA_SST_UNDEF_8,
	FLA_SST_UNDEF_9,
	FLA_SST_UNDEF_10,
	FLA_SST_UNDEF_11,
	FLA_SST_UNDEF_12,
	FLA_SST_UNDEF_13,
	FLA_SST_UNDEF_14,
	FLA_SST_UNDEF_15,
    FLA_FLASH_UNKNOWN /* Must be the last constant. */
};
