KSM edits to RA8875

Dependents:   Liz_Test_Code

Revision:
66:468a11f05580
Parent:
62:ba5d33438fda
Child:
68:ab08efabfc88
--- a/RA8875.h	Sun Aug 17 15:38:51 2014 +0000
+++ b/RA8875.h	Sun Aug 31 14:37:37 2014 +0000
@@ -85,7 +85,6 @@
 ///
 /// @todo Add Scroll support for text.
 /// @todo Improve sync between internal and external font support - cursor, window, scroll.
-/// @todo Find out why it can't shift frequency after constructor runs.
 /// @todo Add Hardware reset signal.
 /// @todo Add Keypad Support.
 /// @todo Add high level objects - x-y graph, meter, others... but these will
@@ -1200,17 +1199,23 @@
 
     /// Set the SPI port frequency (in Hz).
     ///
-    /// @note attempts to call this API at runtime, with the display
-    ///         already online, cause the system to lockup. 
-    ///         Investigation continues.
+    /// This uses the mbed SPI driver, and is therefore dependent on
+    /// its capabilities. The RA8875 can accept writes via SPI faster
+    /// than a read can be performed. The frequency set by this API
+    /// is for the SPI writes. It will automatically reduce the SPI
+    /// clock rate when a read is performed, and restore it for the 
+    /// next write.
     ///
-    /// This uses the mbed SPI driver, and is therefore dependent on
-    /// its capabilities. Limited tests were performed for the display
-    /// in the range of 1,000,000 to 10,000,000 Hz. The display was
-    /// a bit erratic above 5,000,000 Hz, so this became the default,
-    /// even though it might have been the bench-level wiring that posed
-    /// the limit.
+    /// @note The primary effect of this is to recover more CPU cycles
+    ///     for your application code. Keep in mind that when more than
+    ///     one command is sent to the display controller, that it
+    ///     will wait for the controller to finish the prior command.
+    ///     In this case, the performance is limited by the RA8875.
     ///
+    /// @param Hz is the frequency in Hz, tested range includes the
+    ///     range from 1,000,000 (1MHz) to 10,000,000 (10 MHz). Values
+    ///     outside this range will be accepted, but operation may
+    ///     be unreliable.
     /// @returns success/failure code. @see RetCode_t.
     ///
     RetCode_t frequency(unsigned long Hz = RA8875_DEFAULT_SPI_FREQ);
@@ -1220,6 +1225,12 @@
     /// Clear the performance metrics to zero.
     void ClearPerformance();
     
+    /// Count idle time.
+    ///
+    /// @param t is the amount of idle time to accumulate.
+    ///
+    void CountIdleTime(uint32_t t);
+    
     /// Report the performance metrics for drawing functions using
     /// the available serial channel.
     ///
@@ -1337,6 +1348,23 @@
     ///
     RetCode_t select(bool chipsel);
 
+    /// Wait while the status register indicates the controller is busy.
+    ///
+    /// @param mask is the mask of bits to monitor.
+    /// @returns true if a normal exit.
+    /// @returns false if a timeout exit.
+    ///
+    bool _WaitWhileBusy(uint8_t mask);
+
+    /// Wait while the the register anded with the mask is true.
+    ///
+    /// @param reg is the register to monitor
+    /// @param mask is the bit mask to monitor
+    /// @returns true if it was a normal exit
+    /// @returns false if it was a timeout that caused the exit.
+    ///
+    bool _WaitWhileReg(uint8_t reg, uint8_t mask);
+
     /// The most primitive - to write a data value to the SPI interface.
     ///
     /// @param data is the value to write.
@@ -1356,6 +1384,8 @@
     unsigned char spiread();
     
     SPI spi;                        ///< spi port
+    unsigned long spiwritefreq;          ///< saved write freq
+    unsigned long spireadfreq;      ///< saved read freq
     DigitalOut cs;                  ///< chip select pin, assumed active low
     DigitalOut res;                 ///< reset pin, assumed active low
     const unsigned char * font;     ///< reference to an external font somewhere in memory
@@ -1378,6 +1408,7 @@
         METRICCOUNT
     } method_e;
     unsigned long metrics[METRICCOUNT];
+    unsigned long idlecounter;
     void RegisterPerformance(method_e method);
     Timer performance;
     #endif