/*
 * (C) Copyright 2001
 * Denis Peter, MPL AG Switzerland, d.peter@mpl.ch
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 *
 * hacked for PIP405
 */

#include <ppcboot.h>
#include <command.h>
#include "pip405.h"
#include "../common/common_util.h"


extern void print_pip405_info(void);
extern int do_mplcommon(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[]);



/* ------------------------------------------------------------------------- */

int do_pip405(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
{

 	ulong led_on,led_nr;

	if (strcmp(argv[1], "info") == 0)
	{
		print_pip405_info();
	 	return 0;
   	}
 	if (strcmp(argv[1], "led") == 0)
	{
		led_nr = (ulong)simple_strtoul(argv[2], NULL, 10);
		led_on = (ulong)simple_strtoul(argv[3], NULL, 10);
		if(!led_nr)
			user_led0(led_on);
		else
			user_led1(led_on);
		return 0;
   	}

#if 0
	if (strcmp(argv[1], "flash") == 0)
	{
		if (strcmp(argv[2], "floppy") == 0) {
 			char *local_args[3];
			extern int do_fdcboot (cmd_tbl_t *, bd_t *, int, int, char *[]);
			printf ("\nupdating bootloader image from floppy\n");
			local_args[0] = argv[0];
	    		if(argc==4) {
				local_args[1] = argv[3];
				local_args[2] = NULL;
				load_addr=simple_strtoul(argv[3], NULL, 16);
				result=do_fdcboot(cmdtp, bd, 0, 2, local_args);
			}
			else {
				local_args[1] = NULL;
				load_addr=CFG_LOAD_ADDR;
				result=do_fdcboot(cmdtp, bd, 0, 1, local_args);
			}
			result=mpl_prg_image(load_addr);
			return result;
		}
		if (strcmp(argv[2], "mem") == 0) {
	    		if(argc==4) {
				load_addr=simple_strtoul(argv[3], NULL, 16);
			}
			else {
				load_addr=CFG_LOAD_ADDR;
			}
			printf ("\nupdating bootloader image from memory at %lX\n",load_addr);
			result=mpl_prg_image(load_addr);
			return result;
		}
		if (strcmp(argv[2], "mps") == 0) {
			printf ("\nupdating bootloader image from MSP\n");
			result=mpl_prg(src,size);
			return result;
		}
	}
	if (strcmp(argv[1], "getback") == 0) {
		get_backup_values(&back);
		back.signature[3]=0;
		back.serial_name[16]=0;
		back.eth_addr[20]=0;
		printf("GetBackUp: signature: %s\n",back.signature);
		printf("           serial#:   %s\n",back.serial_name);
		printf("           ethaddr:   %s\n",back.eth_addr);
		return 0;
	}
	if (strcmp(argv[1], "setback") == 0) {
		set_backup_values(1);
		return 0;
	}
 	if (strcmp(argv[1], "clearenvvalues") == 0)
	{
 		if (strcmp(argv[2], "yes") == 0)
		{
			clear_env_values();
			return 0;
		}
	}
	if (strcmp(argv[1], "mem") == 0)
	{
		result=0;
		if(argc==3)
		{
			result = (int)simple_strtol(argv[2], NULL, 16);
	    }
	    src=(unsigned long)&result;
	    src-=CFG_MEMTEST_START;
	    src-=(100*1024); /* - 100k */
	    src&=0xfff00000;
	    size=0;
	    do {
	    	size++;
			printf("Pass %ld\n",size);
			mem_test(CFG_MEMTEST_START,src,1);
			if(ctrlc())
				break;
			if(result>0)
				result--;

		}while(result);
		return 0;
	}
 #endif
	return (do_mplcommon(cmdtp, bd, flag, argc, argv));
}

/* ------------------------------------------------------------------------- */
