use abstract types for offsets and pages so that we can easily port it to

very large or small memories.
This commit is contained in:
nvt-se 2008-10-03 19:27:28 +00:00
parent 74dcd17875
commit 10639bc982
4 changed files with 59 additions and 46 deletions

View file

@ -103,24 +103,24 @@
COFFEE_WRITE((hdr), sizeof(*hdr), (page) * COFFEE_PAGE_SIZE) COFFEE_WRITE((hdr), sizeof(*hdr), (page) * COFFEE_PAGE_SIZE)
struct file_desc { struct file_desc {
uint32_t offset; coffee_offset_t offset;
uint32_t end; coffee_offset_t end;
uint16_t file_page; coffee_page_t file_page;
uint16_t max_pages; coffee_page_t max_pages;
uint16_t next_log_entry; uint16_t next_log_entry;
uint8_t flags; uint8_t flags;
}; };
struct dir_cache { struct dir_cache {
int32_t page; coffee_offset_t page;
char filename_start; char filename_start;
}; };
struct file_header { struct file_header {
uint16_t log_page; coffee_page_t log_page;
uint16_t log_entries; uint16_t log_entries;
uint16_t log_entry_size; uint16_t log_entry_size;
uint16_t max_pages; coffee_page_t max_pages;
uint8_t eof_hint; uint8_t eof_hint;
uint8_t flags; uint8_t flags;
char name[COFFEE_NAME_LENGTH]; char name[COFFEE_NAME_LENGTH];
@ -128,7 +128,7 @@ struct file_header {
/* This is needed because of a buggy compiler. */ /* This is needed because of a buggy compiler. */
struct log_param { struct log_param {
uint32_t offset; coffee_offset_t offset;
const char *buf; const char *buf;
uint16_t size; uint16_t size;
}; };
@ -142,12 +142,12 @@ static struct file_desc coffee_fd_set[COFFEE_FD_SET_SIZE];
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static void
get_sector_status(uint16_t sector, uint16_t *active, get_sector_status(uint16_t sector, coffee_page_t *active,
uint16_t *free, uint16_t *obsolete) { coffee_page_t *free, coffee_page_t *obsolete) {
uint32_t offset, sector_start; coffee_offset_t offset, sector_start;
uint32_t end; coffee_offset_t end;
struct file_header hdr; struct file_header hdr;
static int16_t skip_pages; static coffee_page_t skip_pages;
static int last_pages_are_active; static int last_pages_are_active;
int i; int i;
@ -219,7 +219,7 @@ get_sector_status(uint16_t sector, uint16_t *active,
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static void
dir_cache_add(char c, int32_t page) dir_cache_add(char c, coffee_offset_t page)
{ {
int i; int i;
@ -233,7 +233,7 @@ dir_cache_add(char c, int32_t page)
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static void
dir_cache_del(int32_t page) dir_cache_del(coffee_offset_t page)
{ {
int i; int i;
@ -245,7 +245,7 @@ dir_cache_del(int32_t page)
} }
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int32_t static coffee_offset_t
dir_cache_find(const char *name) dir_cache_find(const char *name)
{ {
int i; int i;
@ -265,11 +265,11 @@ dir_cache_find(const char *name)
return -1; return -1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int32_t static coffee_offset_t
find_file(const char *name) find_file(const char *name)
{ {
struct file_header hdr; struct file_header hdr;
int32_t page; coffee_offset_t page;
page = dir_cache_find(name); page = dir_cache_find(name);
if(page >= 0) { if(page >= 0) {
@ -301,7 +301,7 @@ find_file(const char *name)
return -1; return -1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int32_t static coffee_offset_t
find_offset_in_file(int first_page) find_offset_in_file(int first_page)
{ {
struct file_header hdr; struct file_header hdr;
@ -309,7 +309,7 @@ find_offset_in_file(int first_page)
int page; int page;
int i; int i;
int search_limit; int search_limit;
uint32_t range_start, range_end, part_size; coffee_offset_t range_start, range_end, part_size;
READ_HEADER(&hdr, first_page); READ_HEADER(&hdr, first_page);
for(search_limit = i = 0; i < sizeof(hdr.eof_hint) * CHAR_BIT; i++) { for(search_limit = i = 0; i < sizeof(hdr.eof_hint) * CHAR_BIT; i++) {
@ -387,7 +387,7 @@ static int
cfs_garbage_collect(void) cfs_garbage_collect(void)
{ {
uint16_t sector; uint16_t sector;
uint16_t active_pages, free_pages, obsolete_pages; coffee_page_t active_pages, free_pages, obsolete_pages;
uint8_t sectors_in_row, longest_row; uint8_t sectors_in_row, longest_row;
watchdog_stop(); watchdog_stop();
@ -421,11 +421,11 @@ cfs_garbage_collect(void)
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int static int
remove_by_page(uint16_t page, int remove_log, int close_fds) remove_by_page(coffee_page_t page, int remove_log, int close_fds)
{ {
struct file_header hdr; struct file_header hdr;
int i; int i;
uint16_t log_page; coffee_page_t log_page;
if(page >= COFFEE_PAGE_COUNT) { if(page >= COFFEE_PAGE_COUNT) {
return -1; return -1;
@ -462,7 +462,7 @@ remove_by_page(uint16_t page, int remove_log, int close_fds)
static int static int
read_log_page(struct file_header *hdr, int16_t last_entry, struct log_param *lp) read_log_page(struct file_header *hdr, int16_t last_entry, struct log_param *lp)
{ {
uint16_t page; coffee_page_t page;
int16_t match_index; int16_t match_index;
int16_t i; int16_t i;
uint16_t log_entry_size; uint16_t log_entry_size;
@ -545,13 +545,13 @@ create_log_name(unsigned char *new, int max_size, unsigned char *old)
return new; return new;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int16_t static coffee_page_t
create_log(int16_t file_page, struct file_header *hdr) create_log(coffee_page_t file_page, struct file_header *hdr)
{ {
int16_t log_page; coffee_page_t log_page;
unsigned char log_name[sizeof(hdr->name)]; unsigned char log_name[sizeof(hdr->name)];
uint16_t log_entry_size, log_entries; uint16_t log_entry_size, log_entries;
uint32_t size; coffee_offset_t size;
int i; int i;
log_entry_size = hdr->log_entry_size == 0 ? log_entry_size = hdr->log_entry_size == 0 ?
@ -583,13 +583,13 @@ create_log(int16_t file_page, struct file_header *hdr)
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int static int
flush_log(uint16_t file_page) flush_log(coffee_page_t file_page)
{ {
int16_t log_page, new_file_page; coffee_page_t log_page, new_file_page;
struct file_header hdr, hdr2; struct file_header hdr, hdr2;
int fd, n; int fd, n;
char buf[64]; char buf[64];
int32_t offset; coffee_offset_t offset;
READ_HEADER(&hdr, file_page); READ_HEADER(&hdr, file_page);
log_page = hdr.log_page; log_page = hdr.log_page;
@ -655,8 +655,8 @@ static int
write_log_page(struct file_desc *fdp, struct log_param *lp) write_log_page(struct file_desc *fdp, struct log_param *lp)
{ {
struct file_header hdr; struct file_header hdr;
uint16_t page; coffee_page_t page;
int log_page; coffee_page_t log_page;
int16_t log_entry; int16_t log_entry;
uint16_t log_entry_size; uint16_t log_entry_size;
uint16_t log_entries; uint16_t log_entries;
@ -815,8 +815,8 @@ void
cfs_close(int fd) cfs_close(int fd)
{ {
struct file_header hdr; struct file_header hdr;
uint16_t current_page, i; coffee_page_t current_page;
int part_size; int part_size, i;
uint8_t eof_hint; uint8_t eof_hint;
if(FD_VALID(fd)) { if(FD_VALID(fd)) {
@ -881,7 +881,7 @@ cfs_read(int fd, void *buf, unsigned size)
struct file_desc *fdp; struct file_desc *fdp;
unsigned remains; unsigned remains;
int r; int r;
int32_t base, offset; coffee_offset_t base, offset;
struct log_param lp; struct log_param lp;
if(!(FD_VALID(fd) && FD_READABLE(fd))) { if(!(FD_VALID(fd) && FD_READABLE(fd))) {
@ -990,7 +990,7 @@ cfs_opendir(struct cfs_dir *dir, const char *name)
return -1; return -1;
} }
*(uint16_t *)dir->dummy_space = 0; *(coffee_page_t *)dir->dummy_space = 0;
return 0; return 0;
} }
@ -999,9 +999,9 @@ int
cfs_readdir(struct cfs_dir *dir, struct cfs_dirent *entry) cfs_readdir(struct cfs_dir *dir, struct cfs_dirent *entry)
{ {
struct file_header hdr; struct file_header hdr;
uint16_t page; coffee_page_t page;
for(page = *(uint16_t *)dir->dummy_space; page < COFFEE_PAGE_COUNT;) { for(page = *(coffee_page_t *)dir->dummy_space; page < COFFEE_PAGE_COUNT;) {
watchdog_periodic(); watchdog_periodic();
READ_HEADER(&hdr, page); READ_HEADER(&hdr, page);
if(COFFEE_PAGE_FREE(hdr)) { if(COFFEE_PAGE_FREE(hdr)) {
@ -1013,7 +1013,7 @@ cfs_readdir(struct cfs_dir *dir, struct cfs_dirent *entry)
entry->name[sizeof(entry->name) - 1] = '\0'; entry->name[sizeof(entry->name) - 1] = '\0';
entry->size = find_offset_in_file(page); entry->size = find_offset_in_file(page);
page += hdr.max_pages; page += hdr.max_pages;
*(uint16_t *)dir->dummy_space = page; *(coffee_page_t *)dir->dummy_space = page;
return 0; return 0;
} else { } else {
page += hdr.max_pages; page += hdr.max_pages;
@ -1071,7 +1071,7 @@ cfs_coffee_reserve(const char *name, uint32_t size)
int int
cfs_coffee_configure_log(const char *file, unsigned log_size, unsigned log_entry_size) cfs_coffee_configure_log(const char *file, unsigned log_size, unsigned log_entry_size)
{ {
int16_t page; coffee_page_t page;
struct file_header hdr; struct file_header hdr;
page = find_file(file); page = find_file(file);

View file

@ -65,4 +65,7 @@
void cfs_coffee_arch_erase(uint16_t sector); void cfs_coffee_arch_erase(uint16_t sector);
typedef int16_t coffee_page_t;
typedef uint16_t coffee_offset_t;
#endif /* !COFFEE_ARCH_H */ #endif /* !COFFEE_ARCH_H */

View file

@ -1,6 +1,3 @@
#ifndef CFS_COFFEE_ARCH_H
#define CFS_COFFEE_ARCH_H
/* /*
* Copyright (c) 2008, Swedish Institute of Computer Science * Copyright (c) 2008, Swedish Institute of Computer Science
* All rights reserved. * All rights reserved.
@ -35,11 +32,14 @@
/** /**
* \file * \file
* Coffee architecture-dependent header for the Tmote Sky platform. * Coffee architecture-dependent header for the native platform.
* \author * \author
* Nicolas Tsiftes <nvt@sics.se> * Nicolas Tsiftes <nvt@sics.se>
*/ */
#ifndef CFS_COFFEE_ARCH_H
#define CFS_COFFEE_ARCH_H
#include "contiki-conf.h" #include "contiki-conf.h"
#include "dev/xmem.h" #include "dev/xmem.h"
@ -72,4 +72,8 @@
#define WRITE_HEADER(hdr, page) \ #define WRITE_HEADER(hdr, page) \
COFFEE_WRITE((hdr), sizeof (*hdr), (page) * COFFEE_PAGE_SIZE) COFFEE_WRITE((hdr), sizeof (*hdr), (page) * COFFEE_PAGE_SIZE)
/* Coffee types. */
typedef int16_t coffee_page_t;
typedef int32_t coffee_offset_t;
#endif /* !COFFEE_ARCH_H */ #endif /* !COFFEE_ARCH_H */

View file

@ -43,6 +43,7 @@
#include "contiki-conf.h" #include "contiki-conf.h"
#include "dev/xmem.h" #include "dev/xmem.h"
/* Coffee configuration parameters. */
#define COFFEE_SECTOR_SIZE 65536UL #define COFFEE_SECTOR_SIZE 65536UL
#define COFFEE_PAGE_SIZE 256UL #define COFFEE_PAGE_SIZE 256UL
#define COFFEE_START COFFEE_SECTOR_SIZE #define COFFEE_START COFFEE_SECTOR_SIZE
@ -54,6 +55,7 @@
#define COFFEE_LOG_TABLE_LIMIT 256 #define COFFEE_LOG_TABLE_LIMIT 256
#define COFFEE_DIR_CACHE_ENTRIES 16 #define COFFEE_DIR_CACHE_ENTRIES 16
/* Flash operations. */
#define COFFEE_WRITE(buf, size, offset) \ #define COFFEE_WRITE(buf, size, offset) \
xmem_pwrite((char *)(buf), (size), COFFEE_START + (offset)) xmem_pwrite((char *)(buf), (size), COFFEE_START + (offset))
@ -63,4 +65,8 @@
#define COFFEE_ERASE(sector) \ #define COFFEE_ERASE(sector) \
xmem_erase(COFFEE_SECTOR_SIZE, COFFEE_START + (sector) * COFFEE_SECTOR_SIZE) xmem_erase(COFFEE_SECTOR_SIZE, COFFEE_START + (sector) * COFFEE_SECTOR_SIZE)
/* Coffee types. */
typedef int16_t coffee_page_t;
typedef int32_t coffee_offset_t;
#endif /* !COFFEE_ARCH_H */ #endif /* !COFFEE_ARCH_H */