#include <common.h>

#include <config.h>
#include <command.h>

#ifdef  YAFFS2_DEBUG
#define PRINTF(fmt,args...) printf (fmt ,##args)
#else
#define PRINTF(fmt,args...)
#endif

extern void cmd_yaffs_mount(char *mp);
extern void cmd_yaffs_umount(char *mp);
extern void cmd_yaffs_read_file(char *fn);
extern void cmd_yaffs_write_file(char *fn,char bval,int sizeOfFile);
extern void cmd_yaffs_ls(const char *mountpt, int longlist);
extern void cmd_yaffs_mwrite_file(char *fn, char *addr, int size);
extern void cmd_yaffs_mread_file(char *fn, char *addr);
extern void cmd_yaffs_mkdir(const char *dir);
extern void cmd_yaffs_rmdir(const char *dir);
extern void cmd_yaffs_rm(const char *path);
extern void cmd_yaffs_mv(const char *oldPath, const char *newPath);

extern int yaffs_DumpDevStruct(const char *path);


int do_ymount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *mtpoint = argv[1];
    cmd_yaffs_mount(mtpoint);

    return(0);
}

int do_yumount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *mtpoint = argv[1];
    cmd_yaffs_umount(mtpoint);

    return(0);
}

int do_yls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *dirname = argv[argc-1];

    cmd_yaffs_ls(dirname, (argc>2)?1:0);

    return(0);
}

int do_yrd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *filename = argv[1];
    printf ("Reading file %s ", filename);

    cmd_yaffs_read_file(filename);

    printf ("done\n");
    return(0);
}

int do_ywr (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *filename = argv[1];
    ulong value = simple_strtoul(argv[2], NULL, 16);
    ulong numValues = simple_strtoul(argv[3], NULL, 16);

    printf ("Writing value (%x) %x times to %s... ", value, numValues, filename);

    cmd_yaffs_write_file(filename,value,numValues);

    printf ("done\n");
    return(0);
}

int do_yrdm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *filename = argv[1];
    ulong addr = simple_strtoul(argv[2], NULL, 16);

    cmd_yaffs_mread_file(filename, (char *)addr);

    return(0);
}

int do_ywrm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *filename = argv[1];
    ulong addr = simple_strtoul(argv[2], NULL, 16);
    ulong size = simple_strtoul(argv[3], NULL, 16);

    cmd_yaffs_mwrite_file(filename, (char *)addr, size);

    return(0);
}

int do_ymkdir (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *dirname = argv[1];

    cmd_yaffs_mkdir(dirname);

    return(0);
}

int do_yrmdir (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *dirname = argv[1];

    cmd_yaffs_rmdir(dirname);

    return(0);
}

int do_yrm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *path = argv[1];

    cmd_yaffs_rm(path);

    return(0);
}

int do_ymv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *oldPath = argv[1];
    char *newPath = argv[2];

    cmd_yaffs_mv(newPath, oldPath);

    return(0);
}

int do_ydump (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    char *dirname = argv[1];
    if (yaffs_DumpDevStruct(dirname) != 0)
	printf("yaffs_DumpDevStruct returning error when dumping path: , %s\n", dirname);
    return 0;
}



U_BOOT_CMD(
    ymount, 3,  0,  do_ymount,
    "ymount\t- mount yaffs\n",
    "\n"
);

U_BOOT_CMD(
    yumount, 3,  0,  do_yumount,
    "yumount\t- unmount yaffs\n",
    "\n"
);

U_BOOT_CMD(
    yls,    4,  0,  do_yls,
    "yls\t- yaffs ls\n",
    "[-l] name\n"
);

U_BOOT_CMD(
    yrd,    2,  0,  do_yrd,
    "yrd\t- read file from yaffs\n",
    "filename\n"
);

U_BOOT_CMD(
    ywr,    4,  0,  do_ywr,
    "ywr\t- write file to yaffs\n",
    "filename value num_vlues\n"
);

U_BOOT_CMD(
    yrdm,   3,  0,  do_yrdm,
    "yrdm\t- read file to memory from yaffs\n",
    "filename offset\n"
);

U_BOOT_CMD(
    ywrm,   4,  0,  do_ywrm,
    "ywrm\t- write file from memory to yaffs\n",
    "filename offset size\n"
);

U_BOOT_CMD(
    ymkdir, 2,  0,  do_ymkdir,
    "ymkdir\t- YAFFS mkdir\n",
    "dirname\n"
);

U_BOOT_CMD(
    yrmdir, 2,  0,  do_yrmdir,
    "yrmdir\t- YAFFS rmdir\n",
    "dirname\n"
);

U_BOOT_CMD(
    yrm,    2,  0,  do_yrm,
    "yrm\t- YAFFS rm\n",
    "path\n"
);

U_BOOT_CMD(
    ymv,    4,  0,  do_ymv,
    "ymv\t- YAFFS mv\n",
    "oldPath newPath\n"
);

U_BOOT_CMD(
    ydump,  2,  0,  do_ydump,
    "ydump\t- YAFFS device struct\n",
    "dirname\n"
);
