X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fdataflash.c;h=cf639e7652c448fef35254afc1e6dde4c7c98479;hb=fbb255258c626502f8d7ba583ca138f903e03b75;hp=b85942a80c6940a6160412d0ffba710d06e409c3;hpb=ab3c5d37b28cb17c4d7ded2c311c138a1e3a673a;p=bertos.git diff --git a/bertos/drv/dataflash.c b/bertos/drv/dataflash.c index b85942a8..cf639e76 100644 --- a/bertos/drv/dataflash.c +++ b/bertos/drv/dataflash.c @@ -31,7 +31,7 @@ * * \brief Function library for dataflash AT45DB family (implementation). * - * \version $Id: dataflash.c 21658 2008-06-05 16:42:54Z asterix $ + * \version $Id$ * \author Daniele Basile * \author Francesco Sacchi */ @@ -50,6 +50,8 @@ #include +#include + #include #include /* cpu_relax() */ @@ -275,6 +277,8 @@ static void dataflash_loadPage(DataFlash *fd, dataflash_page_t page_addr) dataflash_cmd(fd, page_addr, 0x00, DFO_MOV_MEM_TO_BUFF1); } +/* Battfs disk interface section */ + static size_t dataflash_disk_page_read(struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t len) { DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); @@ -293,7 +297,7 @@ static size_t dataflash_disk_buffer_write(struct BattFsSuper *d, pgaddr_t addr, { DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); dataflash_writeBlock(fd, addr, buf, len); - return true; + return len; } static size_t dataflash_disk_buffer_read(struct BattFsSuper *d, pgaddr_t addr, void *buf, size_t len) @@ -309,7 +313,7 @@ static size_t dataflash_disk_buffer_read(struct BattFsSuper *d, pgaddr_t addr, v kfile_putc((byte_addr >> 16) & 0xff, fd->channel); kfile_putc((byte_addr >> 8) & 0xff, fd->channel); - kfile_putc((byte_addr & 0xff, fd->channel); + kfile_putc(byte_addr & 0xff, fd->channel); /* Send additional don't care byte to start read operation */ kfile_putc(0, fd->channel); @@ -317,6 +321,7 @@ static size_t dataflash_disk_buffer_read(struct BattFsSuper *d, pgaddr_t addr, v kfile_read(fd->channel, buf, len); //Read len bytes ad put in buffer. kfile_flush(fd->channel); // Flush channel fd->setCS(false); + return len; } static bool dataflash_disk_page_save(struct BattFsSuper *d, pgcnt_t page) @@ -333,6 +338,35 @@ static bool dataflash_disk_page_erase(struct BattFsSuper *d, pgcnt_t page) return true; } +static int dataflash_close(struct KFile *_fd); + +static bool dataflash_disk_close(struct BattFsSuper *d) +{ + DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); + return dataflash_close(&fd->fd) == 0; +} + +bool dataflash_diskInit(struct BattFsSuper *d, DataFlash *fd, pgcnt_t *page_array) +{ + ASSERT(d); + ASSERT(fd); + d->read = dataflash_disk_page_read; + d->load = dataflash_disk_page_load; + d->bufferWrite = dataflash_disk_buffer_write; + d->bufferRead = dataflash_disk_buffer_read; + d->save = dataflash_disk_page_save; + d->erase = dataflash_disk_page_erase; + d->close = dataflash_disk_close; + d->disk_ctx = fd; + d->page_size = mem_info[fd->dev].page_size; + d->page_count = mem_info[fd->dev].page_cnt; + ASSERT(page_array); + d->page_array = page_array; + return d->page_array && fd; +} + +/* Kfile interface section */ + /** * Flush select page (stored in buffer) in data flash main memory page. */ @@ -350,7 +384,6 @@ static int dataflash_flush(KFile *_fd) return 0; } -/* Kfile interface section */ /** * Close file \a fd. @@ -402,7 +435,7 @@ static size_t dataflash_read(struct KFile *_fd, void *buf, size_t size) uint8_t *data = (uint8_t *)buf; - ASSERT(fd->fd.seek_pos + size <= (kfile_off_t)fd->fd.size); + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= fd->fd.size); size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); LOG_INFO("Reading at pos[%lu]\n", fd->fd.seek_pos); @@ -427,7 +460,7 @@ static size_t dataflash_read(struct KFile *_fd, void *buf, size_t size) dataflash_readBlock(fd, page_addr, byte_addr, data, size); fd->fd.seek_pos += size; - LOG_INFO("Read %ld bytes\n", size); + LOG_INFO("Read %ld bytes\n", (long int)size); return size; } @@ -453,7 +486,7 @@ static size_t dataflash_write(struct KFile *_fd, const void *_buf, size_t size) const uint8_t *data = (const uint8_t *) _buf; - ASSERT(fd->fd.seek_pos + size <= (kfile_off_t)fd->fd.size); + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= fd->fd.size); size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); LOG_INFO("Writing at pos[%lu]\n", fd->fd.seek_pos); @@ -494,7 +527,7 @@ static size_t dataflash_write(struct KFile *_fd, const void *_buf, size_t size) total_write += wr_len; } - LOG_INFO("written %lu bytes\n", total_write); + LOG_INFO("written %lu bytes\n", (long unsigned)total_write); return total_write; }