ubifs.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2008
  4. * Stefan Roese, DENX Software Engineering, sr@denx.de.
  5. */
  6. /*
  7. * UBIFS command support
  8. */
  9. #undef DEBUG
  10. #include <common.h>
  11. #include <config.h>
  12. #include <command.h>
  13. #include <ubifs_uboot.h>
  14. static int ubifs_initialized;
  15. static int ubifs_mounted;
  16. int cmd_ubifs_mount(char *vol_name)
  17. {
  18. int ret;
  19. debug("Using volume %s\n", vol_name);
  20. if (ubifs_initialized == 0) {
  21. ubifs_init();
  22. ubifs_initialized = 1;
  23. }
  24. ret = uboot_ubifs_mount(vol_name);
  25. if (ret)
  26. return -1;
  27. ubifs_mounted = 1;
  28. return ret;
  29. }
  30. static int do_ubifs_mount(cmd_tbl_t *cmdtp, int flag, int argc,
  31. char * const argv[])
  32. {
  33. char *vol_name;
  34. if (argc != 2)
  35. return CMD_RET_USAGE;
  36. vol_name = argv[1];
  37. return cmd_ubifs_mount(vol_name);
  38. }
  39. int ubifs_is_mounted(void)
  40. {
  41. return ubifs_mounted;
  42. }
  43. int cmd_ubifs_umount(void)
  44. {
  45. if (ubifs_initialized == 0) {
  46. printf("No UBIFS volume mounted!\n");
  47. return -1;
  48. }
  49. uboot_ubifs_umount();
  50. ubifs_mounted = 0;
  51. ubifs_initialized = 0;
  52. return 0;
  53. }
  54. static int do_ubifs_umount(cmd_tbl_t *cmdtp, int flag, int argc,
  55. char * const argv[])
  56. {
  57. if (argc != 1)
  58. return CMD_RET_USAGE;
  59. return cmd_ubifs_umount();
  60. }
  61. static int do_ubifs_ls(cmd_tbl_t *cmdtp, int flag, int argc,
  62. char * const argv[])
  63. {
  64. char *filename = "/";
  65. int ret;
  66. if (!ubifs_mounted) {
  67. printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
  68. return -1;
  69. }
  70. if (argc == 2)
  71. filename = argv[1];
  72. debug("Using filename %s\n", filename);
  73. ret = ubifs_ls(filename);
  74. if (ret) {
  75. printf("** File not found %s **\n", filename);
  76. ret = CMD_RET_FAILURE;
  77. }
  78. return ret;
  79. }
  80. static int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc,
  81. char * const argv[])
  82. {
  83. char *filename;
  84. char *endp;
  85. int ret;
  86. u32 addr;
  87. u32 size = 0;
  88. if (!ubifs_mounted) {
  89. printf("UBIFS not mounted, use ubifs mount to mount volume first!\n");
  90. return -1;
  91. }
  92. if (argc < 3)
  93. return CMD_RET_USAGE;
  94. addr = simple_strtoul(argv[1], &endp, 16);
  95. if (endp == argv[1])
  96. return CMD_RET_USAGE;
  97. filename = argv[2];
  98. if (argc == 4) {
  99. size = simple_strtoul(argv[3], &endp, 16);
  100. if (endp == argv[3])
  101. return CMD_RET_USAGE;
  102. }
  103. debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size);
  104. ret = ubifs_load(filename, addr, size);
  105. if (ret) {
  106. printf("** File not found %s **\n", filename);
  107. ret = CMD_RET_FAILURE;
  108. }
  109. return ret;
  110. }
  111. U_BOOT_CMD(
  112. ubifsmount, 2, 0, do_ubifs_mount,
  113. "mount UBIFS volume",
  114. "<volume-name>\n"
  115. " - mount 'volume-name' volume"
  116. );
  117. U_BOOT_CMD(
  118. ubifsumount, 1, 0, do_ubifs_umount,
  119. "unmount UBIFS volume",
  120. " - unmount current volume"
  121. );
  122. U_BOOT_CMD(
  123. ubifsls, 2, 0, do_ubifs_ls,
  124. "list files in a directory",
  125. "[directory]\n"
  126. " - list files in a 'directory' (default '/')"
  127. );
  128. U_BOOT_CMD(
  129. ubifsload, 4, 0, do_ubifs_load,
  130. "load file from an UBIFS filesystem",
  131. "<addr> <filename> [bytes]\n"
  132. " - load file 'filename' to address 'addr'"
  133. );