]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/cmd_fat.c
Merge branch 'master' of git://git.denx.de/u-boot-net
[karo-tx-uboot.git] / common / cmd_fat.c
index 12eb764a9dd5afa3e9ab01fe76aa743080e2dc28..55585c6cf4b0ec9aad0d962cf775de2f46fbed21 100644 (file)
  */
 #include <common.h>
 #include <command.h>
-#include <cmd_autoscript.h>
 #include <s_record.h>
 #include <net.h>
 #include <ata.h>
-
-#if (CONFIG_COMMANDS & CFG_CMD_FAT)
-
-#undef DEBUG
-
+#include <part.h>
 #include <fat.h>
 
-extern block_dev_desc_t *ide_get_dev (int dev);
 
-int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        long size;
        unsigned long offset;
-       unsigned long count;
-
-       if (argc < 3) {
-               printf ("usage:fatload <filename> <addr> [bytes]\n");
-               return (0);
+       unsigned long count = 0;
+       unsigned long pos = 0;
+       char buf [12];
+       block_dev_desc_t *dev_desc=NULL;
+       disk_partition_t info;
+       int part, dev;
+
+       if (argc < 5) {
+               printf("usage: fatload <interface> [<dev[:part]>] "
+                       "<addr> <filename> [bytes [pos]]\n");
+               return 1;
        }
 
-       offset = simple_strtoul (argv[2], NULL, 16);
-       if (argc == 4)
-               count = simple_strtoul (argv[3], NULL, 16);
-       else
-               count = 0;
-
-       size = file_fat_read (argv[1], (unsigned char *) offset, count);
-
-       printf ("%ld bytes read\n", size);
-
-       return size;
-}
-
-int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
-       char *filename = "/";
-       int ret;
-
-       if (argc == 2)
-               ret = file_fat_ls (argv[1]);
-       else
-               ret = file_fat_ls (filename);
+       part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1);
+       if (part < 0)
+               return 1;
 
-       return (ret);
-}
-
-int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
-       int ret;
+       dev = dev_desc->dev;
+       if (fat_register_device(dev_desc,part)!=0) {
+               printf("\n** Unable to use %s %d:%d for fatload **\n",
+                       argv[1], dev, part);
+               return 1;
+       }
+       offset = simple_strtoul(argv[3], NULL, 16);
+       if (argc >= 6)
+               count = simple_strtoul(argv[5], NULL, 16);
+       if (argc >= 7)
+               pos = simple_strtoul(argv[6], NULL, 16);
+       size = file_fat_read_at(argv[4], pos, (unsigned char *)offset, count);
+
+       if(size==-1) {
+               printf("\n** Unable to read \"%s\" from %s %d:%d **\n",
+                       argv[4], argv[1], dev, part);
+               return 1;
+       }
 
-       ret = 0;
+       printf("\n%ld bytes read\n", size);
 
-       printf ("FAT info: %d\n", file_fat_detectfs ());
+       sprintf(buf, "%lX", size);
+       setenv("filesize", buf);
 
-       return (ret);
+       return 0;
 }
 
-#ifdef NOT_IMPLEMENTED_YET
-/* find first device whose first partition is a DOS filesystem */
-int find_fat_partition (void)
-{
-       int i, j;
-       block_dev_desc_t *dev_desc;
-       unsigned char *part_table;
-       unsigned char buffer[ATA_BLOCKSIZE];
-
-       for (i = 0; i < CFG_IDE_MAXDEVICE; i++) {
-               dev_desc = ide_get_dev (i);
-               if (!dev_desc) {
-                       debug ("couldn't get ide device!\n");
-                       return (-1);
-               }
-               if (dev_desc->part_type == PART_TYPE_DOS) {
-                       if (dev_desc->
-                               block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1) {
-                               debug ("can't perform block_read!\n");
-                               return (-1);
-                       }
-                       part_table = &buffer[0x1be];    /* start with partition #4 */
-                       for (j = 0; j < 4; j++) {
-                               if ((part_table[4] == 1 ||      /* 12-bit FAT */
-                                    part_table[4] == 4 ||      /* 16-bit FAT */
-                                    part_table[4] == 6) &&     /* > 32Meg part */
-                                   part_table[0] == 0x80) {    /* bootable? */
-                                       curr_dev = i;
-                                       part_offset = part_table[11];
-                                       part_offset <<= 8;
-                                       part_offset |= part_table[10];
-                                       part_offset <<= 8;
-                                       part_offset |= part_table[9];
-                                       part_offset <<= 8;
-                                       part_offset |= part_table[8];
-                                       debug ("found partition start at %ld\n", part_offset);
-                                       return (0);
-                               }
-                               part_table += 16;
-                       }
-               }
-       }
 
-       debug ("no valid devices found!\n");
-       return (-1);
-}
+U_BOOT_CMD(
+       fatload,        7,      0,      do_fat_fsload,
+       "load binary file from a dos filesystem",
+       "<interface> [<dev[:part]>]  <addr> <filename> [bytes [pos]]\n"
+       "    - Load binary file 'filename' from 'dev' on 'interface'\n"
+       "      to address 'addr' from dos filesystem.\n"
+       "      'pos' gives the file position to start loading from.\n"
+       "      If 'pos' is omitted, 0 is used. 'pos' requires 'bytes'.\n"
+       "      'bytes' gives the size to load. If 'bytes' is 0 or omitted,\n"
+       "      the load stops on end of file."
+);
 
