ota_backend_sdcard.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. * Copyright (c) 2019 Actions Semiconductor Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file
  8. * @brief OTA SDCARD backend interface
  9. */
  10. #include <kernel.h>
  11. #include <fs/fs.h>
  12. #include <file_stream.h>
  13. #include <string.h>
  14. #include <mem_manager.h>
  15. #include <fs_manager.h>
  16. #include <ota_backend.h>
  17. #include <ota_backend_sdcard.h>
  18. #undef CONFIG_OTA_SDCARD_DYNAMIC_DETECT
  19. struct ota_backend_sdcard {
  20. struct ota_backend backend;
  21. io_stream_t stream;
  22. int stream_opened;
  23. const char *fpath;
  24. };
  25. static int sdcard_file_is_exist(const char* f_path)
  26. {
  27. struct fs_dirent *entry;
  28. int err;
  29. entry = (struct fs_dirent *)mem_malloc(sizeof(struct fs_dirent));
  30. if (!entry) {
  31. return 0;
  32. }
  33. err = fs_stat(f_path, entry);
  34. mem_free(entry);
  35. if (err) {
  36. SYS_LOG_INF("file %s not found ", f_path);
  37. return 0;
  38. }
  39. SYS_LOG_INF("file %s found", f_path);
  40. return 1;
  41. }
  42. int ota_backend_sdcard_ioctl(struct ota_backend *backend, int cmd, unsigned int param)
  43. {
  44. SYS_LOG_INF("cmd 0x%x: param %d\n", cmd, param);
  45. switch (cmd) {
  46. case OTA_BACKEND_IOCTL_REPORT_PROCESS:
  47. backend->cb(backend, OTA_BACKEND_UPGRADE_PROGRESS, param);
  48. break;
  49. default:
  50. SYS_LOG_ERR("unknow cmd 0x%x", cmd);
  51. return -EINVAL;
  52. }
  53. return 0;
  54. }
  55. int ota_backend_sdcard_read(struct ota_backend *backend, int offset, unsigned char *buf, int size)
  56. {
  57. struct ota_backend_sdcard *backend_sdcard = CONTAINER_OF(backend,
  58. struct ota_backend_sdcard, backend);
  59. int err;
  60. SYS_LOG_DBG("offset 0x%x, size %d, buf %p", offset, size, buf);
  61. err = stream_seek(backend_sdcard->stream, offset, SEEK_DIR_BEG);
  62. if (err < 0) {
  63. SYS_LOG_INF("seek err %d", err);
  64. return -EIO;
  65. }
  66. err = stream_read(backend_sdcard->stream, buf, size);
  67. if (err < 0) {
  68. SYS_LOG_INF("read data err %d", err);
  69. return -EIO;
  70. }
  71. return 0;
  72. }
  73. int ota_backend_sdcard_open(struct ota_backend *backend)
  74. {
  75. struct ota_backend_sdcard *backend_sdcard = CONTAINER_OF(backend,
  76. struct ota_backend_sdcard, backend);
  77. int err;
  78. if (!fs_manager_get_volume_state(CONFIG_APP_FAT_DISK) && !sdcard_file_is_exist(backend_sdcard->fpath)) {
  79. SYS_LOG_ERR("cannot found ota file \'%s\' in sdcard", backend_sdcard->fpath);
  80. return -ENOENT;
  81. }
  82. backend_sdcard->stream = file_stream_create((char *)backend_sdcard->fpath);
  83. if (!backend_sdcard->stream) {
  84. SYS_LOG_ERR("stream create failed \n");
  85. return -EIO;
  86. }
  87. SYS_LOG_INF("create stream %p", backend_sdcard->stream);
  88. err = stream_open(backend_sdcard->stream, MODE_IN);
  89. if (err) {
  90. SYS_LOG_ERR("stream open failed \n");
  91. return err;
  92. }
  93. backend_sdcard->stream_opened = 1;
  94. SYS_LOG_INF("open stream %p", backend_sdcard->stream);
  95. return 0;
  96. }
  97. int ota_backend_sdcard_close(struct ota_backend *backend)
  98. {
  99. struct ota_backend_sdcard *backend_sdcard = CONTAINER_OF(backend,
  100. struct ota_backend_sdcard, backend);
  101. int err;
  102. SYS_LOG_INF("close: type %d", backend->type);
  103. if (backend_sdcard->stream) {
  104. err = stream_close(backend_sdcard->stream);
  105. if (err) {
  106. SYS_LOG_ERR("stream_close Failed");
  107. return err;
  108. }
  109. }
  110. backend_sdcard->stream_opened = 0;
  111. return 0;
  112. }
  113. void ota_backend_sdcard_exit(struct ota_backend *backend)
  114. {
  115. struct ota_backend_sdcard *backend_sdcard = CONTAINER_OF(backend,
  116. struct ota_backend_sdcard, backend);
  117. if (backend_sdcard->stream) {
  118. stream_destroy(backend_sdcard->stream);
  119. }
  120. mem_free(backend_sdcard);
  121. }
  122. const struct ota_backend_api ota_backend_api_sdcard = {
  123. .init = (void *)ota_backend_sdcard_init,
  124. .exit = ota_backend_sdcard_exit,
  125. .open = ota_backend_sdcard_open,
  126. .close = ota_backend_sdcard_close,
  127. .read = ota_backend_sdcard_read,
  128. .ioctl = ota_backend_sdcard_ioctl,
  129. };
  130. struct ota_backend *ota_backend_sdcard_init(ota_backend_notify_cb_t cb,
  131. struct ota_backend_sdcard_init_param *param)
  132. {
  133. struct ota_backend_sdcard *backend_sdcard;
  134. SYS_LOG_INF("init");
  135. backend_sdcard = mem_malloc(sizeof(struct ota_backend_sdcard));
  136. if (!backend_sdcard) {
  137. SYS_LOG_ERR("malloc failed");
  138. return NULL;
  139. }
  140. memset(backend_sdcard, 0x0, sizeof(struct ota_backend_sdcard));
  141. backend_sdcard->fpath = param->fpath;
  142. ota_backend_init(&backend_sdcard->backend, OTA_BACKEND_TYPE_CARD,
  143. (struct ota_backend_api *) &ota_backend_api_sdcard, cb);
  144. if ((fs_manager_get_volume_state(CONFIG_APP_FAT_DISK) && sdcard_file_is_exist(backend_sdcard->fpath))) {
  145. SYS_LOG_INF("found ota file \'%s\' in sdcard", backend_sdcard->fpath);
  146. cb(&backend_sdcard->backend, OTA_BACKEND_UPGRADE_STATE, 1);
  147. }
  148. #ifndef CONFIG_OTA_SDCARD_DYNAMIC_DETECT
  149. else {
  150. mem_free(&backend_sdcard->backend);
  151. return NULL;
  152. }
  153. #endif
  154. return &backend_sdcard->backend;
  155. }