ubifs.c 2.8 KB

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