Patch LittleFS library.

main
Luigi F. Cruz 2023-01-29 19:48:21 -08:00
rodzic 21dcddd5b3
commit cb82863815
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: CEB689C74D220F93
3 zmienionych plików z 44 dodań i 47 usunięć

Wyświetl plik

@ -9,6 +9,7 @@
// variables used by the filesystem
lfs_t lfs;
lfs_file_t file;
struct lfs_config cfg;
// entry point
int main(void) {
@ -20,7 +21,7 @@ int main(void) {
printf("Hello from Pi Pico!\n");
const struct lfs_config cfg = lfs_rp2040_init();
lfs_rp2040_init(&cfg);
// mount the filesystem
int err = lfs_mount(&lfs, &cfg);

Wyświetl plik

@ -1,37 +1,39 @@
#include "lfs_rp2040.h"
#define DEBUG 1
extern char __flash_binary_end;
static uint storage_get_flash_capacity() {
uint8_t rxbuf[4];
uint8_t rxbuf[4] = {0};
uint8_t txbuf[4] = {0x9f};
flash_do_cmd(txbuf, rxbuf, 4);
return 1 << rxbuf[3];
}
static struct {
uintptr_t lfs_start_pos;
uintptr_t lfs_end_pos;
uintptr_t lfs_start_addr;
uintptr_t lfs_end_addr;
uint lfs_block_size;
uint lfs_read_size;
uint lfs_write_size;
uint32_t lfs_start_pos;
uint32_t lfs_end_pos;
uint32_t lfs_start_addr;
uint32_t lfs_end_addr;
uint32_t lfs_block_size;
uint32_t lfs_read_size;
uint32_t lfs_write_size;
} _lfs_rp2040_state;
const struct lfs_config lfs_rp2040_init() {
void lfs_rp2040_init(struct lfs_config* cfg) {
uint32_t ints = save_and_disable_interrupts();
const uintptr_t flash_capacity = storage_get_flash_capacity();
const uintptr_t bin_start = (uintptr_t)XIP_BASE;
const uintptr_t bin_end = (uintptr_t)&__flash_binary_end;
restore_interrupts(ints);
const uint32_t bin_start = (uint32_t)XIP_BASE;
const uint32_t bin_end = (uint32_t)&__flash_binary_end + 0x40000;
_lfs_rp2040_state.lfs_read_size = FLASH_PAGE_SIZE;
_lfs_rp2040_state.lfs_write_size = FLASH_PAGE_SIZE;
_lfs_rp2040_state.lfs_block_size = FLASH_SECTOR_SIZE;
_lfs_rp2040_state.lfs_start_addr = (bin_end - 1u + _lfs_rp2040_state.lfs_block_size) &
-_lfs_rp2040_state.lfs_block_size ;
-_lfs_rp2040_state.lfs_block_size;
_lfs_rp2040_state.lfs_end_addr = bin_start + flash_capacity;
_lfs_rp2040_state.lfs_start_pos = _lfs_rp2040_state.lfs_start_addr - bin_start;
@ -52,22 +54,18 @@ const struct lfs_config lfs_rp2040_init() {
printf("LFS block count : 0x%08x\n", lfs_block_count);
#endif
const struct lfs_config cfg = {
.read = lfs_rp2040_read,
.prog = lfs_rp2040_prog,
.erase = lfs_rp2040_erase,
.sync = lfs_rp2040_sync,
cfg->read = lfs_rp2040_read;
cfg->prog = lfs_rp2040_prog;
cfg->erase = lfs_rp2040_erase;
cfg->sync = lfs_rp2040_sync;
.read_size = _lfs_rp2040_state.lfs_read_size,
.prog_size = _lfs_rp2040_state.lfs_write_size,
.block_size = _lfs_rp2040_state.lfs_block_size,
.block_count = lfs_block_count,
.cache_size = _lfs_rp2040_state.lfs_write_size,
.lookahead_size = 16,
.block_cycles = 500,
};
return cfg;
cfg->read_size = _lfs_rp2040_state.lfs_read_size;
cfg->prog_size = _lfs_rp2040_state.lfs_write_size;
cfg->block_size = _lfs_rp2040_state.lfs_block_size;
cfg->block_count = lfs_block_count;
cfg->cache_size = _lfs_rp2040_state.lfs_write_size;
cfg->lookahead_size = 16;
cfg->block_cycles = 500;
}
int lfs_rp2040_read(const struct lfs_config *c, lfs_block_t block,
@ -76,10 +74,12 @@ int lfs_rp2040_read(const struct lfs_config *c, lfs_block_t block,
printf("[LFS I/O] - READ - B: 0x%08x | O: 0x%08x | S: 0x%08x\n", block, off, size);
#endif
const uintptr_t base_addr = _lfs_rp2040_state.lfs_start_addr;
const uintptr_t block_offset = _lfs_rp2040_state.lfs_block_size * block;
const uint32_t base_addr = _lfs_rp2040_state.lfs_start_addr;
const uint32_t block_offset = _lfs_rp2040_state.lfs_block_size * block;
uint32_t ints = save_and_disable_interrupts();
memcpy(buffer, (void*)(base_addr + block_offset + off), size);
restore_interrupts(ints);
return LFS_ERR_OK;
}
@ -88,15 +88,13 @@ int lfs_rp2040_prog(const struct lfs_config *c, lfs_block_t block,
lfs_off_t off, const void *buffer, lfs_size_t size) {
#ifdef DEBUG
printf("[LFS I/O] - PROG - B: 0x%08x | O: 0x%08x | S: 0x%08x\n", block, off, size);
#endif
#endif
const uint32_t base_pos = _lfs_rp2040_state.lfs_start_pos;
const uint32_t block_offset = _lfs_rp2040_state.lfs_block_size * block;
uint32_t ints = save_and_disable_interrupts();
const uintptr_t base_pos = _lfs_rp2040_state.lfs_start_pos;
const uintptr_t block_offset = _lfs_rp2040_state.lfs_block_size * block;
flash_range_program(base_pos + block_offset + off, buffer, size);
restore_interrupts(ints);
return LFS_ERR_OK;
@ -107,14 +105,12 @@ int lfs_rp2040_erase(const struct lfs_config *c, lfs_block_t block) {
printf("[LFS I/O] - ERASE - B: 0x%08x\n", block);
#endif
const uint32_t block_size = _lfs_rp2040_state.lfs_block_size;
const uint32_t base_pos = _lfs_rp2040_state.lfs_start_pos;
const uint32_t block_offset = _lfs_rp2040_state.lfs_block_size * block;
uint32_t ints = save_and_disable_interrupts();
const uintptr_t block_size = _lfs_rp2040_state.lfs_block_size;
const uintptr_t base_pos = _lfs_rp2040_state.lfs_start_pos;
const uintptr_t block_offset = _lfs_rp2040_state.lfs_block_size * block;
flash_range_erase(base_pos + block_offset, block_size);
restore_interrupts(ints);
return LFS_ERR_OK;
@ -125,4 +121,4 @@ int lfs_rp2040_sync(const struct lfs_config *c) {
printf("[LFS I/O] - SYNC\n");
#endif
return LFS_ERR_OK;
}
}

Wyświetl plik

@ -12,7 +12,7 @@
#include "pico/stdio.h"
#include "pico/stdlib.h"
const struct lfs_config lfs_rp2040_init();
void lfs_rp2040_init(struct lfs_config* cfg);
int lfs_rp2040_read(const struct lfs_config *c, lfs_block_t block,
lfs_off_t off, void *buffer, lfs_size_t size);
@ -24,4 +24,4 @@ int lfs_rp2040_erase(const struct lfs_config *c, lfs_block_t block);
int lfs_rp2040_sync(const struct lfs_config *c);
#endif
#endif