-int
-do_fat_dump (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
+int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       __u8 block[1024];
-       int ret;
-       int bknum;
-
-       ret = 0;
+       char *filename = "/";
+       int ret, dev, part;
+       block_dev_desc_t *dev_desc=NULL;
+       disk_partition_t info;
 
-       if (argc != 2) {
-               printf ("needs an argument!\n");
-               return (0);
+       if (argc < 2) {
+               printf("usage: fatls <interface> [<dev[:part]>] [directory]\n");
+               return 0;
        }
 
-       bknum = simple_strtoul (argv[1], NULL, 10);
+       part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1);
+       if (part < 0)
+               return 1;
 
-       if (disk_read (0, bknum, block) != 0) {
-               printf ("Error: reading block\n");
-               return -1;
+       dev = dev_desc->dev;
+       if (fat_register_device(dev_desc,part)!=0) {
+               printf("\n** Unable to use %s %d:%d for fatls **\n",
+                       argv[1], dev, part);
+               return 1;
        }
-       printf ("FAT dump: %d\n", bknum);
-       hexdump (512, block);
+       if (argc == 4)
+               ret = file_fat_ls(argv[3]);
+       else
+               ret = file_fat_ls(filename);
 
-       return (ret);
+       if(ret!=0)
+               printf("No Fat FS detected\n");
+       return ret;
 }
 
-int disk_read (__u32 startblock, __u32 getsize, __u8 *bufptr)
+U_BOOT_CMD(
+       fatls,  4,      1,      do_fat_ls,
+       "list files in a directory (default /)",
+       "<interface> [<dev[:part]>] [directory]\n"
+       "    - list files from 'dev' on 'interface' in a 'directory'"
+);
+
+int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       ulong tot;
+       int dev, part;
        block_dev_desc_t *dev_desc;
+       disk_partition_t info;
 
-       if (curr_dev < 0) {
-               if (find_fat_partition () != 0)
-                       return (-1);
+       if (argc < 2) {
+               printf("usage: fatinfo <interface> [<dev[:part]>]\n");
+               return 0;
        }
 
-       dev_desc = ide_get_dev (curr_dev);
-       if (!dev_desc) {
-               debug ("couldn't get ide device\n");
-               return (-1);
-       }
-
-       tot = dev_desc->block_read (0, startblock + part_offset,
-                                   getsize, (ulong *) bufptr);
-
-       /* should we do this here?
-          flush_cache ((ulong)buf, cnt*ide_dev_desc[device].blksz);
-        */
+       part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1);
+       if (part < 0)
+               return 1;
 
-       if (tot == getsize)
-               return (0);
-
-       debug ("unable to read from device!\n");
-
-       return (-1);
+       dev = dev_desc->dev;
+       if (fat_register_device(dev_desc,part)!=0) {
+               printf("\n** Unable to use %s %d:%d for fatinfo **\n",
+                       argv[1], dev, part);
+               return 1;
+       }
+       return file_fat_detectfs();
 }
 
+U_BOOT_CMD(
+       fatinfo,        3,      1,      do_fat_fsinfo,
+       "print information about filesystem",
+       "<interface> [<dev[:part]>]\n"
+       "    - print information about filesystem from 'dev' on 'interface'"
+);
 
-static int isprint (unsigned char ch)
+#ifdef CONFIG_FAT_WRITE
+static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
 {
-       if (ch >= 32 && ch < 127)
-               return (1);
+       long size;
+       unsigned long addr;
+       unsigned long count;
+       block_dev_desc_t *dev_desc = NULL;
+       disk_partition_t info;
+       int dev = 0;
+       int part = 1;
+       char *ep;
 
-       return (0);
-}
+       if (argc < 5)
+               return cmd_usage(cmdtp);
 
+       part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1);
+       if (part < 0)
+               return 1;
 
-void hexdump (int cnt, unsigned char *data)
-{
-       int i;
-       int run;
-       int offset;
-
-       offset = 0;
-       while (cnt) {
-               printf ("%04X : ", offset);
-               if (cnt >= 16)
-                       run = 16;
-               else
-                       run = cnt;
-               cnt -= run;
-               for (i = 0; i < run; i++)
-                       printf ("%02X ", (unsigned int) data[i]);
-               printf (": ");
-               for (i = 0; i < run; i++)
-                       printf ("%c", isprint (data[i]) ? data[i] : '.');
-               printf ("\n");
-               data = &data[16];
-               offset += run;
+       dev = dev_desc->dev;
+
+       if (fat_register_device(dev_desc, part) != 0) {
+               printf("\n** Unable to use %s %d:%d for fatwrite **\n",
+                       argv[1], dev, part);
+               return 1;
+       }
+       addr = simple_strtoul(argv[3], NULL, 16);
+       count = simple_strtoul(argv[5], NULL, 16);
+
+       size = file_fat_write(argv[4], (void *)addr, count);
+       if (size == -1) {
+               printf("\n** Unable to write \"%s\" from %s %d:%d **\n",
+                       argv[4], argv[1], dev, part);
+               return 1;
        }
+
+       printf("%ld bytes written\n", size);
+
+       return 0;
 }
-#endif /* NOT_IMPLEMENTED_YET */
 
-#endif /* CFG_CMD_FAT */
+U_BOOT_CMD(
+       fatwrite,       6,      0,      do_fat_fswrite,
+       "write file into a dos filesystem",
+       "<interface> <dev[:part]> <addr> <filename> <bytes>\n"
+       "    - write file 'filename' from the address 'addr' in RAM\n"
+       "      to 'dev' on 'interface'"
+);
+#endif