Remove cvs logs.
[bertos.git] / drv / dataflash.c
index 9089fa978d588556537f5306b67b735f86608cab..e2d2e291161188e8c31c42df3e9f535d8253c568 100644 (file)
@@ -64,7 +64,7 @@ static bool page_modified = false;
  * This function send only 4 byte, for opcode, page address and
  * byte address.
  */
-static void send_cmd(dataflash_t page_addr, dataflash_t byte_addr, DataFlashOpcode opcode)
+static void send_cmd(dataflash_t page_addr, dataflashOffset_t byte_addr, DataFlashOpcode opcode)
 {
 
        /*
@@ -183,6 +183,12 @@ static uint8_t dataflash_stat(void)
        stat = spi_sendRecv(DFO_READ_STATUS);
        stat = spi_sendRecv(0x00);
 
+       /*
+        * Note: this function could be call one more time
+        * to check register status (es. check if memory has been
+        * teminate one operation), and so we don't disable CS to
+        * allow fast reading of register status.
+        */
        return stat;
 }
 
@@ -192,9 +198,11 @@ static uint8_t dataflash_stat(void)
  * return status register value.
  *
  */
-static uint8_t dataflash_cmd(dataflash_t page_addr, dataflash_t byte_addr, DataFlashOpcode opcode)
+static uint8_t dataflash_cmd(dataflash_t page_addr, dataflashOffset_t byte_addr, DataFlashOpcode opcode)
 {
 
+       uint8_t stat;
+
        send_cmd(page_addr, byte_addr, opcode);
 
        CS_TOGGLE();
@@ -205,7 +213,14 @@ static uint8_t dataflash_cmd(dataflash_t page_addr, dataflash_t byte_addr, DataF
         */
        while(!(dataflash_stat() & BUSY_BIT));
 
-       return (dataflash_stat());
+       stat = dataflash_stat();
+
+       /*
+        * Data flash has completed a bus cycle, so disable CS.
+        */
+       CS_DISABLE();
+
+       return (stat);
 
 }
 
@@ -213,7 +228,7 @@ static uint8_t dataflash_cmd(dataflash_t page_addr, dataflash_t byte_addr, DataF
  * Read one byte from main data flash memory or buffer data
  * flash memory.
  */
-static uint8_t dataflash_read_byte(dataflash_t page_addr, dataflash_t byte_addr, DataFlashOpcode opcode)
+static uint8_t dataflash_read_byte(dataflash_t page_addr, dataflashOffset_t byte_addr, DataFlashOpcode opcode)
 {
        uint8_t data;
 
@@ -234,6 +249,7 @@ static uint8_t dataflash_read_byte(dataflash_t page_addr, dataflash_t byte_addr,
 
        spi_sendRecv(0x00);         //Send 8 don't care bit.
        data = spi_sendRecv(0x00);  //Read byte.
+
        CS_DISABLE();
 
        return data;
@@ -243,7 +259,7 @@ static uint8_t dataflash_read_byte(dataflash_t page_addr, dataflash_t byte_addr,
  * Read \a len bytes from main data flash memory or buffer data
  * flash memory, and put it in \a *block.
  */
-static void dataflash_read_block(dataflash_t page_addr, dataflash_t byte_addr, DataFlashOpcode opcode, uint8_t *block, dataflashSize_t len)
+static void dataflash_read_block(dataflash_t page_addr, dataflashOffset_t byte_addr, DataFlashOpcode opcode, uint8_t *block, dataflashSize_t len)
 {
 
        send_cmd(page_addr, byte_addr, opcode);
@@ -275,7 +291,7 @@ static void dataflash_read_block(dataflash_t page_addr, dataflash_t byte_addr, D
  * flash. To perform write in main memory you must before write in buffer
  * data flash memory, an then send command to write page in main memory.
  */
-static void dataflash_write_block(dataflash_t byte_addr, DataFlashOpcode opcode, uint8_t *block, dataflashSize_t len)
+static void dataflash_write_block(dataflashOffset_t byte_addr, DataFlashOpcode opcode, uint8_t *block, dataflashSize_t len)
 {
 
        send_cmd(0x00, byte_addr, opcode);
@@ -293,8 +309,6 @@ static void dataflash_write_block(dataflash_t byte_addr, DataFlashOpcode opcode,
 static void dataflash_loadPage(dataflash_t page_addr)
 {
        dataflash_cmd(page_addr, 0x00, DFO_MOV_MEM_TO_BUFF1);
-
-       CS_DISABLE();
 }
 
 /**
@@ -306,7 +320,6 @@ void dataflash_flush(void)
        {
                dataflash_cmd(previous_page, 0x00, DFO_WRITE_BUFF1_TO_MEM_E);
 
-               CS_DISABLE();
                page_modified = false;
 
                kprintf("\n::=> Flush page:... <%ld>\n", previous_page);
@@ -326,7 +339,7 @@ static bool dataflash_open(struct _KFile *fd, UNUSED_ARG(const char *, name), UN
 
        previous_page = 0;
        fd->seek_pos = 0;
-       fd->size = (dataflashAddr_t)DATAFLASH_PAGE_SIZE *       (dataflashAddr_t)DATAFLASH_NUM_PAGE;
+       fd->size = (dataflashAddr_t)DATAFLASH_PAGE_SIZE * (dataflashAddr_t)DATAFLASH_NUM_PAGE;
 
        /* Load select page memory from data flash memory*/
        dataflash_loadPage(previous_page);
@@ -349,25 +362,27 @@ static bool dataflash_close(UNUSED_ARG(struct _KFile *,fd))
  * Move \a fd file seek position of \a offset bytes
  * from current position.
  */
-static int32_t dataflash_seek(struct _KFile *fd, int32_t offset, KSeekMode whence)
+static int32_t dataflash_seek(struct _KFile *fd, kfile_off_t offset, KSeekMode whence)
 {
        uint32_t seek_pos;
 
        switch(whence)
        {
-               case KSM_SEEK_SET:
-                       seek_pos = 0;
-                       break;
-               case KSM_SEEK_END:
-                       seek_pos = fd->size - 1;
-                       break;
-               case KSM_SEEK_CUR:
-                       seek_pos = fd->seek_pos;
-                       break;
-               default:
-                       ASSERT(0);
-                       return -1;
-                       break;
+
+       case KSM_SEEK_SET:
+               seek_pos = 0;
+               break;
+       case KSM_SEEK_END:
+               seek_pos = fd->size - 1;
+               break;
+       case KSM_SEEK_CUR:
+               seek_pos = fd->seek_pos;
+               break;
+       default:
+               ASSERT(0);
+               return -1;
+               break;
+
        }
 
        /* Bound check */
@@ -384,12 +399,20 @@ static int32_t dataflash_seek(struct _KFile *fd, int32_t offset, KSeekMode whenc
 }
 
 /**
- * Read from file \a fd \a size bytes and put it in buffer \a buf
+ * Read \a _buf lenght \a size byte from data flash memmory.
+ *
+ * \note For read in data flash memory, we
+ * check flag page_modified, if is true (that mean
+ * we had been written a byte in buffer memory) we
+ * flush current page in data flash main memory, and
+ * then read byte from memory, else we read byte
+ * directly from data flash main memory.
+ *
  * \return the number of bytes read.
  */
 static size_t dataflash_read(struct _KFile *fd, void *buf, size_t size)
 {
-       dataflashAddr_t byte_addr;
+       dataflashOffset_t byte_addr;
        dataflashAddr_t page_addr;
        uin8_t *data = (uint8_t *)buf;
 
@@ -400,11 +423,10 @@ static size_t dataflash_read(struct _KFile *fd, void *buf, size_t size)
        kprintf("Reading at pos[%u]\n", fd->seek_pos);
 
        /*
-        * We select from absolute address page address
-        * and byte address in page.
+        * We select page and offest from absolute address.
         */
        page_addr = fd->seek_pos / (dataflashAddr_t)DATAFLASH_PAGE_SIZE;
-       byte_addr = fd->seek_pos % (dataflashAddr_t)DATAFLASH_PAGE_SIZE;
+       byte_addr = fd->seek_pos % (dataflashOffset_t)DATAFLASH_PAGE_SIZE;
 
 
        kprintf(" [page-<%ld>, byte-<%ld>]", page_addr, byte_addr);
@@ -427,14 +449,20 @@ static size_t dataflash_read(struct _KFile *fd, void *buf, size_t size)
 }
 
 /**
- * Write program memory.
- * Write \a size bytes from buffer \a _buf to file \a fd
- * \note Write operations are buffered.
+ * Write \a _buf in data flash memory
+ *
+ * \note For write \a _buf in data flash memory, we must
+ * before write in buffer data flash memory, and at end of write,
+ * we put page in data flash main memory. If we write in two
+ * different page, we put in main memory current page and reload
+ * page witch we want write.
+ *
+ * \return the number of bytes write.
  */
 static size_t dataflash_write(struct _KFile *fd, const void *_buf, size_t size)
 {
 
-       dataflashAddr_t byte_addr;
+       dataflashOffset_t byte_addr;
        dataflashAddr_t current_page;
 
        uint8_t *data = (uint8_t *) _buf;
@@ -447,11 +475,10 @@ static size_t dataflash_write(struct _KFile *fd, const void *_buf, size_t size)
        while (size)
        {
                /*
-               * We select from absolute address page address
-               * and byte address in page.
+               * We select page and offest from absolute address.
                */
                current_page = fd->seek_pos / (dataflashAddr_t)DATAFLASH_PAGE_SIZE;
-               byte_addr = fd->seek_pos % (dataflashAddr_t)DATAFLASH_PAGE_SIZE;
+               byte_addr = fd->seek_pos % (dataflashOffset_t)DATAFLASH_PAGE_SIZE;
 
 
                size_t wr_len = MIN(size, DATAFLASH_PAGE_SIZE - byte_addr);
@@ -518,6 +545,9 @@ void dataflash_test(void)
        uint8_t test_buf[] = "0123456789 Develer s.r.l.";
        uint8_t cmp_buf[];
 
+       int tb_len = sizeof(test_buf);
+       int tmp_len = 0;
+
        kprintf("\n======= Data Flash test function =========================================\n");
        kprintf("\nThe string test is: %s\n\n", test_buf);
 
@@ -526,64 +556,105 @@ void dataflash_test(void)
        /*  TEST 1 */
 
        // Seek to addr 0
-       if (fd.seek(&fd, 0, SEEK_SET) != 0)
+       if (!fd.seek(&fd, 0, SEEK_SET))
                goto dataflash_test_end;
 
        // Test flash write to address 0 (page 0)
-       if (!fd->write(&fd, test_buf, sizeof(test_buf)))
+       tmp_len = fd->write(&fd, test_buf, len_tb)
+       if (len_tb != tmp_len)
+       {
+               kprintf("Test 1: Wrong numer write bytes! expecteded [%d], write [%d]\n", tb_len, tmp_len);
                goto dataflash_test_end;
+       }
 
        // Seek to addr 0
        if (fd.seek(&fd, 0, SEEK_SET) != 0)
                goto dataflash_test_end;
+       tmp_len = 0;
 
        // Test flash read to address 0 (page 0)
-       if (!fd->read(&fd, cmp_buf, sizeof(test_buf)))
+       tmp_len = fd->read(&fd, cmp_buf, len_tb);
+       if (len_tb != tmp_len)
+       {
+               kprintf("Test 1: Wrong numer read bytes! expecteded [%d], read [%d]\n", tb_len, tmp_len);
                goto dataflash_test_end;
+       }
 
-       // Compare if are egual.
-       if ((memcmp(cmp_buf,test_buf, sizeof(test_buf)) == 0)
+       // Compare if they are equal
+       if ((memcmp(cmp_buf,test_buf, len_tb) == 0)
+       {
+               kprintf("Test 1: Readed test buf don't much!\n");
                goto dataflash_test_end;
+       }
 
        /*  TEST 2 */
 
        // Go to middle address memory.
-       fd.seek(&fd, (((dataflashAddr_t)DFLASH_PAGE_SIZE * (dataflashAddr_t)DFLASH_NUM_PAGE) / 2), SEEK_CUR);
+       if (!fd.seek(&fd, (((dataflashAddr_t)DFLASH_PAGE_SIZE * (dataflashAddr_t)DFLASH_NUM_PAGE) / 2), SEEK_CUR))
+               goto dataflash_test_end;
+       tmp_len = 0;
 
        // Test flash write at the middle of memory
-       if (!fd->write(&fd, test_buf, sizeof(test_buf)))
+       tmp_len = fd->write(&fd, test_buf, len_tb);
+       if (len_tb != tmp_len)
+       {
+               kprintf("Test 2: Wrong numer write bytes! expecteded [%d], write [%d]\n", tb_len, tmp_len);
                goto dataflash_test_end;
+       }
 
        // Go to middle address memory.
-       fd.seek(&fd, (((dataflashAddr_t)DFLASH_PAGE_SIZE * (dataflashAddr_t)DFLASH_NUM_PAGE) / 2), SEEK_CUR);
+       if (!fd.seek(&fd, (((dataflashAddr_t)DFLASH_PAGE_SIZE * (dataflashAddr_t)DFLASH_NUM_PAGE) / 2), SEEK_CUR))
+               goto dataflash_test_end;
+       tmp_len = 0;
 
        // Test flash read  at the middle of memory
-       if (!fd->read(&fd, cmp_buf, sizeof(test_buf)))
+       tmp_len = fd->read(&fd, cmp_buf, len_tb);
+       if (len_tb != tmp_len)
+       {
+               kprintf("Test 2: Wrong numer read bytes! expecteded [%d], read [%d]\n", tb_len, tmp_len);
                goto dataflash_test_end;
+       }
 
-       // Compare if are egual.
-       if ((memcmp(cmp_buf,test_buf, sizeof(test_buf)) == 0)
+       // Compare if they are equal
+       if ((memcmp(cmp_buf,test_buf, len_tb) == 0)
+       {
+               kprintf("Test 2: Readed test buf don't much!\n");
                goto dataflash_test_end;
-
+       }
        /*  TEST 3 */
 
        // Go to end of data flash.
-       fd.seek(&fd, ((dataflashAddr_t)DFLASH_PAGE_SIZE * (dataflashAddr_t)DFLASH_NUM_PAGE) - sizeof(test_buf), SEEK_END);
+       if(!fd.seek(&fd, ((dataflashAddr_t)DFLASH_PAGE_SIZE * (dataflashAddr_t)DFLASH_NUM_PAGE) - len_tb, SEEK_END));
+               goto dataflash_test_end;
+       tmp_len = 0;
 
        // Test flash write at the end of memory
-       if (!fd->write(&fd, test_buf, sizeof(test_buf)))
+       tmp_len = fd->write(&fd, test_buf, len_tb);
+       if (len_tb != tmp_len)
+       {
+               kprintf("Test 3: Wrong numer write bytes! expecteded [%d], write [%d]\n", tb_len, tmp_len);
                goto dataflash_test_end;
+       }
 
        // Go to end of data flash.
-       fd.seek(&fd, ((dataflashAddr_t)DFLASH_PAGE_SIZE * (dataflashAddr_t)DFLASH_NUM_PAGE) - sizeof(test_buf), SEEK_END);
+       if(!fd.seek(&fd, ((dataflashAddr_t)DFLASH_PAGE_SIZE * (dataflashAddr_t)DFLASH_NUM_PAGE) - len_tb, SEEK_END));
+               goto dataflash_test_end;
+       tmp_len = 0
 
        // Test flash read at the end of memory
-       if (!fd->read(&fd, cmp_buf, sizeof(test_buf)))
+       tmp_len = fd->read(&fd, cmp_buf, len_tb);
+       if (len_tb != tmp_len)
+       {
+               kprintf("Test 3: Wrong numer read bytes! expecteded [%d], read [%d]\n", tb_len, tmp_len);
                goto dataflash_test_end;
+       }
 
-       // Compare if are egual.
-       if ((memcmp(cmp_buf,test_buf, sizeof(test_buf)) == 0)
+       // Compare if they are equal
+       if ((memcmp(cmp_buf,test_buf, len_tb) == 0)
+       {
+               kprintf("Test 3: Readed test buf don't much!\n");
                goto dataflash_test_end;
+       }
 
        kprintf("\n");
 
@@ -596,3 +667,4 @@ dataflash_test_end:
        return false;
 
 }
+