Пример #1
0
} TEST_END

TEST(magic_test) {
  // this test only works on default sizes
  TEST_ASSERT(sizeof(spiffs_obj_id) == sizeof(u16_t));

  // one obj lu page, not full
  fs_reset_specific(0, 0, 4096*16, 4096, 4096*1, 128);
  TEST_CHECK(SPIFFS_CHECK_MAGIC_POSSIBLE(FS));
  // one obj lu page, full
  fs_reset_specific(0, 0, 4096*16, 4096, 4096*2, 128);
  TEST_CHECK(!SPIFFS_CHECK_MAGIC_POSSIBLE(FS));
  // two obj lu pages, not full
  fs_reset_specific(0, 0, 4096*16, 4096, 4096*4, 128);
  TEST_CHECK(SPIFFS_CHECK_MAGIC_POSSIBLE(FS));

  return TEST_RES_OK;

} TEST_END
Пример #2
0
s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
                   u8_t *fd_space, u32_t fd_space_size,
                   void *cache, u32_t cache_size,
                   spiffs_check_callback check_cb_f) {
    SPIFFS_LOCK(fs);
    memset(fs, 0, sizeof(spiffs));
    memcpy(&fs->cfg, config, sizeof(spiffs_config));
    fs->block_count = SPIFFS_CFG_PHYS_SZ(fs) / SPIFFS_CFG_LOG_BLOCK_SZ(fs);
    fs->work = &work[0];
    fs->lu_work = &work[SPIFFS_CFG_LOG_PAGE_SZ(fs)];
    memset(fd_space, 0, fd_space_size);
    // align fd_space pointer to pointer size byte boundary, below is safe
    u8_t ptr_size = sizeof(void*);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
    u8_t addr_lsb = ((u8_t)fd_space) & (ptr_size-1);
#pragma GCC diagnostic pop
    if (addr_lsb) {
        fd_space += (ptr_size-addr_lsb);
        fd_space_size -= (ptr_size-addr_lsb);
    }
    fs->fd_space = fd_space;
    fs->fd_count = (fd_space_size/sizeof(spiffs_fd));

    // align cache pointer to 4 byte boundary, below is safe
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
    addr_lsb = ((u8_t)cache) & (ptr_size-1);
#pragma GCC diagnostic pop
    if (addr_lsb) {
        u8_t *cache_8 = (u8_t *)cache;
        cache_8 += (ptr_size-addr_lsb);
        cache = cache_8;
        cache_size -= (ptr_size-addr_lsb);
    }
    if (cache_size & (ptr_size-1)) {
        cache_size -= (cache_size & (ptr_size-1));
    }

#if SPIFFS_CACHE
    fs->cache = cache;
    fs->cache_size = (cache_size > (SPIFFS_CFG_LOG_PAGE_SZ(fs)*32)) ? SPIFFS_CFG_LOG_PAGE_SZ(fs)*32 : cache_size;
    spiffs_cache_init(fs);
#endif

    s32_t res;

#if SPIFFS_USE_MAGIC
    res = SPIFFS_CHECK_MAGIC_POSSIBLE(fs) ? SPIFFS_OK : SPIFFS_ERR_MAGIC_NOT_POSSIBLE;
    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
#endif

    fs->config_magic = SPIFFS_CONFIG_MAGIC;

    res = spiffs_obj_lu_scan(fs);
    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);

    SPIFFS_DBG("page index byte len:         %i\n", SPIFFS_CFG_LOG_PAGE_SZ(fs));
    SPIFFS_DBG("object lookup pages:         %i\n", SPIFFS_OBJ_LOOKUP_PAGES(fs));
    SPIFFS_DBG("page pages per block:        %i\n", SPIFFS_PAGES_PER_BLOCK(fs));
    SPIFFS_DBG("page header length:          %i\n", sizeof(spiffs_page_header));
    SPIFFS_DBG("object header index entries: %i\n", SPIFFS_OBJ_HDR_IX_LEN(fs));
    SPIFFS_DBG("object index entries:        %i\n", SPIFFS_OBJ_IX_LEN(fs));
    SPIFFS_DBG("available file descriptors:  %i\n", fs->fd_count);
    SPIFFS_DBG("free blocks:                 %i\n", fs->free_blocks);

    fs->check_cb_f = check_cb_f;

    fs->mounted = 1;

    SPIFFS_UNLOCK(fs);

    return 0;
}