X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fflash25.c;h=f12e41e9aee7fa40714809b12232b7175cd0ce92;hb=7911a6f01bc8a19f220f98e2fdc8595f65996853;hp=0dd84ce7f7f85c2b164b7a80b63e29bc0b964067;hpb=6c0e5e586a2720df61f4bcd3904368bf670f5216;p=bertos.git diff --git a/bertos/drv/flash25.c b/bertos/drv/flash25.c index 0dd84ce7..f12e41e9 100644 --- a/bertos/drv/flash25.c +++ b/bertos/drv/flash25.c @@ -27,17 +27,15 @@ * the GNU General Public License. * * Copyright 2007 Develer S.r.l. (http://www.develer.com/) - * * --> * - * \brief Function library for serial Flash memory. + * \brief Function library for serial Flash memory. * * Module provide a kfile interface, that ensure an abstraction * from comunication channel and give a standard interface. * Typicaly this kind of memory use an SPI bus, but you should * use another comunication channel you have defined. * - * \version $Id$ * \author Daniele Basile */ @@ -45,9 +43,7 @@ * We use a spi bus, thus include hardware specific definition. * If you use another channel you must redefine this macros. */ -#include "hw_spi.h" - -#include +#include "hw/hw_spi.h" #include #include @@ -55,20 +51,16 @@ #include #include -#if CONFIG_KERNEL -#include -#endif +#include +#include /* cpu_relax() */ -/** - * Global definition of channel handler (usually SPI). - */ -static KFile *channel; +#warning FIXME:This file was changed, but is untested! /** * Wait until flash memory is ready. */ -static void flash25_waitReady(void) +static void flash25_waitReady(Flash25 *fd) { uint8_t stat; @@ -76,28 +68,26 @@ static void flash25_waitReady(void) { CS_ENABLE(); - kfile_putc(FLASH25_RDSR, channel); - stat = kfile_getc(channel); + kfile_putc(FLASH25_RDSR, fd->channel); + stat = kfile_getc(fd->channel); CS_DISABLE(); if (!(stat & RDY_BIT)) break; - #if CONFIG_KERNEL - else - proc_switch(); - #endif + + cpu_relax(); } } /** * Send a single command to serial flash memory. */ -static void flash25_sendCmd(Flash25Opcode cmd) +static void flash25_sendCmd(Flash25 *fd, Flash25Opcode cmd) { CS_ENABLE(); - kfile_putc(cmd, channel); + kfile_putc(cmd, fd->channel); CS_DISABLE(); } @@ -108,7 +98,7 @@ static void flash25_sendCmd(Flash25Opcode cmd) * try to read manufacturer id of serial memory, * then check if is equal to selected type. */ -static bool flash25_pin_init(void) +static bool flash25_pin_init(Flash25 *fd) { uint8_t device_id; uint8_t manufacturer; @@ -121,10 +111,10 @@ static bool flash25_pin_init(void) * comunication channel * TODO:controllare se ha senso */ - kfile_putc(FLASH25_RDID, channel); + kfile_putc(FLASH25_RDID, fd->channel); - manufacturer = kfile_getc(channel); - device_id = kfile_getc(channel); + manufacturer = kfile_getc(fd->channel); + device_id = kfile_getc(fd->channel); CS_DISABLE(); @@ -142,15 +132,15 @@ static bool flash25_pin_init(void) * the size and seek_pos in kfile stucture. * Return a kfile pointer, after assert check. */ -static KFile * flash25_reopen(struct KFile *fd) +static KFile * flash25_reopen(struct KFile *_fd) { - KFILE_ASSERT_GENERIC(fd); + Flash25 *fd = FLASH25_CAST(_fd); - fd->seek_pos = 0; - fd->size = FLASH25_MEM_SIZE; + fd->fd.seek_pos = 0; + fd->fd.size = FLASH25_MEM_SIZE; kprintf("flash25 file opened\n"); - return fd; + return &fd->fd; } /** @@ -176,33 +166,33 @@ static int flash25_close(UNUSED_ARG(struct KFile *,fd)) * * \return the number of bytes read. */ -static size_t flash25_read(struct KFile *fd, void *buf, size_t size) +static size_t flash25_read(struct KFile *_fd, void *buf, size_t size) { uint8_t *data = (uint8_t *)buf; - KFILE_ASSERT_GENERIC(fd); + Flash25 *fd = FLASH25_CAST(_fd); - ASSERT(fd->seek_pos + size <= fd->size); - size = MIN((uint32_t)size, fd->size - fd->seek_pos); + 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); //kprintf("Reading at addr[%lu], size[%d]\n", fd->seek_pos, size); CS_ENABLE(); - kfile_putc(FLASH25_READ, channel); + kfile_putc(FLASH25_READ, fd->channel); /* * Address that we want to read. */ - kfile_putc((fd->seek_pos >> 16) & 0xFF, channel); - kfile_putc((fd->seek_pos >> 8) & 0xFF, channel); - kfile_putc(fd->seek_pos & 0xFF, channel); + kfile_putc((fd->fd.seek_pos >> 16) & 0xFF, fd->channel); + kfile_putc((fd->fd.seek_pos >> 8) & 0xFF, fd->channel); + kfile_putc(fd->fd.seek_pos & 0xFF, fd->channel); - kfile_read(channel, data, size); + kfile_read(fd->channel, data, size); CS_DISABLE(); - fd->seek_pos += size; + fd->fd.seek_pos += size; return size; } @@ -226,30 +216,31 @@ static size_t flash25_read(struct KFile *fd, void *buf, size_t size) * * \return the number of bytes write. */ -static size_t flash25_write(struct KFile *fd, const void *_buf, size_t size) +static size_t flash25_write(struct KFile *_fd, const void *_buf, size_t size) { flash25Offset_t offset; flash25Size_t total_write = 0; flash25Size_t wr_len; const uint8_t *data = (const uint8_t *) _buf; - KFILE_ASSERT_GENERIC(fd); - ASSERT(fd->seek_pos + size <= fd->size); + Flash25 *fd = FLASH25_CAST(_fd); + + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= fd->fd.size); - size = MIN((flash25Size_t)size, fd->size - fd->seek_pos); + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); while (size) { - offset = fd->seek_pos % (flash25Size_t)FLASH25_PAGE_SIZE; + offset = fd->fd.seek_pos % (flash25Size_t)FLASH25_PAGE_SIZE; wr_len = MIN((flash25Size_t)size, FLASH25_PAGE_SIZE - (flash25Size_t)offset); - kprintf("[seek_pos-<%lu>, offset-<%d>]\n", fd->seek_pos, offset); + kprintf("[seek_pos-<%lu>, offset-<%d>]\n", fd->fd.seek_pos, offset); /* * We check serial flash memory state, and wait until ready-flag * is high. */ - flash25_waitReady(); + flash25_waitReady(fd); /* * Start write cycle. @@ -263,29 +254,29 @@ static size_t flash25_write(struct KFile *fd, const void *_buf, size_t size) * \note: the same byte cannot be reprogrammed without * erasing the whole sector first. */ - flash25_sendCmd(FLASH25_WREN); + flash25_sendCmd(fd, FLASH25_WREN); CS_ENABLE(); - kfile_putc(FLASH25_PROGRAM, channel); + kfile_putc(FLASH25_PROGRAM, fd->channel); /* * Address that we want to write. */ - kfile_putc((fd->seek_pos >> 16) & 0xFF, channel); - kfile_putc((fd->seek_pos >> 8) & 0xFF, channel); - kfile_putc(fd->seek_pos & 0xFF, channel); + kfile_putc((fd->fd.seek_pos >> 16) & 0xFF, fd->channel); + kfile_putc((fd->fd.seek_pos >> 8) & 0xFF, fd->channel); + kfile_putc(fd->fd.seek_pos & 0xFF, fd->channel); - kfile_write(channel, data, wr_len); + kfile_write(fd->channel, data, wr_len); CS_DISABLE(); data += wr_len; - fd->seek_pos += wr_len; + fd->fd.seek_pos += wr_len; size -= wr_len; total_write += wr_len; } - kprintf("written %u bytes\n", total_write); + kprintf("written %lu bytes\n", total_write); return total_write; } @@ -297,7 +288,7 @@ static size_t flash25_write(struct KFile *fd, const void *_buf, size_t size) * \note A sector size is FLASH25_SECTOR_SIZE. * This operation could take a while. */ -void flash25_sectorErase(Flash25Sector sector) +void flash25_sectorErase(Flash25 *fd, Flash25Sector sector) { /* @@ -316,14 +307,14 @@ void flash25_sectorErase(Flash25Sector sector) * determinate if any address within the sector * is selected. */ - kfile_putc(FLASH25_WREN, channel); - kfile_putc(FLASH25_SECTORE_ERASE, channel); + kfile_putc(FLASH25_WREN, fd->channel); + kfile_putc(FLASH25_SECTORE_ERASE,fd-> channel); /* * Address inside the sector that we want to * erase. */ - kfile_putc(sector, channel); + kfile_putc(sector, fd->channel); CS_DISABLE(); @@ -331,10 +322,9 @@ void flash25_sectorErase(Flash25Sector sector) * We check serial flash memory state, and wait until ready-flag * is hight. */ - flash25_waitReady(); - - DB(kprintf("Erased sector [%d] in %d ms\n", sector, ticks_to_ms(timer_clock() - start_time))); + flash25_waitReady(fd); + DB(kprintf("Erased sector [%ld] in %ld ms\n", (unsigned long)sector, (unsigned long)ticks_to_ms(timer_clock() - start_time))); } /** @@ -344,7 +334,7 @@ void flash25_sectorErase(Flash25Sector sector) * * \note This operation could take a while. */ -void flash25_chipErase(void) +void flash25_chipErase(Flash25 *fd) { /* * Erase all chip could take a while, @@ -358,81 +348,49 @@ void flash25_chipErase(void) * enable write with a WREN opcode command, before * the CHIP_ERASE opcode. */ - flash25_sendCmd(FLASH25_WREN); - flash25_sendCmd(FLASH25_CHIP_ERASE); + flash25_sendCmd(fd, FLASH25_WREN); + flash25_sendCmd(fd, FLASH25_CHIP_ERASE); /* * We check serial flash memory state, and wait until ready-flag * is high. */ - flash25_waitReady(); + flash25_waitReady(fd); - DB(kprintf("Erased all memory in %d ms\n", ticks_to_ms(timer_clock() - start_time))); + DB(kprintf("Erased all memory in %ld ms\n", ticks_to_ms(timer_clock() - start_time))); } /** * Init data flash memory interface. */ -void flash25_init(struct KFile *fd, struct KFile *_channel) +void flash25_init(Flash25 *fd, KFile *ch) { + + ASSERT(fd); + ASSERT(ch); + //Set kfile struct type as a generic kfile structure. - DB(fd->_type = KFT_GENERIC); + DB(fd->fd._type = KFT_FLASH25); // Set up data flash programming functions. - fd->reopen = flash25_reopen; - fd->close = flash25_close; - fd->read = flash25_read; - fd->write = flash25_write; - fd->seek = kfile_genericSeek; + fd->fd.reopen = flash25_reopen; + fd->fd.close = flash25_close; + fd->fd.read = flash25_read; + fd->fd.write = flash25_write; + fd->fd.seek = kfile_genericSeek; /* * Init a local channel structure and flash kfile interface. */ - channel = _channel; - flash25_reopen(fd); + fd->channel = ch; + flash25_reopen(&fd->fd); /* * Init data flash memory and micro pin. */ - if (!flash25_pin_init()) + if (!flash25_pin_init(fd)) ASSERT(0); } -#if CONFIG_TEST -/** - * Test function for flash25. - * - * \note: This implentation use a SPI channel. - */ -bool flash25_test(KFile *channel) -{ - KFile fd; - uint8_t test_buf[256]; - - /* - * Init a spi kfile interface and - * flash driver. - */ - flash25_init(&fd, channel); - - kprintf("Init serial flash\n"); - - flash25_chipErase(); - - flash25_sectorErase(FLASH25_SECT1); - flash25_sectorErase(FLASH25_SECT2); - flash25_sectorErase(FLASH25_SECT3); - flash25_sectorErase(FLASH25_SECT4); - - /* - * Launche a kfile test interface. - */ - kprintf("Kfile test start..\n"); - if (!kfile_test(&fd, test_buf, NULL, sizeof(test_buf))) - return false; - - return true; -} -#endif /* CONFIG_TEST */