Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add fuse wrapper #178

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/fuse/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
SPIFFS_SRC := ..
SPIFFS_FILES := $(SPIFFS_SRC)/*.c

FUSE_FILES := fuse-main.c spiffs_mutex.c flash.c

ifeq (1, $(strip $(TEST)))
CFLAGS += -I$(SPIFFS_SRC)/default
CFLAGS += -I$(SPIFFS_SRC)/test
CFLAGS += -DNO_TEST
else
CFLAGS += -include spiffs_mutex.h
CFLAGS += -DSPIFFS_LOCK=spiffs_mutex_lock
CFLAGS += -DSPIFFS_UNLOCK=spiffs_mutex_unlock
endif

CFLAGS += -Wall -Werror `pkg-config fuse --cflags` -I. -I$(SPIFFS_SRC) -O2
LDFLAGS+=`pkg-config fuse --libs` -Wl,--gc-sections
VPATH = .:$(SPIFFS_SRC)

mount.spiffs: Makefile $(SPIFFS_FILES) $(FUSE_FILES)
$(CC) $(CFLAGS) -o $@ $(SPIFFS_FILES) $(FUSE_FILES) $(LDFLAGS)
94 changes: 94 additions & 0 deletions src/fuse/flash.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#include "flash.h"

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

static int fd = -1;
static void* ptr = NULL;

#if SPIFFS_HAL_CALLBACK_EXTRA
int32_t flash_read(void* fs, uint32_t addr, uint32_t size, uint8_t *dst)
#else
int32_t flash_read(uint32_t addr, uint32_t size, uint8_t *dst)
#endif
{
memcpy(dst, ptr + addr, size);

return 0;
}

#if SPIFFS_HAL_CALLBACK_EXTRA
int32_t flash_write(void* fs, uint32_t addr, uint32_t size, uint8_t *src)
#else
int32_t flash_write(uint32_t addr, uint32_t size, uint8_t *src)
#endif
{
memcpy(ptr + addr, src, size);

return 0;
}
#if SPIFFS_HAL_CALLBACK_EXTRA
int32_t flash_erase(void* fs, uint32_t addr, uint32_t size)
#else
int32_t flash_erase(uint32_t addr, uint32_t size)
#endif
{
memset(ptr + addr, 0xFF, size);

return 0;
}

static uint32_t flash_size = 0;
uint32_t flash_get_size(void) {
if (!flash_size)
flash_size = lseek(fd, 0, SEEK_END);
return flash_size;
}

int flash_open(const char* file) {
fd = open(file, O_RDWR);
ptr = mmap(NULL, flash_get_size(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

printf("%s(%s) = %d bytes\n", __func__, file, flash_get_size());

if (fd >= 0)
return 0;
return -1;
}

int flash_create(const char* file, size_t size) {
fd = open(file, O_RDWR | O_CREAT, 0644);

if (fd < 0)
return -1;

printf("%s(%s, %zd)\n", __func__, file, size);

void* mem = malloc(size);
memset(mem, 0xFF, size);
if (write(fd, mem, size) < 0) {
size = 0;
}

free(mem);
flash_size = size;

ptr = mmap(NULL, flash_get_size(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

return 0;
}

void flash_exit(void) {
if (fd >= 0) {
munmap(ptr, flash_get_size());
close(fd);
}
fd = -1;
flash_size = 0;
}
25 changes: 25 additions & 0 deletions src/fuse/flash.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include <stddef.h>
#include <stdint.h>

#include "spiffs.h"

#define FLASH_PAGE_SIZE 256
#define BLOCK_4K (1 << 12)
#define BLOCK_32K (1 << 15)
#define BLOCK_64K (1 << 16)

#if SPIFFS_HAL_CALLBACK_EXTRA
int32_t flash_read(void* fs, uint32_t addr, uint32_t size, uint8_t *dst);
int32_t flash_write(void* fs, uint32_t addr, uint32_t size, uint8_t *src);
int32_t flash_erase(void* fs, uint32_t addr, uint32_t size);
#else
int32_t flash_read(uint32_t addr, uint32_t size, uint8_t *dst);
int32_t flash_write(uint32_t addr, uint32_t size, uint8_t *src);
int32_t flash_erase(uint32_t addr, uint32_t size);
#endif

uint32_t flash_get_size(void);

int flash_open(const char *file);
int flash_create(const char* file, size_t size);
void flash_exit(void);
Loading