cmd_ubifs.c 3.2 KB

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