MARMEX-VB : "Mary Camera module" library

Dependents:   MARMEX_VB_test MARMEX_VB_Hello

MARMEX-VB (MARY-VB) camera module library for mbed. (This module may be available in Japan only.)

Kown problem / 既知の問題

The read data may have contouring. In this case, it may require reset or changing order of data reading. The order change API is available as "read_order_change()" function.
カメラから読み出したデータに擬似輪郭が発生することがあります.この問題にはシステム全体のリセットを行うか,または読み出し順の変更を行うことで対処して下さい.読み出し順の変更はAPIの"read_order_change()"関数を使うことができます.

Revision:
4:8ef31b67c0ab
Parent:
3:7f26004cfbce
Child:
5:84e6c89a9a6d
--- a/MARMEX_VB.cpp	Mon Jun 16 14:02:58 2014 +0000
+++ b/MARMEX_VB.cpp	Thu Jun 19 12:21:43 2014 +0000
@@ -1,8 +1,8 @@
 /** MARMEX_VB Camera control library
  *
  *  @class   MARMEX_VB
- *  @version 0.3
- *  @date    16-Jun-2014
+ *  @version 0.4
+ *  @date    19-Jun-2014
  *
  *  Released under the Apache License, Version 2.0 : http://mbed.org/handbook/Apache-Licence
  *
@@ -275,7 +275,7 @@
     } else {
 
 #define OPTIMIZE_KEEP_ASSERTING_CS_DURING_LINE_DATA_TRANSFER
-#ifdef  OPTIMIZE_KEEP_ASSERTING_CS_DURING_LINE_DATA_TRANSFER 
+#ifdef  OPTIMIZE_KEEP_ASSERTING_CS_DURING_LINE_DATA_TRANSFER
         //  optimized by IO register access and loop unroll
         _cs = 0;
 
@@ -321,6 +321,91 @@
 #endif
 }
 
+
+
+
+void MARMEX_VB::read_a_line_SPI_FIFO_READ( short *p, int line_number, int x_offset, int n_of_pixels )
+{
+#define FIFO_DEPTH  4
+
+#ifdef  TARGET_MBED_LPC1768
+#define SPI_PORT_SELECTOR   LPC_SSP1
+#endif
+
+#ifdef  TARGET_LPC11U35_501
+#define SPI_PORT_SELECTOR   LPC_SSP0
+#endif
+
+#ifdef  TARGET_LPC11U24_401
+#define SPI_PORT_SELECTOR   LPC_SSP0
+#endif
+
+    char                reg = COMMAND_READ | CAMERA_DATA_REGISTER | COMMAND_ADDR_INCREMENT;
+    int                 n;
+
+    if ( line_number < 0 )
+        return;
+
+    //  set camera module's buffer address
+    set_address( line_number * get_horizontal_size() * BYTE_PER_PIXEL + x_offset * BYTE_PER_PIXEL );
+
+    //  put a read command, first return byte should be ignored
+    read_register( CAMERA_DATA_REGISTER );
+
+
+    //  optimized by SPI-FIFO access
+
+    if ( _read_order_change ) {
+        _cs = 0;
+
+        for(n = FIFO_DEPTH; n > 0; n--) {
+            SPI_PORT_SELECTOR->DR = reg;
+        }
+
+        do {
+            while (!(SPI_PORT_SELECTOR->SR & 0x4));
+            *p  = (SPI_PORT_SELECTOR->DR & 0xFF);
+
+            if (n++ < (n_of_pixels << 1) - FIFO_DEPTH)
+                SPI_PORT_SELECTOR->DR = reg;
+
+            while (!(SPI_PORT_SELECTOR->SR & 0x4));
+            *p++    |= (SPI_PORT_SELECTOR->DR << 8);
+
+            if (n++ < (n_of_pixels << 1) - FIFO_DEPTH)
+                SPI_PORT_SELECTOR->DR = reg;
+
+        } while(n < (n_of_pixels << 1));
+
+        _cs = 1;
+    } else {
+        read_register( CAMERA_DATA_REGISTER );
+
+        _cs = 0;
+
+        for(n = FIFO_DEPTH; n > 0; n--) {
+            SPI_PORT_SELECTOR->DR = reg;
+        }
+
+        do {
+            while (!(SPI_PORT_SELECTOR->SR & 0x4));
+            *p = (SPI_PORT_SELECTOR->DR << 8);
+
+            if (n++ < (n_of_pixels << 1) - FIFO_DEPTH)
+                SPI_PORT_SELECTOR->DR = reg;
+
+            while (!(SPI_PORT_SELECTOR->SR & 0x4));
+            *p++ |= (SPI_PORT_SELECTOR->DR & 0xFF);
+
+            if (n++ < (n_of_pixels << 1) - FIFO_DEPTH)
+                SPI_PORT_SELECTOR->DR = reg;
+
+        } while(n < (n_of_pixels << 1));
+
+        _cs = 1;
+    }
+}
+
 void MARMEX_VB::open_transfer( void )
 {
     //  send command to pause the camera buffer update